Вход

Решение симплекс метода с помощью среды Borland C++ Builder Enterprise v6.0

Реферат* по математике
Дата добавления: 28 мая 2006
Язык реферата: Русский
Word, rtf, 1.7 Мб
Реферат можно скачать бесплатно
Скачать
Данная работа не подходит - план Б:
Создаете заказ
Выбираете исполнителя
Готовый результат
Исполнители предлагают свои условия
Автор работает
Заказать
Не подходит данная работа?
Вы можете заказать написание любой учебной работы на любую тему.
Заказать новую работу
* Данная работа не является научным трудом, не является выпускной квалификационной работой и представляет собой результат обработки, структурирования и форматирования собранной информации, предназначенной для использования в качестве источника материала при самостоятельной подготовки учебных работ.
Очень похожие работы



Содержание


Введение

  1. Экономическая постановка задачи

  2. Математическая постановка задачи

  3. Выбор метода реализованной модели. Обоснование выбора

  4. Технические и инструментальные средства обеспечения задачи

    1. Краткая характеристика персонального компьютера и ее программное обеспечение

    2. Обоснование выбора языка программирования

    3. Схема алгоритма и ее описание

  5. Решение задачи теста для написания и отладки программы

  6. Анализ полученных результатов

  7. Инструкция пользователю и описание программы

Заключение

Список литературы

Приложение










Введение



Проникновение математики в экономическую науку связано с преодолением значительных трудностей. В этом отчасти была «виновата» математика, развивающаяся на протяжении нескольких веков в основном в связи с потребностями физики и техники. Но главные причины лежат все же в природе экономических процессов, в специфике экономической науки.

Наиболее распространено понимание системы как совокупность элементов, находящихся во взаимодействии и образующих некоторую целостность, единство. При изучении системы недостаточно пользоваться методом их расчленения на элементы с последующим изучением этих элементов в отдельности. Одна из трудностей экономических исследований – в том, что почти не существует экономических объектов, которые можно было бы рассматривать как отдельные элементы.

Сложность системы определяется количеством входящих в нее элементов, связями между этими элементами, а также взаимоотношениями между системой и средой.

Потенциальная возможность математического моделирования любых экономических объектов и процессов не означает, ее успешной осуществимости при данном уровне экономических и математических знаний, имеющейся конкретной информации и вычислительной техники. И хотя нельзя указать абсолютные границы математической формализуемости экономических проблем, всегда будут существовать еще неформализованные проблемы, а также ситуации, где математическое моделирование недостаточно эффективно.











1 Экономическая постановка задачи



Для пошива одного изделия требуется выкроить из ткани 6 деталей. На швейной фабрике были разработаны два варианта раскройки ткани. В таблице (расположенной ниже) приведены характеристики вариантов раскроя 10 м2 ткани комплектность, т.е. количество деталей определенного вида, которые необходимы для пошива одного изделия. Ежемесячный запас ткани для пошива изделий данного типа составляет 405 м2. В ближайший вечер планируется сшить 90 изделий.

Построить математическую модель задачи, позволяющий в ближайший месяц выполнить план по пошиву с минимальным количеством отходов.


Таблица 1 Характеристики вариантов раскроя отрезков ткани по 10м2


Вариант раскроя

Количество деталей, шт./отрез

Отходы, м2/отрез

1

2

3

4

5

6

1

60

0

90

40

70

90

0,5

2

80

35

20

78

15

0

0,35

Комплектность, шт./изделие

1

2

2

2

2

2





2 Математическая постановка задачи



Переменные задачи


В данной задаче искомые величины явно не указаны, но сказано, что должен быть выполнен ежемесячный план по пошиву 90 изделий. Для пошива 90 изделий в месяц требуется раскроить строго определенное количество деталей. Крой производится из отрезков ткани по 10 м2 двумя различными способами, которое позволяют получить различное число деталей. Поскольку заранее неизвестно, сколько ткани будет раскраиваться первым способом и сколько – вторым, то в качестве искомых величин можно задать количество отрезков ткани по 10м2, раскроенных каждым из способов:

Х1 – количество отрезков ткани по 10м2, раскроенных первым способом в течении месяца, [отрез./мес.];

Х2 – количество отрезков ткани по 10м2, раскроенных первым способом в течении месяца, [отрез./мес.];


Целевая функция


Целью решения задачи является выполнение плана при минимальном количестве отходов. Поскольку количество изделий строго запланировано (90 шт./мес.), то этот параметр не описывает ЦФ, а относится к ограничению, невыполнение которого означает, что задача не решена. А критерием эффективности выполнение плана служит параметр «количество отходов», который необходимо свести к минимуму. Поскольку при раскрое одного отреза (10м2) ткани по 1-му варианту получается 0,5м2 отходов, а по 2-му варианту – 0,35м2 (см. таблицу 1), то общее количество отходов при крое (ЦФ) имеет вид

L(x) = 0.5x1 + 0.35x2 min,

[]


Ограничения


Количество раскроев ткани различными способами ограничивается следующими условиями:

  • Должен быть выполнен план по пошиву изделий, другими словами, общее количество выкроенных деталей должно быть таким, чтобы из него можно было пошить 90 изделий в месяц, а именно: 1-го вида должно быть как минимум 90 и деталей остальных видов – как минимум по 180 (см. комплектность в табл.1).

  • Расход ткани не должен превышать месячного запаса на складе;

  • Количество отрезков раскроенной ткани не может быть отрицательным.

Ограничение по плану пошива пальто имеют следующую содержательную форму записи.


(Общее количество деталей №1 выкроенных по всем вариантам)(90 штук);


(Общее количество деталей №2 выкроенных по всем вариантам)(180 штук);


(Общее количество деталей №6 выкроенных по всем вариантам)(180 штук);


Математически эти ограничения записываются в виде:

60x1 + 80x290;

35x2180;

90x1 + 20x2180;

40x1 + 78x2180;

70x1 + 15x2180;

90x1 180;

Ограничение по расходу ткани имеет следующие формы записи:


Содержательную

(общее количество ткани, раскроенной за месяц)(405м2)


Математическую

Х12

Не отрицательность количества раскроенных отрезков задается в виде

Таким образов, математическая модель задачи имеет вид

L(x) = 0.5x1 + 0.35x2 min [м2отх./мес.],




3 Выбор метода реализованной модели. Обоснование выбора



Пусть мы имеем случай, когда ранг системы меньше числа неизвестных тогда выберем k – переменных в качестве свободных элементов (Х1,Х2,…Хk), а остальные базисные выразим через свободные элементы.



Прировняем к 0 свободные элементы Х1=0, Х2=0, Хк=0 получим решение

Если все значения ? не отрицательна то мы получим допустимое решение, такое решение называется опорным. Нам надо выяснить будет ли оно оптимальным чтобы проверить это подставим свободные переменные в функцию L получим:

При Х1 2 =…=0 получим L=j0

Надо выяснить можно улучшить полученное решение, то есть уменьшить (L) увеличивая какую ни будь переменную Х12…Хn

Может быть два случая:

  1. Если все коэффициенты J1,J2…Jk положительно то мы не сможем уменьшить (L) и найденное решение будет оптимальным.

  2. Если среди коэффициентов J1,J2…Jk есть отрицательный элемент то увеличивая при нем (Х) мы можем улучшить (L).


Идея симплекс – метода заключается в переборе всех допустимых решений и в нахождении такого базисного решения, чтобы значения переменных было оптимальным, то есть последнее будет переходить от одного опорного решения к другому, путем исключения переменных из базисных и переводя их в свободные переменные улучшая каждое следующее опорное решение и достигая оптимального решения.







Таблица 2



Свободный член

X1

X2

X3

X4

Y1

B1

? 11

? 12

? 13

? 14

Y 2

B2

? 21

? 22

? 23

? 24

Y 3

B3

? 31

? 32

? 33

? 34

Y 4

B4

? 41

? 42

? 43

? 44

Y 5

B5

? 51

? 52

? 53

? 54






Выполняя операцию X2 ? Y3, мы хотим в разрешающей строке поместить переменную Y3, а в разрешающем столбце – переменную X2 (это отмечено в таблице 2).

Найдем коэффициенты, которые нужно будет представить в таблице после обмена X2 ? Y3. начнем с преобразования разрешающей строки. Решая уравнение относительно Х2, получим:


Таким образом, преобразованные элементы разрешающей строки найдены. Составим правило преобразования остальных строк. После приведения членов получим:



Нетрудно убедится, что совершенно аналогичным образом преобразовываются все остальные строки. В результате мы получим преобразованную таблицу (смотри таблицу 3), в которой операция X2 ? Y3 уже совершенна.


Рассмотрев таблицу 3, мы можем так сформулировать алгоритм преобразования коэффициентов стандартной таблицы.

  1. Разрешающий элемент заменяется на обратную ему величину.

  2. Все остальные элементы разрешающей строки делятся на разрешающий элемент.

  3. Все элементы разрешающего столбца (кроме самого разрешающего элемента) меняют знак и делятся на разрешающий элемент.

  4. Каждый из остальных элементов подвергается следующему преобразованию: к нему прибавляется произведение элемента, состоявшего в прежней разрешающей строке на том же месте по порядку (то есть в том же столбце), на элемент, стоящий в новом разрешающем столбце на соответствующем месте (то есть в той же строке, что и элемент).



Таблица 3



Свободный член

X1

Y3

X3

X4

Y1

Y2

X2

Y4

Y5



Рассмотрев таблицу 3, мы можем так сформулировать алгоритм преобразования коэффициентов стандартной таблицы.

  1. Разрешающий элемент заменяется на обратную ему величину.

  2. Все остальные элементы разрешающей строки делятся на разрешающий элемент.

  3. Все элементы разрешающего столбца (кроме самого разрешающего элемента) меняют знак и делятся на разрешающий элемент.

  4. Каждый из остальных элементов подвергается следующему преобразованию: к нему прибавляется произведение элемента, состоявшего в прежней разрешающей строке на том же месте по порядку (то есть в том же столбце), на элемент, стоящий в новом разрешающем столбце на соответствующем месте (то есть в той же строке, что и элемент).


Алгоритм преобразования Xj ? Yi стандартной таблицы сводится при этом к следующим операциям.

  1. Выделить в таблице разрешающий элемент ?ij. Вычислить его обратную величину ?=1/ ?ij и записать в нижней части той же ячейки (в правом нижнем углу).

  2. Все элементы разрешающей строки (кроме самого ?ij) умножить на ?; результат записать в нижней части той же ячейки.

  3. Все элементы разрешающего столбца (кроме самого ?ij) умножить на – ?; результат записать в нижней части той же ячейки.

  4. Подчеркнуть (или выделить любым другим способом) в разрешающей строке все верхние числа (старые элементы), за исключением самого разрешающего элемента ячейки, а в разрешающем столбце – все нижние числа (новые элементы), за исключением самого разрешающего элемента.

  5. Для каждого из элементов, не принадлежащих ни к разрешающей строке, ни к разрешающему столбцу, записать в нижнюю часть ячейки произведение выделенных чисел, стоящих в том же столбце и в той же строке, что и данный элемент.

  6. Переписать таблицу, заменив;

    • Xj на Yi и обратно,

    • Элементы разрешающей строки и столбца – числами, стоящими в нижних частях той же ячейки,

    • Каждый из остальных элементов заменить суммой чисел стоящих в верхней и нижней части той же ячейки.


В задаче линейного программирования, кроме уравнений-ограничений, существует еще и линейная функция

которую нужно минимизировать. Если эта функция выражена через прежние свободные переменные X1,X2,…,Xn, то, очевидно, после замены Xj ? Yi ее нужно выразить через новые свободные переменные X1, X2,…, Xj-1, Yi, Xj+1,…, Xn. Нетрудно убедится, что для этого может быть применен тот же алгоритм, что и для преобразования любой строки стандартной таблицы. Приводя L к стандартной форме

,

где Y1= - c1

Y2= - c2

………

Yn= -cn

мы получим еще одну строку стандартной таблицы, которая отличается от остальных только тем, что в ней никогда не выбирается разрешающий элемент. С помощью табличного обмена переменных в уравнениях ЗЛП можно решить любую задачу линейного программирования.

Нахождение решения каждой задачи линейного программирования распадается на два этапа:

  • Отыскание опорного решения;

  • Отыскание оптимального решения, минимизирующего линейную функцию L.


отыскиние опорного решения основной задачи линейного программирования.


Пусть имеется ОЗЛП с ограничениями – равенствами, записанными в стандартной форме:

(1) (обращение в тексте)


В каждой вершине опорного решения, по крайней мере, n переменных должны обращаться в нуль. Попробуем получить опорное решение, пологая в формулах (1) все свободные переменные равными нулю.

Имеем:

X1 = X2 = … = Xn = 0;

Y1 = b1;

Y2 = b2;

………………………

Ym = bm.

Нужно так обменивать местами базисные и свободные переменные, чтобы эта процедура приближала нас к границе опорного решения, а не удаляла нее, то есть, чтобы число отрицательных свободных членов с каждым шагом убывало, или, если число отрицательных свободных членов остается прежним, то, по крайней мере, убывали их абсолютные величины.

Существует ряд способов выбора разрешающего элемента для приближения к опорному решению.


отыскание оптимального решения основной задачи линейного программирования. (озлп)


в предыдущем разделе искали опорное решение системы уравнений ОЗЛП. Теперь мы будем заниматься оптимизацией решения, то есть отысканием такого опорного решения, которое обращает в минимум линейную функцию.

Увеличение переменной, соответствующий данному столбцу, уменьшает линейную функцию L и не может сделать ни одной из базисных переменных отрицательной, значит, ничто не препятствует неограниченному уменьшению функции L.

Правила нахождения оптимального решения ОЗЛП симплекс – методом.

  1. если все свободные члены в симплекс таблице не отрицательны, а в строке L нет ни одного положительного элемента, то оптимальное решение достигнуто.

  2. если в строке L есть положительный элемент, а в столбце, соответствующее ему, нет ни одного положительного элемента, то линейная функция L не ограничена с низу, и оптимального решения не существует.

  3. если в этом столбце есть положительные элементы, то следует произвести одной из свободных переменных на одну из базисных, причем в качестве разрешающего надо взять тот элемент этого столбца, для которого отношение к нему соответствующего свободного члена минимально.


В заключении остановимся на так называемом «вырожденном» случае, когда один (или более) свободных членов в уровнениях-ограничениях получается равным нулю. Это означает, что в данном опорном решении обращаются в нуль не только свободные переменные, но и некоторые из базисных.






4 Технические и инструментальные средства обеспечения задачи



    1. Краткая характеристика персонального компьютера и ее программное обеспечение


Процессор: AMD Atlon XP +1900

Операционная система: 256 Mb

Материнская плата: EliteGroup VIAK7VTA3

HDD: Siget.Baracuda 80 Gb 7200

FDD: Mitsumi 3.5

Vidio: nVidia GeForse MX440 64 Mb

Монитор: Samsung SynsMaster 755 DFX 17”

Клавиатура: Genius 102 клав.

Мышка: Genius optical

Системный блок: ATX

Блок питания: 256Вт


4.2 Обоснование выбора языка программирования


Borland C++ Builder 6 – очередная версия системы объектно – ориентированного программирования для 32-разрядных операционных систем Microsoft Windows. Интегрированная среда системы (Integrated Development Environment, IDE) обеспечивает продуктивность многократного использования визуальных компонентов в сочетании с усовершенствованными инструментами и разномасштабными средствами доступа к базам данных. Основное предназначение IDE – радикально ускорит производительный цикл разработки сложнейших программных проектов для различных областей применения.

Стандарты пользовательских интерфейсов меняются и развиваются также быстро, как и операционные системы. Открытость среды IDE позволяет настраивать ее с учетом наиболее модных тенденций в области графических интерфейсов. Разработчик имеет перед глазами хороший образец того, что можно сделать в смысле построения пользовательского интерфейса. На самом деле среда IDE создана с помощью C++ Builder, поэтому все, что вы видите на экране, вы сможете сделать сами. Визуальный интерфейс сочетает в себе простоту использования для новичка и богатство возможности для профессионала.

Среди множества нововведений следует особо отметить эффективность средства для поддержки web – служб и разработки переносимых проектов. Технологии DataSnap, WebServices и WebSnap дают возможность быстро и легко создать и интегрировать сетевые приложения (как персональные, так и коллективные). Клиентские и серверный модули распределенного приложения

обмениваются XML – илиWSDL – документами в рамках транспортных протоколов TCP/IP, HTTP, SOAP. Библиотека компонентов CLX обеспечивает переносимость исполняемого кода между платформами Windows и Linux. CLX – приложения совместимы на уровне языка С++ с программными продуктами, которые корпорация Borland планирует выпускать для операционной системы Linux.

Система C++ Builder может быть использованы везде, где требуется дополнить существующие приложения (как прикладные, так и системные) расширенным стандартом языка С++, повысить быстродействие и надежность программ, придать пользовательскому интерфейсу качество профессионального уровня.

Для установки системы необходим персональный компьютер в следующей конфигурации:

  • Процессор Intel Pentium с тактовой частотой не ниже 166 МГц;

  • Операционная система Microsoft Windows 98/ Millennium (Me)/ NT/ 2000/ XP;

  • Оперативная память не менее 128 Мбайт, рекомендуется 256 Мбайт;

  • До 750 Мбайт свободного пространства на жестком доске, в зависимости от выбранных параметров установки;

  • Дисковод для компакт – дисков;

  • Видеоадаптер с разрешением не хуже, чем в стандарте SVGA;

  • Сетевой адаптер;

  • Мышь Оли другой координатный манипулятор.






















4.3 Схема алгоритма и ее описание





ОПИСАНИЕ АЛГОРИТМА

  1. Начало программы

  2. Ввод размерности матрицы

  3. Формирование симплекс таблицы

  4. Создание объекта класса TSimplex

  5. Ввод данных в таблицу

  6. Расчет симплекс-метода

  7. Вывод полученных результатов

  8. Конец программы




5 Решение задачи теста для написания и отладки программы




6 Анализ полученных результатов



Решая задачу двумя способами (на персональном компьютере и вручную) я получил почти одинаковые решения, только на персональном компьютере ответы получились намного точнее (до 0,0001), а вручную приходилось округлять. Также решение на персональном компьютере было проще и меньше затрачено времени, в отличии от ручного варианта.

(написать результаты, сделать анализ, какой товар выгоднее выпускать, написать рекомендации к фирме по выпуску определенной продукции)


7 Инструкция пользователю и описание программы



Для работы с этой программой нужно прочитать инструкцию. Для того чтобы открыть эту программу необходимо запустить Project1.exe .

Чтобы заполнить таблицу вначале необходимо нажать в пункте меню кнопку файл, как показано на рисунке 1;



Рисунок 1 «начало работы с программой»


после того, как нажмете кнопку файл, необходимо выбрать пункт меню «новый»,как показано на рисунке 2;



Рисунок 2 «заполнение таблицы»


После нажатия пункта меню «новый» выскочит окно «Исходные данные», в этом окне необходимо задать размерность матрицы и, что ищем, то есть «минимум» или «максимум».



Рисунок 3 «ввод исходных данных»


После того, как заполнили таблицу, нажимаем кнопку «симплекс метод» и в пункте мену затем нажимаем кнопку «рассчитать».



Рисунок 4 «кнопка для начала расчетов»


На рисунках 5, 6, 7 показывается, как вычисляется таблица, а на рисунке 8 показан окончательный ответ


Рисунок 5 Рисунок 6 Рисунок 7 Рисунок 8 «ответ»





Заключение



В данной работе я попытался, как можно сильнее упростить и уменьшить затраты времени для решения симплекс - метода.

Для решения данной задачи была использована среда Borland C++ Builder Enterprise v6.0.



Список литературы



    1. Акоф Р. Сасиени М. Основы исследования операции. М.:Мир, 1971год;

    2. Акулич И.Л. Математическое программирование в примерах и задачах. М.: Высшая школа, 1986год;

    3. Таха Х.А. Введение в исследование операций. М.: Издательский дом «Вильямс» 2001 год;

    4. Эддоус М., Стенсвилд Р. Методы принятия решения. М.: ЮНИТИ, 1997год.












ПРИЛОЖЕНИЕ


ЛИСТИНГ ПРОГРАММЫ


#include

#pragma hdrstop

//---------------------------------------------------------------------------

#include "Simplex.h"

//---------------------------------------------------------------------------

_fastcall TSimplex::TSimplex(int r, int c, bool mm)

{

Splan = new float*[r]; //создаем массив Splan

for (int j = 0; j < r; j++)

Splan[j] = new float[c];


Bplan = new float*[r]; //создаем массив Bplan

for (int j = 0; j < r; j++)

Bplan[j] = new float[c];


CContr = new int*[c];


row = r-1; col = c-1; minmax = mm;

}

//---------------------------------------------------------------------------

_fastcall TSimplex::~TSimplex()

{

for(int i = 0; i < row+1; i++) //удаляем массив Splan

delete[] Splan[i];

delete[] Splan;


for(int i = 0; i < row+1; i++) //удаляем массив Bplan

delete[] Bplan[i];

delete[] Bplan;


delete[] CContr;

}

//---------------------------------------------------------------------------

void TSimplex::FindRazrElem()

{

float cmin; //впомогательные переменные

float rmin;

float f1;

float f2;


Rcol = 0;

for(int c = 0; c <= col; c++)

{

for(int i = 1; i <= col; i++)

{

if(CContr[i] == 1)

if(Splan[i][0] > 0 && Rcol == 0) //если текущий елемент контрольного массива

{

cmin = Splan[i][0];

Rcol = i;

CContr[i] = 0;

} //неравен 0 и текущий елемент Splan > 0 и Rcol == 0, то

else //иначе

if(Splan[i][0] < cmin && Splan[i][0] > 0)

{

min = Splan[i][0];

Rcol = i;

CContr[i] = 0;

}

}


ShowMessage(FloatToStr(Splan[Rcol][0]));


Rrow = 0;

if(Rcol > 0)

for(int j = 1; j <= row; j++) //предидущего положительного елемента, то

if(Splan[Rcol][j] != 0 && (Splan[0][j]/Splan[Rcol][j]) > 0) //если текущее отношение положительно и //Rrow == 0, то

if(Rrow == 0 || (Splan[0][j]/Splan[Rcol][j]) > 0)

{

Rrow = j;

}

else

if((Splan[0][j]/Splan[Rcol][j]) > 0 && f1 > Splan[0][j]/Splan[Rcol][j])

{

f1 = Splan[0][j]/Splan[Rcol][j];

Rrow = j;

}

}

ShowMessage(IntToStr(Rcol) + " " + IntToStr(Rrow));

}

//---------------------------------------------------------------------------

void TSimplex::HTML()

{


}

//---------------------------------------------------------------------------

void TSimplex::Simplex()

{ CContr[0] = 0;

int count = 0;

int countmin = 0;

for(int i = 1; i <= col; i++)

{

CContr[i] = (int*)1;

}


FindRazrElem();


for(int i = 0; i <= col; i++) //основной цикл расчета

{

if(Rcol != 0 && Rrow != 0) //если мы нашли разрешающий элемент, то

{ lambda = Splan[Rcol][Rrow]; //вычисляем лямбду

for(int j = 0; j <= col; j++) //расчитываем симплекс-таблицу

for(int i = 0; i <= row; i++)

{

if(j == Rcol && i == Rrow)

Bplan[j][i] = lambda;

else

if(j == Rcol && i != Rrow)

Bplan[j][i] = Splan[j][i] * (-lambda);

else

if(j != Rcol && i == Rrow)

Bplan[j][i] = Splan[j][i] * lambda;

else

Bplan[i][j] = Splan[j][Rrow] * (Splan[Rcol][i] * (-lambda)) + Splan[j][i];

CContr[j] = (int*)1;

}

for(int j = 0; j <= col; j++) //меняем таблицы местами

for(int i = 0; i <= row; i++)

Splan[j][i] = Bplan[j][i];


for(int j = 0; j <= col; j++) //проверяем функцию цели

if(Splan[j][0] < 0)

countmin++;

}

for(int j = 0; j <= col; j++) //проверяем остались ли не использованые столбцы

if(CContr[j] == 0)

count++;

if(count != col || countmin !=col) //если столбцы остались находим новый разрешающий елемент

FindRazrElem();

else

if(count == col)

ShowMessage("Решений нет");

else

if(countmin == col)

ShowMessage("Решение найденно");

}

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

#ifndef SimplexH

#define SimplexH

//---------------------------------------------------------------------------

class TSimplex

{

public: //массивы

float **Splan; //основной динамический массив

float **Bplan; //дополнительный динамический массив

int **CContr; //динамический массив контрольных столбцов

//переменные

int row, col; //количество строк и столбцов в С-таблице

float lambda; //лямбда

int Rrow, Rcol; //номер разрешающих строки и столбца

bool minmax; //условие поиска решения (минимум или максимум)

//функции

void FindRazrElem(); //функция поиска разрешающего элемента

void HTML(); //функция вывода в html-файл

void Simplex(); //основная функция просчета с-метода

//конструкторы и деструкторы

_fastcall TSimplex(int r, int c, bool mm);

_fastcall ~TSimplex();

};

//---------------------------------------------------------------------------

#endif


#include

#pragma hdrstop

//---------------------------------------------------------------------------

#include "Simplex.h"

//---------------------------------------------------------------------------

_fastcall TSimplex::TSimplex(int r, int c, bool mm)

{

Splan = new float*[r]; //создаем массив Splan

for (int j = 0; j < r; j++)

Splan[j] = new float[c];


Bplan = new float*[r]; //создаем массив Bplan

for (int j = 0; j < r; j++)

Bplan[j] = new float[c];


CContr = new int*[c];


row = r-1; col = c-1; minmax = mm;

}

//---------------------------------------------------------------------------

_fastcall TSimplex::~TSimplex()

{

for(int i = 0; i < row+1; i++) //удаляем массив Splan

delete[] Splan[i];

delete[] Splan;


for(int i = 0; i < row+1; i++) //удаляем массив Bplan

delete[] Bplan[i];

delete[] Bplan;


delete[] CContr;

}

//---------------------------------------------------------------------------

void TSimplex::FindRazrElem()

{

float cmin; //впомогательные переменные

float rmin;

float f1;

float f2;


Rcol = 0;

for(int c = 0; c <= col; c++)

{

for(int i = 1; i <= col; i++)

{

if(CContr[i] == (int*)1)

if(Splan[i][0] > 0 && Rcol == 0) //если текущий елемент контрольного массива

{

cmin = Splan[i][0];

Rcol = i;

CContr[i] = 0;

} //неравен 0 и текущий елемент Splan > 0 и Rcol == 0, то

else //иначе

if(Splan[i][0] < cmin && Splan[i][0] > 0)

{

cmin = Splan[i][0];

Rcol = i;

CContr[i] = 0;

}

}


ShowMessage(FloatToStr(Splan[Rcol][0]));


Rrow = 0;

if(Rcol > 0)

for(int j = 1; j <= row; j++) //предидущего положительного елемента, то

if(Splan[Rcol][j] != 0 && (Splan[0][j]/Splan[Rcol][j]) > 0) //если текущее отношение положительно и //Rrow == 0, то

if(Rrow == 0 || (Splan[0][j]/Splan[Rcol][j]) > 0)

{

Rrow = j;

}

else

if((Splan[0][j]/Splan[Rcol][j]) > 0 && f1 > Splan[0][j]/Splan[Rcol][j])

{

f1 = Splan[0][j]/Splan[Rcol][j];

Rrow = j;

}

}

ShowMessage(IntToStr(Rcol) + " " + IntToStr(Rrow));

}

//---------------------------------------------------------------------------

void TSimplex::HTML()

{


}

//---------------------------------------------------------------------------

void TSimplex::Simplex()

{ CContr[0] = 0;

int count = 0;

int countmin = 0;


for(int i = 1; i <= col; i++)

{

CContr[i] = (int*)1;

}


FindRazrElem();


for(int i = 0; i <= col; i++) //основной цикл расчета

{

if(Rcol > 0 && Rrow > 0) //если мы нашли разрешающий элемент, то

{ lambda = Splan[Rcol][Rrow]; //вычисляем лямбду

for(int j = 0; j <= col; j++) //расчитываем симплекс-таблицу

for(int i = 0; i <= row; i++)

{

if(j == Rcol && i == Rrow)

Bplan[j][i] = lambda;

else

if(j == Rcol && i != Rrow)

Bplan[j][i] = Splan[j][i] * (-lambda);

else

if(j != Rcol && i == Rrow)

Bplan[j][i] = Splan[j][i] * lambda;

else

Bplan[i][j] = Splan[j][Rrow] * (Splan[Rcol][i] * (-lambda)) + Splan[j][i];

CContr[j] = (int*)1;

}

for(int j = 0; j <= col; j++) //меняем таблицы местами

for(int i = 0; i <= row; i++)

Splan[j][i] = Bplan[j][i];


for(int j = 0; j <= col; j++) //проверяем функцию цели

if(Splan[j][0] < 0)

countmin++;

}

for(int j = 0; j <= col; j++) //проверяем остались ли не использованые столбцы

if(CContr[j] == 0)

count++;

if(count != col || countmin !=col) //если столбцы остались находим новый разрешающий елемент

FindRazrElem();

else

if(count == col)

ShowMessage("Решений нет");

else

if(countmin == col)

ShowMessage("Решение найденно");

}

}

//---------------------------------------------------------------------------


//---------------------------------------------------------------------------

#ifndef SimplexH

#define SimplexH

//---------------------------------------------------------------------------

class TSimplex

{

public: //массивы

float **Splan; //основной динамический массив

float **Bplan; //дополнительный динамический массив

int *CContr; //динамический массив контрольных столбцов

//переменные

int row, col; //количество строк и столбцов в С-таблице

float lambda; //лямбда

int Rrow, Rcol; //номер разрешающих строки и столбца

bool minmax; //условие поиска решения (минимум или максимум)

//функции

void FindRazrElem(); //функция поиска разрешающего элемента

void HTML(); //функция вывода в html-файл

void Simplex(); //основная функция просчета с-метода

//конструкторы и деструкторы

_fastcall TSimplex(int r, int c, bool mm);

_fastcall ~TSimplex();

};

//---------------------------------------------------------------------------

#endif


//---------------------------------------------------------------------------


#include

#pragma hdrstop


#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TSTable *STable;

//---------------------------------------------------------------------------

__fastcall TSTable::TSTable(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TSTable::N13Click(TObject *Sender)

{

Data->Visible = true;

STable->Enabled = false;

}

//---------------------------------------------------------------------------

void __fastcall TSTable::N10Click(TObject *Sender)

{

About->MediaPlayer1->FileName = "Test_Music.wav"; //поменять местами

About->MediaPlayer1->Open();

About->MediaPlayer1->Play();

STable->Enabled = false;

About->Visible = true;

}

//---------------------------------------------------------------------------

void __fastcall TSTable::N6Click(TObject *Sender)

{

TSimplex *Smp = new TSimplex(row, col, mm); //создаем объект класса TSimplex


for(int i = 0; i <= col-1; i++)

for(int j = 0; j <= row-1; j++)

{ Smp->Splan[i][j] = StrToFloat(SMT->Cells[i+1][j+1]); //вводим значения массива

ShowMessage(SMT->Cells[i+1][j+1]);}

Smp->Simplex();

Smp->~TSimplex();

}

//---------------------------------------------------------------------------


void __fastcall TSTable::N4Click(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include

#include

#include

#include

#include

#include

#include

//---------------------------------------------------------------------------

#include "Simplex.h"

#include "Unit2.h"

#include "Unit3.h"

//---------------------------------------------------------------------------

class TSTable : public TForm

{

__published: // IDE-managed Components

TMainMenu *MainMenu1;

TStringGrid *SMT;

TStatusBar *StatusBar1;

TMenuItem *N1;

TMenuItem *N2;

TMenuItem *N3;

TMenuItem *N4;

TMenuItem *N5;

TMenuItem *N6;

TMenuItem *N7;

TMenuItem *N8;

TMenuItem *N9;

TMenuItem *N10;

TMenuItem *N11;

TMenuItem *N12;

TMenuItem *N13;

void __fastcall N13Click(TObject *Sender);

void __fastcall N10Click(TObject *Sender);

void __fastcall N6Click(TObject *Sender);

void __fastcall N4Click(TObject *Sender);

private: // User declarations

public:

int row, col; //кол-во столбцов и строк

bool mm; //минимум или максимум

__fastcall TSTable(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TSTable *STable;

//---------------------------------------------------------------------------

#endif


//---------------------------------------------------------------------------


#include

#pragma hdrstop


#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TSTable *STable;

//---------------------------------------------------------------------------

__fastcall TSTable::TSTable(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TSTable::N13Click(TObject *Sender)

{

Data->Visible = true;

STable->Enabled = false;

}

//---------------------------------------------------------------------------

void __fastcall TSTable::N10Click(TObject *Sender)

{

About->MediaPlayer1->FileName = "Test_Music.wav"; //поменять местами

About->MediaPlayer1->Open();

About->MediaPlayer1->Play();

STable->Enabled = false;

About->Visible = true;

}

//---------------------------------------------------------------------------

void __fastcall TSTable::N6Click(TObject *Sender)

{

TSimplex *Smp = new TSimplex(col, row, mm); //создаем объект класса TSimplex


for(int i = 0; i <= col-1; i++)

for(int j = 0; j <= row-1; j++)

{ Smp->Splan[i][j] = StrToFloat(SMT->Cells[i+1][j+1]); //вводим значения массива

ShowMessage(SMT->Cells[i+1][j+1]);}

Smp->Simplex();

Smp->~TSimplex();

}

//---------------------------------------------------------------------------


void __fastcall TSTable::N4Click(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------


© Рефератбанк, 2002 - 2024