Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Двойственный симплекс-метод

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 15.5.2024


СОДЕРЖАНИЕ

ВВЕДЕНИЕ………………………………………………………………..….

1 ОБЩАЯ ЧАСТЬ…………………………………………………..………..

1.1 Описание предметной области……………………………..………..

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

2 СПЕЦИАЛЬНАЯ ЧАСТЬ…………………………………………...……….

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

2.2 Реализация модели математическим методом ...……………………

2.3 Структурная и функциональная схемы программы…………..……

2.4 Описание процедур, функций и модулей...…..…………..…………

2.5 Таблица идентефикаторов…...……………………………………….

 ЗАКЛЮЧЕНИЕ…………………………………………………….……...….

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………..

 ПРИЛОЖЕНИЯ

ПРИЛОЖЕНИЕ А Техническое задание ……………………..….…………..

ПРИЛОЖЕНИЕ Б Руководство пользователя…………………….………….

ПРИЛОЖЕНИЕ В Листинг программы……………………………………….

ПРИЛОЖЕНИЕ Г Контрольный пример……………………………………...

ВВЕДЕНИЕ

Методология моделирования долгое время развивалась независимо отдельными науками. Отсутствовала единая система понятий, единая терминология. Лишь постепенно стала осознаваться роль моделирования как универсального метода научного познания. Термин "модель" широко используется в различных сферах человеческой деятельности и имеет множество смысловых значений. Модель - это такой материальный или мысленно представляемый объект, который в процессе исследования замещает объект-оригинал так, что его непосредственное изучение дает новые знания об объекте-оригинале.

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

Процесс моделирования включает три элемента:

  •  субъект (исследователь),
  •  2) объект исследования,
  •  3) модель, опосредствующую отношения познающего субъекта и познаваемого объекта.

Симплекс-метод является основным в линейном программировании. Решение задачи начинается с рассмотрений одной из вершин многогранника условий. Если исследуемая вершина не соответствует максимуму (минимуму), то переходят к соседней, увеличивая значение функции цели при решении задачи на максимум и уменьшая при решении задачи на минимум. Таким образом, переход от одной вершины к другой улучшает значение функции цели. Так как число вершин многогранника ограничено, то за конечное число шагов гарантируется нахождение оптимального значения или установление того факта, что задача неразрешима.

Этот метод является универсальным, применимым к любой задаче линейного программирования в канонической форме. Система ограничений здесь - система линейных уравнений, в которой количество неизвестных больше количества уравнений. Если ранг системы равен r, то мы можем выбрать r неизвестных, которые выразим через остальные неизвестные. Для определенности предположим, что выбраны первые, идущие подряд, неизвестные X1, X2, ..., Xr.

Тогда наша система уравнений может быть записана как:

      

Базисное решение называется допустимым базисным решением или опорным решением, если в нем значения переменных неотрицательны. Если в качестве базисных взяты переменные X1, X2, ..., Xr, то решение {b1, b2,..., br, 0, ..., 0} будет опорным при условии, что b1, b2,..., br ≥ 0.

Математическая модель данной задачи имеет вид

Z(X) = c1 x1 + c2x2 + ... + сnхnmax 

Xj>0,    j = 1, 2, ..., n.                                          

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

1 ОБЩАЯ ЧАСТЬ

1.1 Описание предметной области

Теоремы двойственности позволяют установить взаимосвязь между оптимальными решениями пары двойственных задач. Решив одну из пары двойственных задач, можно или найти оптимальное решение другой задачи, не решая ее, или установить его отсутствие. Возможны следующие случаи: 1) обе задачи из пары двойственных имеют оптимальные решения; 2) одна из задач не имеет решения ввиду неограниченности целевой функции, а другая - ввиду несовместности системы ограничений.

Двойственный симплекс-метод можно применять при решении задачи линейного программирования, свободные члены системы уравнений которой могут быть любыми числами. В обычном симплексном алгоритме план всегда должен быть допустимым. Допустимый план — это такой план, который удовлетворяет всем ограничениям задачи при обязательном условии неотрицательности неизвестных, то есть любые числа в итоговом столбце положительны. План называется недопустимым (или условно-оптимальным), если в итоговом столбце имеются отрицательные числа, зато оценки целевой строки соответствуют целевой функции, то есть являются положительными при решении на максимум и отрицательными при решении на минимум. В процессе решения двойственным методом план является недопустимым. При использовании двойственного метода сначала применяют обычную симплекс-процедуру и добиваются того, чтобы все оценки соответствовали цели решения задачи, причем пока не обращают внимания на знаки чисел в итоговом столбце. Только когда такой условно-допустимый план достигнут, смотрят на эти знаки. Если в итоговом столбце оказались отрицательные числа, план изменяется так, чтобы недопустимость уменьшилась, а затем и исчезла, но чтобы двойственные оценки продолжали соответствовать при этом цели решения задачи. Возможность придавать в процессе решения отрицательные значения неизвестным, входящим в план, в случае, если ограничения заданы неравенствами, позволяет избавиться от искусственных неизвестных, это сокращает размеры задачи, а значит, и вычислений

Алгоритм двойственного симплексного метода таков, что, как только почти допустимое опорное решение становится допустимым, оно становится также оптимальным.

Составление двойственной задачи включает в себя следующие пункты:

1. Тип оптимума меняется на противоположный, т. е. максимум на минимум, и наоборот.

2. Вектор коэффициентов целевой функции с и столбец ограничений b меняются местами.

3. Матрица ограничений задачи A транспонируется.

4. Множество индексов переменных, на которые наложено условие неотрицательности в прямой задаче (например, хj ≥ 0 или uj ≥ 0), определяют номера ограничений, имеющих форму неравенств в двойственной задаче (aju ≥ сj или aix ≤ bj).

5. Множество номеров ограничений, имеющих форму неравенств в прямой задаче (например, aix ≤ bj или aju ≥ сj), определяют множество индексов переменных, на которые накладывается условие неотрицательности, в двойственной задаче (ui ≥ 0 или xi ≥ 0).

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

При условиях:

где  - заданные постоянные величины и .

Функция (9.1) называется целевой функцией (или линейной формой) задачи (9.1)-(9.4), а условия (9.2)-(9.4) – ограничениями данной задачи.

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

                                              

При выполнении условий:

Где:

   .

Если в опорном плане существует хотя бы одна отрицательная координата xi0 и при этом не существует ни одного отрицательного коэффициентах xij разложений векторов-условий Aj, j=1,2, …, n, то задача не имеет решения ввиду несовместности системы ограничений.

Пусть в результате эквивалентных преобразований системы уравнений-ограничений задачи некоторое уравнение приняло вид:

xi0 = xl1x1 + xl2x2 + … + xinxn, где xi0 < 0, a xij ≥ 0  Vj.                        

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

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

1.  Привести задачу к каноническому виду.

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

3. Если ПДОР не имеет отрицательных координат, то оно является допустимым и оптимальным (по теореме 1.3). Решение задачи заканчивается.

4. Если ПДОР имеет отрицательную координату хi0 < 0, для которой соответствующие коэффициенты разложений всех векторов-условий неотрицательны (хij > 0   Vy), то задача не имеет решения ввиду несовместности системы ограничений. Решение задачи прекращается.

5.  Если хотя бы одна координата ПДОР отрицательна, т.е. хi0 < 0, и при этом найдется хотя бы один отрицательный коэффициент хij разложений векторов-условий Аj по базису решения, то переходят к новому решению, на котором значение целевой функции будет ближе к оптимальному. Номер вектора Аk, вводимого в базис, определяется с использованием параметра

Ө0i = min{|Δj/xij|} = |Δk/xik| ,                                                            

 xij < 0                                                                                           

Номер вектора Аi, выводимого из базиса, находится из условия min{xi0 Ө0i} в задаче на максимум или из условия max{-хi0 Ө0i} в задаче на минимум.

Далее возвращаются к пункту 3 данного алгоритма.

Оптимальные значения переменных двойственной задачи линейного программирования как объективно обусловленные оценки позволяют сопоставлять затраты на выпуск продукции и доход от ее реализации.

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

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

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

Мечта программистов о среде программирования, в которой бы простота и удобство сочетались с мощью и гибкостью, стала реальностью с появлением среды Delphi. Она обеспечивала визуальное проектирование пользовательского интерфейса, имела развитый объектно-ориентированный язык Object Pascal (позже переименованный в Delphi) и уникальные по своей простоте и мощи средства доступа к базам данных. Язык Delphi по возможностям значительно превзошел язык Basic и даже в чем-то язык C++, но при этом он оказался весьма надежным и легким в изучении (особенно в сравнении с языком C++). В результате, среда Delphi позволила программистам легко создавать собственные компоненты и строить из них профессиональные программы. Среда оказалась настолько удачной, что по запросам любителей C++ была позже создана среда C++Builder — клон среды Delphi на основе языка C++ (с расширенным синтаксисом).

Среда Delphi стала, по сути, лучшим средством программирования для операционной системы Windows, но программистов ждало разочарование, если возникало желание перенести программу в другую операционную систему, в частности, в операционную систему Unix.

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

Алфавит Delphi составляют:

  •  Прописные и строчные буквы латинского алфавита
  •  Десятичные цифры  
  •  Специальные символы: + - *  / > < =  ;  #  ‘ , . : {} [] ( )  
  •  Комбинации    специальных    символов,    которые   нельзя   разделять пробелами, если они используются как знаки операций: «:=», «..», «<>», «<=», «>=», «{}».  
  •  Неделимые последовательности знаков алфавита образуют слова, отделенные друг от друга разделителями. Ими  могут быть пробел, комментарий или символ конца строки.

Словарь Delphi можно разделить на три группы слов:     

  •  зарезервированные  
  •  слова, стандартные идентификаторы
  •  идентификаторы пользователя.

Зарезервированные слова  имеют фиксированное написание и навсегда определенный смысл. Они не могут изменяться программистом и их нельзя

использовать в качестве имен для обозначения величин.

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

2 СПЕЦИАЛЬНАЯ ЧАСТЬ

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

Компания производит полки для ванных комнат двух размеров - А и В. Агенты по продаже считают, что в неделю на рынке может быть реализовано до 550 полок. Для каждой полки типа А требуется 2 м2 материала, а для полки типа В - 3 м2 материала. Компания может получить до 1200 м материала в неделю. Для изготовления одной полки типа А требуется 12 мин машинного времени, а для изготовления одной полки типа В - 30 мин; машину можно использовать 160 час в неделю. Если прибыль от продажи полок типа А составляет 3 денежных единицы, а от полок типа В - 4 ден. ед., то сколько полок каждого типа следует выпускать в неделю?

Исходные данные представлены в таблице 1.

     Таблица 2.1.1 –                                                          Исходные данные

Базис

План

x1

x2

x3

x4

x5

х3

550

1

1

1

0

0

х4

1200

2

3

0

1

0

х5

9600

12

30

0

0

1

f

0

-3

-4

0

0

0

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

Математическая формулировка задачи включает:

Переменные, подлежащие оптимизации:  

xa – виды выпускаемой продукции (полок),   

xb – виды затрат на производство продукции (Время, сырье, работа),

Целевую функцию:

f = 3х1 + 4х2 ^ max, х1 + х2 < 550,

2х1+ 3х2 < 1200,

12х1+ 30х2 < 9600, х1> 0, х2>0.

Ограничения:

х1 + х2 < 550 - в неделю на рынке может быть реализовано до 550 полок.

2х1 + 3х2 < 1200 - Затраты материала

12х1 + 30х2 < 9600 - Затраты машинного времени

2.2 Реализация модели математическим методом

Для построения общего метода решения задачи ЛП все модели должны быть представлены в канонической (стандартной) форме, которая удовлетворяет следующим условиям:

1) все  ограничения   и  целевая  функция  должны  быть  записаны  в  виде равенств с неотрицательной правой частью;

2) значения всех переменных модели должны быть неотрицательны;

3) целевая функция подлежит максимизации или минимизации, где  

 xj - вспомогательные   переменные, включаемые в уравнения ограничений

(остаточные для неравенства типа  ≤ и избыточные для неравенства типа ≥) для приведения неравенств к виду равенств.

Соответствующая линейная модель, приведенная к стандартной (канонической) форме имеет следующий вид:

3х1 + 4х2 -> max.

х1 + х2 < 550

2х1 + 3х2 < 1200

12х1 + 30х2 < 9600.

х3, х4, х5 – дополнительные переменные.

Таким образом, приходим к задаче линейного программирования.

f = 3х1 + 4х2 ^ max, х1 + х2 < 550,

2х1+ 3х2 < 1200,

12х1+ 30х2 < 9600, х1> 0, х2>0 , х3>0, х4>0, х5>0.

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

Решение:

F=3x1+4x2->max

x1+x2<=550

2x1+3x2<=1200

12x1+30x2<=9600

F=3x1+4x2+0x3+0x4+0x5->max

550/1=550

1200/3=400

9600/30=320

В качестве опорного плана выберем X0=(0, 0, 550, 1200, 9600).  Произведем вычисления:

 

Составим симплекс-таблицу (Таблица 2.2.1).

Таблица 2.2.1-              Таблица результатов

Базис

План

x1

x2

x3

x4

x5

х3

230

3/5

0

1

0

-1/30

х4

240

4/5

0

0

1

-1/10

х2

320

2/5

1

0

0

1/30

f

1280

-7/5

0

0

0

2/15

 

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

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

       

 Составим симплекс-таблицу (Таблица 2.2.2).

Таблица 2.2.2-                                                               Таблица результатов

Базис

План

x1

x2

x3

x4

x5

x3

50

0

0

1

-3/4

1/24

x1

300

1

0

0

5/4

-1/8

x2

200

0

1

0

-1/2

1/12

f

1700

0

0

0

7/4

-1/24

В нижней строчке по прежнему присутствуют отрицательные значения, что говорит о неоптимальности плана, поэтому продолжим расчет по алгоритму:

                        

Составим симплекс-таблицу (Таблица 2.2.3).

Таблица 2.2.3-                                                                   Таблица результатов

Базис

План

x1

x2

x3

x4

x5

x5

1200

0

0

24

-18

1

x1

450

1

0

3

-1

0

x2

100

0

1

-2

1

0

f

1750

0

0

1

1

0

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

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

Fmax=3*450+4*100+x3*0+x4*0+x5=1750               Таблица результатов

2.3 Структурная и функциональная схемы программы

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

Рисунок 2.1 – Структурная схема программы

Функциональная схема — документ, разъясняющий процессы, протекающие в отдельных функциональных цепях изделия (установки) или изделия в целом. Функциональная схема является экспликацией отдельных видов процессов, протекающих в целостных функциональных блоках и цепях устройства. На рис.2.2 представлена функциональная схема разработанной программы.

Рисунок 2.2 –Функциональная схема программы

2.4 Описание процедур, функций и модулей

Объявление модуля:

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

Стандартные модули языка Delphi. В состав среды Delphi входит великолепный набор модулей, возможности которых удовлетворят даже самого привередливого программиста. Все модули можно разбить на две группы: системные модули и модули визуальных компонентов.

К системным модулям относятся System, SysUtils, ShareMem, Math. В них содержатся наиболее часто используемые в программах типы данных, константы, переменные, процедуры и функции. Модуль System - это сердце среды Delphi; содержащиеся в нем подпрограммы обеспечивают работу всех остальных модулей системы. Модуль System подсоединяется автоматически к каждой программе и его не надо указывать в операторе uses.

Модули визуальных компонентов (VCL - Visual Component Library) используются для визуальной разработки полнофункциональных GUI-приложений - приложений с графическим пользовательским интерфейсом (Graphical User Interface). Эти модули в совокупности представляют собой высокоуровневую объектно-ориентированную библиотеку со всевозможными элементами пользовательского интерфейса: кнопками, надписями, меню, панелями и т.д. Кроме того, модули этой библиотеки содержат простые и эффективные средства доступа к базам данных. Данные модули подключаются автоматически при помещении компонентов на форму.

Описание процедур:

procedure TForm2.Button1Click(Sender: TObject);

Эта процедура осуществляет закрытие титульного и листа и выход из программы.

procedure TForml.Button2Click(Sender: TObject);

Эта процедура открывает главное меню программы и убирает с экрана титульный лист.

procedure TForm2.Button1Click(Sender: TObject);

Эта процедура открывает окно с выбором метода решения транспортной задачи и убирает с экрана окно меню.

procedure TForm2.Button2Click(Sender: TObject);

Эта процедура открывает окно содержащие информацию о разработанной программе и убирает с экрана окно меню.

procedure TForm2.Button3Click(Sender: TObject);

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

procedure TForm2.Button4Click(Sender: TObject);

Эта процедура открывает окно о разработчике, и убирает  окно меню.

procedure TForm2.Button5Click(Sender: TObject);

Эта процедура закрывает окно меню и выходит из программы.

procedure TForm3.Button1Click(Sender: TObject);

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

procedure TForm3.Button3Click(Sender: TObject);

Эта процедура закрывает окно с решениями транспортной задачи тремя методами и выводит на экран форму с решением задачи методом минимальной стоимости

procedure TForm3.Button4Click(Sender: TObject);

Эта процедура закрывает окно с решениями транспортной задачи тремя методами и выводит на экран форму с решением задачи методом двойного предпочтения

procedure TForm2.Button2Click(Sender: TObject);

procedure TForm2.Button3Click(Sender: TObject);

procedure TForm2.Button4Click(Sender: TObject);

Эти процедуры позволяют пользователю отправиться из главного меню в любой пункт программы: «Форма решения», «Руководство пользователя», «Сведения о разработчике», «Выход».

procedure STEP-BY-STEP;

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

procedure TForm4.Label2Click(Sender: TObject);

procedure TForm4.Label3Click(Sender: TObject);

procedure TForm4.Label4Click(Sender: TObject);

procedure TForm4.Label5Click(Sender: TObject);

Эти процедуры загружают в текстовое поле Memo содержимое текстового документа, в зависимости от выбранного пункта меню. В текстовых документах находится информация о пользовании приложением.

procedure TForm1.Button8Click(Sender: TObject);

Эта процедура выполняет расчет по формулам, подставляет введенные значения и в итоге выполнения записывает результат в переменную.

procedure TForm1.Button9Click(Sender: TObject);

Эта процедура выводит ответ в текстовом поле.

procedure TForm1.Button2Click(Sender: TObject);

Эта процедура заполняет поля ввода исходными данными в соответствии с заданием на курсовой проект.

procedure TForm3.Button4Click(Sender: TObject);

procedure TForm4.Button1Click(Sender: TObject);

Эти процедуры закрывают окно с и выводит на экран форму с выбором пункта меню.

procedure ochistka;

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

2.5 Таблица идентификаторов

Идентификатор – имя для обозначения определенных разработчикам

языка функций, констант и т.д. служат стандартные идентификаторы. 

Идентификаторы пользователя – это те имена, которые дает сам программист.

Таблица 2.5.1 -                                      Таблица идентификаторов

Название

Назначение

Тип

i

Счетчики циклов

Integer

zna4,zna4TMP,zna4TMP2

Промежуточные переменные.

Integer

MinEl

Минимальное значение

Double

Summ

Сумма

Integer

Boo ,reshil,dv

Переменные логического типа

Boolean

K, m, a, b, с

Вспомогательные переменные

Integer

Count,Count2

Размер таблицы

Integer

ЗАКЛЮЧЕНИЕ

Данная курсовая работа несет в  себе не только приобретение навыков по программированию в среде Delphi, а так же приобретение и закрепление практических навыков по предмету «Моделирование экономических и производственных процессов»

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

-  Нахождение оптимального плана симплексным методом;

- Освоение библиотек (Delphi) с поддержкой математических функций и процедур;

-  Написание приложения для расчета и нахождения оптимального плана;

-  Подключение справочной информации к программе.

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1.  http://ru.wikipedia.org/wiki/Линейное_программированиеhttp://ru.wikipedia.org/wiki
  2.  http://www.google.ru
  3.  http://ru.wikipedia.org
  4.  http://math.semestr.ru/transp/model_transport.php
  5.  http://www.compmodel.ru/102/217/index.1.html
  6.  http://delphicomponent.ru/234-struktura-modulya-delphi.html
  7.  Фараонов В.В. Delphi. Программирование на языке высокого уровня. Питер, 2000г.
  8.  ДБарахвелидзе П.Г. Программирование в Delphi7-СПб: БВХ-Петербург, 2004г.

                                  ПРИЛОЖЕНИЕ А

                                       Техническое задание

1 Введение

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

2 Основание для разработки

2.1 Программа разрабатывается на основе учебного плана ЦМК в соответствии с заданием по курсовому проектированию от 04.01.2013года

3 Назначение

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

4 Требования к программе и программному изделию

4.1 Требование к функциональным характеристикам

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

  •   Ввод исходных данных
  •  Вывод результата вычисления
  •  Ознакомление пользователя со справкой по программе
  •  Ограничение пользователя от некорректных действий
  •  Возможность задавать размеры таблиц

4.1.2 Исходные данные:

  •   Количество реализованной продукции в неделю;
  •   Количество сырья для изготовления продукции;
  •   Время на изготовление одной единицы продукции.

4.2 Требования к надежности

Предусмотреть контроль вводимой информации;

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

4.3 Требования к составу и параметрам технических средств

Система должна работать на IBM-совместимых персональных компьютерах.

Минимальная конфигурация:

  •  Тип процессора     Pentium III и выше
  •  Объем оперативно запоминающего устройства 128 мб
  •  Объем свободного места на жестком диске 6 мб

4.4 Требование к информационной и программной совместимости.

Программа должна работать под управлением семейства операционных систем Win32.

5 Требование к программной документации

5.1 Разрабатываемые программные модули должны быть самодокументированы .

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

5.3  В состав сопровождающей документации должны входить:

5.3.1 Пояснительная записка на 25-30 листах, содержащая описание разработки;

5.3.2 Руководство пользователя.

                                ПРИЛОЖЕНИЕ Б

                                  Руководство пользователя

Для запуска данной программы необходимо открыть файл с именем «Project1».

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

Рисунок Б.1 – Главное меню.

Меню «Руководство пользователя содержит» в себе подробную информацию, доступную пользователю, по пользованию приложением.(Рисунок Б.2)

Рисунок Б.2 – Руководство пользователя.

Нажав кнопку «Сведения о разработчике» Вы получите информацию о разработчике данного программного продукта. (Рисунок Б.3)

Рисунок Б.3 – Сведения о разработчике.

Форма решения задач симплексным методом. Содержит в себе (в первоначальном виде) поля ввода исходных данных, кнопки "Добавить","Удалить","Изменить" и кнопки выбора "Максимизации" или "Минимизации" прибыли . (Рисунок Б.4)

Рисунок Б.4 – Форма решения задач.

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

Кнопка "Решить тестовый пример" заполнит программу исходными данными в соответствии с заданием на курсовой проект. После заполнения таблицы данными необходимо нажать кнопку "Далее".

В следуещем пункте необходимо ввести наименование продукта и стоимость 1 еденицы продукции. После ввода нажмите кнопку "Добавить". Введенные данные возможно редактировать или удалять. (Рисунок Б.5)

Рисунок Б.5-Форма решения задач (ввод данных)

Дальше отобразится таблица с введенными значениями, при необходимости можно добавить дополнительные данные. И нажать кнопку "Далее". (Рисунок Б.6)

Рисунок Б.6 – Таблица результатов.

Вам отобразится таблица с решенными результатами вычислений, для получения более подробной информации о результате выполнения нажмите кнопку "Ответ". Вам выведется сообщение с подробным описанием ответов. (Рисунок Б.7)

Рисунок Б.7 – Вывод ответа.

Кнопка "Step-by-step" позволяет поэтапно проследить ход решения задачи,при нажатии поочерёдно будет выводиться результат. Когда найдется ответ, Вам выведется сообщение в нижней части окна "Решение найдено!", после чего вы можите просмотреть ответ.

Кнопка "Решить"- альтернатива кнопке "Step-by-step". Она позволяет сразу произвести все вычисления по формулам и найти ответ. Вам выведется сообщение в нижней части окна "Решение найдено!", после чего вы можите просмотреть ответ.

Если в ходе ввода исходных данных, Вам понадобится исправить некоторые велечины, Вы всегда сможите вернуться нажав кнопку "Назад".

ПРИЛОЖЕНИЕ В

Листинг программы

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Grids, StdCtrls, Buttons, ComCtrls, Menus, jpeg, ExtCtrls;

type

 TForm1 = class(TForm)

   GroupBox1: TGroupBox;

   Edit1: TEdit;

   Edit2: TEdit;

   BitBtn1: TBitBtn;

   BitBtn2: TBitBtn;

   Label1: TLabel;

   Label2: TLabel;

   StringGrid1: TStringGrid;

   Label3: TLabel;

   GroupBox2: TGroupBox;

   BitBtn4: TBitBtn;

   BitBtn5: TBitBtn;

   BitBtn6: TBitBtn;

   BitBtn7: TBitBtn;

   GroupBox3: TGroupBox;

   BitBtn3: TBitBtn;

   BitBtn8: TBitBtn;

   BitBtn9: TBitBtn;

   Edit3: TEdit;

   Label6: TLabel;

   Edit4: TEdit;

   Label7: TLabel;

   StringGrid2: TStringGrid;

   Label9: TLabel;

   Label5: TLabel;

   GroupBox4: TGroupBox;

   StringGrid3: TStringGrid;

   Label10: TLabel;

   GroupBox5: TGroupBox;

   StringGrid4: TStringGrid;

   BitBtn10: TBitBtn;

   BitBtn11: TBitBtn;

   GroupBox6: TGroupBox;

   Memo1: TMemo;

   RichEdit1: TRichEdit;

   Button1: TButton;

   Button2: TButton;

   RadioButton1: TRadioButton;

   RadioButton2: TRadioButton;

   Image1: TImage;

   procedure BitBtn6Click(Sender: TObject);

   procedure Edit1KeyPress(Sender: TObject; var Key: Char);

   procedure BitBtn1Click(Sender: TObject);

   procedure StringGrid1Click(Sender: TObject);

   procedure BitBtn7Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure BitBtn2Click(Sender: TObject);

   procedure Edit2KeyPress(Sender: TObject; var Key: Char);

   procedure BitBtn4Click(Sender: TObject);

   procedure BitBtn5Click(Sender: TObject);

   procedure Edit3KeyPress(Sender: TObject; var Key: Char);

   procedure Edit4KeyPress(Sender: TObject; var Key: Char);

   procedure BitBtn3Click(Sender: TObject);

    procedure BitBtn9Click(Sender: TObject);

   procedure BitBtn8Click(Sender: TObject);

   procedure StringGrid2Click(Sender: TObject);

   procedure StringGrid3KeyPress(Sender: TObject; var Key: Char);

   procedure BitBtn11Click(Sender: TObject);

   procedure BitBtn10Click(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure Otchistka();

begin

               form1.stringgrid1.RowCount :=2;

               form1.stringgrid1.Cells [0,form1.stringgrid1.RowCount - 1] := '';

               form1.stringgrid1.Cells [1,form1.stringgrid1.RowCount - 1] := '';

                 form1.stringgrid2.RowCount :=2;

               form1.stringgrid2.Cells [0,form1.stringgrid2.RowCount - 1] := '';

               form1.stringgrid2.Cells [1,form1.stringgrid2.RowCount - 1] := '';

                 form1.stringgrid3.RowCount :=2;

               form1.stringgrid2.Cells [0,form1.stringgrid2.RowCount - 1] := '';

               form1.stringgrid2.Cells [1,form1.stringgrid2.RowCount - 1] := '';

               form1.stringgrid3.ColCount :=2;

               form1.stringgrid3.RowCount :=2;

end;

procedure Otvet();

var count,count2:integer;

   boo:boolean;

begin

   form1.Memo1.Lines.Add('Выгодно производить/использовать следующую продукцию:');

   for count:=1 to form1.StringGrid4.RowCount -1 do

       for count2:=0 to form1.StringGrid2.RowCount -1 do

           if form1.StringGrid4.Cells[0,count] = form1.StringGrid2.Cells[0,count2] then

           begin

               form1.Memo1.Lines.Add (form1.StringGrid4.Cells[0,count]+ ' в количестве ' + form1.StringGrid4.Cells[1,count]+' ед.');

           end;

   boo:=false;

   for count:=1 to form1.StringGrid4.RowCount -1 do

       for count2:=0 to form1.StringGrid1.RowCount -1 do

           if form1.StringGrid4.Cells[0,count] = form1.StringGrid1.Cells[0,count2] then

           begin

             boo:=true;

             break;

           end;

   if boo then

   begin

    form1.Memo1.Lines.Add('');

    form1.Memo1.Lines.Add('При этом будут такие излишки ресурсов:');

    for count:=1 to form1.StringGrid4.RowCount -1 do

        for count2:=0 to form1.StringGrid1.RowCount -1 do

            if form1.StringGrid4.Cells[0,count] = form1.StringGrid1.Cells[0,count2] then

            begin

                form1.Memo1.Lines.Add (form1.StringGrid4.Cells[0,count]+ ' в количестве ' + form1.StringGrid4.Cells[1,count]+' ед.');

            end;

   end;

   form1.Memo1.Lines.Add('');

   if form1.RadioButton2.Checked then

     form1.Memo1.Lines.Add('Затраты при таком плане использования составят ' + floattostr((-1)*strtofloat(form1.StringGrid4.Cells[1,1]))+' у.е.')

   else

     form1.Memo1.Lines.Add('Прибыль при таком плане производства составит ' + form1.StringGrid4.Cells[1,1]+' у.е.');

end;

procedure zapolni();

var Count:integer;

begin

       form1.StringGrid3.Cells[1,0]:='ОФР';

       for Count:=1 to form1.stringgrid1.RowCount-1 do

       begin

               form1.StringGrid3.RowCount :=form1.StringGrid3.RowCount +1;

               form1.StringGrid3.Cells[0,Count+1]:=form1.StringGrid1.Cells[0,Count];

       end;

       form1.StringGrid3.Cells[0,1]:='Прибыль';

       form1.StringGrid3.Cells[1,1]:='0';

       for Count:=1 to form1.stringgrid2.RowCount-1 do

       begin

               form1.StringGrid3.ColCount := form1.StringGrid3.ColCount+1;

               form1.StringGrid3.Cells[Count+1,0]:=form1.StringGrid2.Cells[0,Count];

       end;

       for Count:=1 to form1.StringGrid1.RowCount -1 do

             form1.StringGrid3.Cells[1,Count+1]:=form1.StringGrid1.Cells[1,Count];

       for Count:=1 to form1.StringGrid2.RowCount -1 do

               form1.StringGrid3.Cells[Count+1,1]:=form1.StringGrid2.Cells[1,Count];

end;

procedure ZapEnd();

var Count,count2,tmp,k:integer;

begin

   k:=1;

   if form1.RadioButton2.Checked then k:=-1;

       form1.StringGrid4.RowCount :=form1.StringGrid3.RowCount;

       form1.StringGrid4.ColCount := form1.StringGrid3.ColCount;

       for count:=0 to form1.StringGrid3.RowCount-1 do

               for count2:=0 to form1.StringGrid3.ColCount-1 do

                       form1.StringGrid4.Cells [Count2,count] :=form1.StringGrid3.Cells [Count2,count];

       for count:=1 to form1.StringGrid3.RowCount-1 do

               for count2:=1 to form1.StringGrid3.ColCount-1 do

                       form1.StringGrid4.Cells [Count2,count] :=floattostr(k*strtofloat(form1.StringGrid3.Cells [Count2,count]));

       for count:=1 to form1.StringGrid4.ColCount -1 do

           form1.StringGrid4.Cells[count,1]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,1])*(-1));

       tmp:=form1.StringGrid4.ColCount;

       form1.StringGrid4.ColCount  := tmp + form1.StringGrid3.RowCount -2;

       for Count:=2 to form1.StringGrid3.RowCount -1 do

       begin

               form1.StringGrid4.Cells [count+tmp-2,0]:=form1.StringGrid3.Cells [0,count];

       end;

       for count:=tmp to form1.StringGrid4.ColCount-1 do

           for count2:=1 to form1.StringGrid4.RowCount - 1 do

               if form1.StringGrid4.Cells [count,0]= form1.StringGrid4.Cells [0,count2] then

                   form1.StringGrid4.Cells [count,count2]:='1'

               else

                   form1.StringGrid4.Cells [count,count2]:='0';

end;

function Proverka():boolean;

var     Count,Count2:integer;

       boo:boolean;

begin

       boo:=true;

       form1.StringGrid3.Cells [1,1]:='0';

       for Count:=1 to form1.StringGrid3.RowCount -1 do

              for Count2:=1 to form1.StringGrid3.ColCount  -1 do

                       if  form1.StringGrid3.Cells [Count2,Count]='' then

                       begin

                               boo:=false;

                               form1.Label5.Caption :='Ошибка заполнения таблицы. Найдено пустое поле!';

                       end;

       proverka:=boo;

end;

procedure SimplexMetod(n:boolean);

var Count,Count2,MinC,MinR:integer;

   MinEl,zna4,zna4TMP,zna4TMP2:double;

   boo,reshil:boolean;

begin

reshil:=false;

repeat

boo:=false;

   for count:=1 to form1.StringGrid4.ColCount -1 do

    if strtofloat(form1.StringGrid4.Cells [count,1])<0 then boo:=true;

if boo then

begin

   MinC:=2;

   zna4:=strtofloat(form1.StringGrid4.Cells [2,1]);

   for count:=2 to form1.StringGrid4.ColCount -1 do

      if strtofloat(form1.StringGrid4.Cells [count,1])<zna4 then

       begin

           zna4:=strtofloat(form1.StringGrid4.Cells [count,1]);

           MinC:=count;

       end;

   zna4TMP:=strtofloat(form1.StringGrid4.Cells [1,2]);

   zna4TMP2:=strtofloat(form1.StringGrid4.Cells [MinC,2]);

   MinEl:=zna4TMP/zna4TMP2;

   MinR:=2;

   for Count:=2 to form1.StringGrid4.RowCount -1 do

   begin

       zna4TMP:=strtofloat(form1.StringGrid4.Cells [1,count]);

       zna4TMP2:=strtofloat(form1.StringGrid4.Cells [MinC,count]);

       if zna4TMP2>0 then

       begin

           zna4:=zna4TMP/zna4TMP2;

           if zna4<MinEl then

           begin

               MinEl:=zna4;

               MinR:=Count;

           end;

       end;

   end;

   MinEl:=strtofloat(form1.StringGrid4.Cells[MinC,MinR]);

   for count:=1 to form1.StringGrid4.ColCount -1 do

Form1.StringGrid4.Cells[count,MinR]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,MinR])/MinEl)    for count:=1 to form1.StringGrid4.ColCount -1 do

       for Count2:=1 to form1.StringGrid4.RowCount -1 do

           if (count<>MinC)and(count2<>MinR) then

               form1.StringGrid4.Cells [count,count2]:=floattostr(strtofloat(form1.StringGrid4.Cells [count,count2])-strtofloat(form1.StringGrid4.Cells [count,MinR])*strtofloat(form1.StringGrid4.Cells [MinC,count2]));

   form1.StringGrid4.Cells[0,MinR]:=form1.StringGrid4.Cells[MinC,0];

   for count:=1 to form1.StringGrid4.RowCount - 1 do

       if form1.StringGrid4.Cells [MinC,0]= form1.StringGrid4.Cells [0,count] then

           form1.StringGrid4.Cells [MinC,count]:='1'

       else

           form1.StringGrid4.Cells [MinC,count]:='0';

end

else

begin

   form1.Label5.Caption :='Решение найдено!!!';

   reshil:=true;

end;

until reshil or n;

end;

procedure DvSimplexMetod(n:boolean);

var Count,Count2,MinC,MinR:integer;

   MinEl,zna4,zna4TMP,zna4TMP2:double;

   boo,reshil,dv:boolean;

begin

reshil:=false;

dv:=form1.RadioButton2.Checked;

repeat

boo:=false;

   for count:=2 to form1.StringGrid4.ColCount -1 do

    if strtofloat(form1.StringGrid4.Cells [count,1])<0 then boo:=true;

   for count:=2 to form1.StringGrid4.RowCount -1 do

    if strtofloat(form1.StringGrid4.Cells [1,count])<0 then boo:=true;

if boo then

begin

   MinR:=2;

   zna4:=strtofloat(form1.StringGrid4.Cells [1,2]);

   for count:=2 to form1.StringGrid4.RowCount -1 do

      if strtofloat(form1.StringGrid4.Cells [1,count])<zna4 then

       begin

           zna4:=strtofloat(form1.StringGrid4.Cells [1,count]);

           MinR:=count;

       end;

   zna4TMP:=strtofloat(form1.StringGrid4.Cells [2,1]);

   zna4TMP2:=strtofloat(form1.StringGrid4.Cells [2,MinR]);

   MinEl:=zna4TMP/zna4TMP2;

   MinC:=2;

   for Count:=2 to form1.StringGrid4.ColCount -1 do

   begin

       zna4TMP:=strtofloat(form1.StringGrid4.Cells [count,1]);

       zna4TMP2:=strtofloat(form1.StringGrid4.Cells [count,MinR]);

       if (zna4TMP>0) and (zna4TMP2<0) then

       begin

           zna4:=zna4TMP/zna4TMP2;

           if abs(zna4)<abs(MinEl) then

           begin

               MinEl:=zna4;

               MinC:=Count;

           end;

       end;

   end;

   MinEl:=strtofloat(form1.StringGrid4.Cells[MinC,MinR]);

   for count:=1 to form1.StringGrid4.ColCount -1 do

form1.StringGrid4.Cells[count,MinR]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,MinR])/MinEl);

    for count:=1 to form1.StringGrid4.ColCount -1 do

       for Count2:=1 to form1.StringGrid4.RowCount -1 do

           if (count<>MinC)and(count2<>MinR) then

               form1.StringGrid4.Cells [count,count2]:=floattostr(strtofloat(form1.StringGrid4.Cells [count,count2])-strtofloat(form1.StringGrid4.Cells [count,MinR])*strtofloat(form1.StringGrid4.Cells [MinC,count2]));

   form1.StringGrid4.Cells[0,MinR]:=form1.StringGrid4.Cells[MinC,0];

   for count:=1 to form1.StringGrid4.RowCount - 1 do

       if form1.StringGrid4.Cells [MinC,0]= form1.StringGrid4.Cells [0,count] then

           form1.StringGrid4.Cells [MinC,count]:='1'

       else

           form1.StringGrid4.Cells [MinC,count]:='0';

end

else

begin

   form1.Label5.Caption :='Решение найдено!!!';

   reshil:=true;

end;

until reshil or n;

end;

procedure TForm1.BitBtn6Click(Sender: TObject);

begin

Form1.Visible:=false;

Form2.Visible:=True;

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

       case key of

         #8: ;

         #13: edit2.SetFocus ;

         'a'..'z': ;

         'A'..'Z': ;

         'а'..'я': ;

         'А'..'Я': ;

         '0'..'9': ;

       else key:=#0;

       end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var     Count:integer;

       boo:boolean;

begin

       boo:=true;

       if (edit1.Text ='')or(edit2.Text ='') then

       begin

           boo:=false;

           label5.Caption :='Заполните все поля ввода.';

       end;

       for Count := 1 to stringgrid1.RowCount do

       begin

               if (edit1.Text = stringgrid1.Cells [0,Count]) then

                       boo:=false;

       end;

       if boo then

       begin

               if (stringgrid1.RowCount = 2) and (stringgrid1.Cells[0,1]='')  then

                     stringgrid1.RowCount := stringgrid1.RowCount

               else

                     stringgrid1.RowCount := stringgrid1.RowCount + 1;

               stringgrid1.Cells [0,stringgrid1.RowCount - 1] := edit1.Text;

               stringgrid1.Cells [1,stringgrid1.RowCount - 1] := edit2.Text;

               label5.Caption :='Ресурс добавлен!';

               edit1.SetFocus();

        end

        else

               label5.Caption :='Такой ресурс уже есть';

end;

procedure TForm1.StringGrid1Click(Sender: TObject);

var i :integer;

begin

       i:=stringgrid1.Row;

       edit1.Text := stringgrid1.Cells [0,i];

       edit2.Text := stringgrid1.Cells [1,i];

       label5.Caption := '';

end;

procedure TForm1.BitBtn7Click(Sender: TObject);

var     Count,i:integer;

       boo:boolean;

begin

       boo:=true;

       for Count := 1 to stringgrid1.RowCount do

       begin

               if (edit1.Text = stringgrid1.Cells [0,Count]) then

                       begin

                               i:=Count;

                               boo:=false;

                       end;

       end;

       if boo then

       begin

               label5.Caption :='Такого ресурса нет в списке!';

        end

        else

               begin

                     stringgrid1.Cells [0,i] := edit1.Text;

                     stringgrid1.Cells [1,i] := edit2.Text;

                     label5.Caption :='Ресурс изменен.';

               end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

       stringgrid1.Cells [0,0]:='Наименование';

       stringgrid1.Cells [1,0]:='ОФР';

       stringgrid2.Cells [0,0]:='Наименование';

       stringgrid2.Cells [1,0]:='Стоимость';

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

var     Count,i:integer;

       boo:boolean;

begin

       boo:=true;

       for Count := 1 to stringgrid1.RowCount do

       begin

               if (edit1.Text = stringgrid1.Cells [0,Count]) then

                       begin

                               i:=Count;

                               boo:=false;

                       end;

       end;

       if boo then

       begin

               label5.Caption :='Такого ресурса нет в списке!';

        end

        else

               begin

                     stringgrid1.Rows[i].Clear ;

                     for Count := i to stringgrid1.RowCount-1 do

                           begin

                                  stringgrid1.Cells [0,Count]:=stringgrid1.Cells [0,Count+1];

                                  stringgrid1.Cells [1,Count]:=stringgrid1.Cells [1,Count+1];

                           end;

                     stringgrid1.RowCount := stringgrid1.RowCount -1;

                     label5.Caption :='Ресурс стерт.';

               end;

end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);

begin

      case key of

         #8: ;

         #13: bitbtn1.SetFocus;

         '0'..'9': ;

         #110:;

         #46:;

       else key:=#0;

       end;

end;

procedure TForm1.BitBtn4Click(Sender: TObject);

begin

   label5.Caption :='';

       if groupbox5.Visible = true then

               begin

                       groupbox5.Visible := false;

                       groupbox6.Visible := true;

                       bitbtn10.Visible :=false;

                       bitbtn11.Visible :=false;

                       memo1.Clear();

                       bitbtn4.Enabled :=false;

                       if form1.RadioButton2.Checked then

                         dvSimplexMetod(False)

                       else

                         SimplexMetod(False);

                       Otvet();

               end;

       if groupbox4.Visible = true then

               begin

                       if Proverka() then

                       begin

                               groupbox4.Visible := false;

                               groupbox5.Visible := true;

                               bitbtn10.Visible :=true;

                               bitbtn11.Visible :=true;

                               bitbtn4.Caption := '<Ответ>';

                               zapend();

                       end;

               end;

       if groupbox3.Visible = true then

               begin

                   if stringgrid2.Cells[0,1]<>'' then

                   begin

                       groupbox3.Visible := false;

                       groupbox4.Visible := true;

                       stringgrid3.ColCount :=2;

                       stringgrid3.RowCount :=2;

                       zapolni();

                    end

                    else label5.Caption :='Подуктов нет?!';

               end;

       if groupbox1.Visible = true then

               begin

                   if stringgrid1.Cells[0,1]<>''  then

                   begin

                       bitbtn5.Enabled := true;

                       groupbox1.Visible := false;

                       groupbox3.Visible := true;

                    end

                    else label5.Caption :='Ресурсы не могут отсутствовать!';   

               end;

end;

procedure TForm1.BitBtn5Click(Sender: TObject);

begin

   label5.Caption :='';

       if groupbox3.Visible = true then

               begin

                       bitbtn5.Enabled := false;

                       groupbox3.Visible := false;

                       groupbox1.Visible := true;

               end;

       if groupbox4.Visible = true then

               begin

                       groupbox4.Visible := false;

                       groupbox3.Visible := true;

               end;

       if groupbox5.Visible = true then

               begin

                       groupbox5.Visible := false;

                       groupbox4.Visible := true;

                        bitbtn10.Visible :=false;

                        bitbtn11.Visible :=false;

                        bitbtn4.Caption := 'Дальше -->';

                        bitbtn4.Enabled :=true;

               end;

       if groupbox6.Visible = true then

               begin

                       groupbox6.Visible := false;

                       groupbox5.Visible := true;

                        bitbtn10.Visible :=true;

                        bitbtn11.Visible :=true;

                        bitbtn4.Enabled :=true;

               end;

end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);

begin

      case key of

         #8: ;

         #13: edit4.SetFocus ;

         'a'..'z': ;

         'A'..'Z': ;

         'а'..'я': ;

         'А'..'Я': ;

         '0'..'9': ;

       else key:=#0;

       end;

end;

procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);

begin

      case key of

         #8: ;

         #13: bitbtn3.SetFocus;

         '0'..'9': ;

         #110:;

         #46:;

       else key:=#0;

       end;

end;

procedure TForm1.BitBtn3Click(Sender: TObject);

var     Count:integer;

       boo:boolean;

begin

       boo:=true;

       if (edit3.Text ='')or(edit4.Text ='') then

       begin

           boo:=false;

           label5.Caption :='Заполните все поля ввода.';

       end;

       for Count := 1 to stringgrid2.RowCount do

       begin

               if (edit3.Text = stringgrid2.Cells [0,Count]) then

                       boo:=false;

       end;

       if boo then

       begin

               if (stringgrid2.RowCount = 2) and (stringgrid2.Cells[0,1]='')  then

                     stringgrid2.RowCount := stringgrid2.RowCount

               else

                     stringgrid2.RowCount := stringgrid2.RowCount + 1;

               stringgrid2.Cells [0,stringgrid2.RowCount - 1] := edit3.Text;

               stringgrid2.Cells [1,stringgrid2.RowCount - 1] := edit4.Text;

               label5.Caption :='Продукт добавлен!';

               edit3.SetFocus();

        end

        else

               label5.Caption :='Такой продукт уже есть';

end;

procedure TForm1.BitBtn9Click(Sender: TObject);

var     Count,i:integer;

       boo:boolean;

begin

       boo:=true;

       for Count := 1 to stringgrid2.RowCount do

       begin

               if (edit3.Text = stringgrid2.Cells [0,Count]) then

                       begin

                               i:=Count;

                               boo:=false;

                       end;

       end;

       if boo then

       begin

               label5.Caption :='Такого продукта нет в списке!';

        end

        else

               begin

                     stringgrid2.Rows[i].Clear ;

                     for Count := i to stringgrid2.RowCount-1 do

                           begin

                                  stringgrid2.Cells [0,Count]:=stringgrid2.Cells [0,Count+1];

                                  stringgrid2.Cells [1,Count]:=stringgrid2.Cells [1,Count+1];

                           end;

                     stringgrid2.RowCount := stringgrid2.RowCount -1;

                     label5.Caption :='Продукт стерт.';

               end;

end;

procedure TForm1.BitBtn8Click(Sender: TObject);

var     Count,i:integer;

       boo:boolean;

begin

       boo:=true;

       for Count := 1 to stringgrid2.RowCount do

       begin

               if (edit3.Text = stringgrid2.Cells [0,Count]) then

                       begin

                               i:=Count;

                               boo:=false;

                       end;

       end;

       if boo then

       begin

               label5.Caption :='Такого продукта нет в списке!';

        end

        else

               begin

                     stringgrid2.Cells [0,i] := edit3.Text;

                     stringgrid2.Cells [1,i] := edit4.Text;

                     label5.Caption :='Продукт изменен.';

               end;

end;

procedure TForm1.StringGrid2Click(Sender: TObject);

var i :integer;

begin

       i:=stringgrid2.Row;

       edit3.Text := stringgrid2.Cells [0,i];

       edit4.Text := stringgrid2.Cells [1,i];

       label5.Caption := '';

end;

procedure TForm1.StringGrid3KeyPress(Sender: TObject; var Key: Char);

begin

      case key of

         #8: ;

         #13:;

         '0'..'9': ;

         #110:;

         ',': ;

         #46:;

       else key:=#0;

       end;

end;

procedure TForm1.BitBtn11Click(Sender: TObject);

begin

                       if form1.RadioButton2.Checked then

                         dvSimplexMetod(True)

                       else

                         SimplexMetod(True);

end;

procedure TForm1.BitBtn10Click(Sender: TObject);

begin

                       if form1.RadioButton2.Checked then

                         dvSimplexMetod(False)

                       else

                         SimplexMetod(False);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

               Otchistka();

               //Добавляем ресурсы

               stringgrid1.Cells [0,stringgrid1.RowCount - 1] := 'Возможное количество реализации полок';

               stringgrid1.Cells [1,stringgrid1.RowCount - 1] := '550';

                 stringgrid1.RowCount := stringgrid1.RowCount + 1;

               stringgrid1.Cells [0,stringgrid1.RowCount - 1] := 'Количество получаемого материала';

               stringgrid1.Cells [1,stringgrid1.RowCount - 1] := '1200';

                 stringgrid1.RowCount := stringgrid1.RowCount + 1;

               stringgrid1.Cells [0,stringgrid1.RowCount - 1] := 'Время работы над полками(в мин)';

               stringgrid1.Cells [1,stringgrid1.RowCount - 1] := '9600';

                 //добавляем продукты

               stringgrid2.Cells [0,stringgrid2.RowCount - 1] := 'x1';

               stringgrid2.Cells [1,stringgrid2.RowCount - 1] := '3';

                 stringgrid2.RowCount := stringgrid2.RowCount + 1;

               stringgrid2.Cells [0,stringgrid2.RowCount - 1] := 'x2';

               stringgrid2.Cells [1,stringgrid2.RowCount - 1] := '4';

                  //заполняем затраты

               zapolni();

               stringgrid3.Cells [2,2] := '1';

               stringgrid3.Cells [2,3] := '2';

               stringgrid3.Cells [2,4] := '12';

               stringgrid3.Cells [3,2] := '1';

               stringgrid3.Cells [3,3] := '3';

               stringgrid3.Cells [3,4] := '30';

     

               //заполняем и выполняем

                     bitBtn5.Enabled:=true;

                     if Proverka() then

                       begin

                               groupbox1.Visible := false;

                               groupbox5.Visible := true;

                               bitbtn10.Visible :=true;

                               bitbtn11.Visible :=true;

                               bitbtn4.Caption := '<Ответ>';

                               zapend();

                       end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

 bitbtn10.Visible :=false;

 bitbtn11.Visible :=false;

 bitbtn4.Caption := 'Дальше -->';

 bitbtn4.Enabled :=true;

 groupbox1.Visible := true;

 groupbox3.Visible := false;

 groupbox4.Visible := false;

 groupbox5.Visible := false;

 groupbox6.Visible := false;

 label5.Caption:='';

 Otchistka();

end;

end.

unit Unit2;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, jpeg, ExtCtrls;

type

 TForm2 = class(TForm)

   Image1: TImage;

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Image2: TImage;

   procedure Label2MouseEnter(Sender: TObject);

   procedure Label2MouseLeave(Sender: TObject);

   procedure Label3MouseEnter(Sender: TObject);

   procedure Label3MouseLeave(Sender: TObject);

   procedure Label4MouseEnter(Sender: TObject);

   procedure Label4MouseLeave(Sender: TObject);

   procedure Label5MouseEnter(Sender: TObject);

   procedure Label5MouseLeave(Sender: TObject);

   procedure Label2Click(Sender: TObject);

   procedure Label3Click(Sender: TObject);

   procedure Label4Click(Sender: TObject);

   procedure Label5Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form2: TForm2;

implementation

uses Unit1, Unit3;

{$R *.dfm}

procedure TForm2.Label2MouseEnter(Sender: TObject);

begin

Label2.Font.Color:=255;

end;

procedure TForm2.Label2MouseLeave(Sender: TObject);

begin

Label2.Font.Color:=16777215;

end;

procedure TForm2.Label3MouseEnter(Sender: TObject);

begin

Label3.Font.Color:=255;

end;

procedure TForm2.Label3MouseLeave(Sender: TObject);

begin

Label3.Font.Color:=16777215;

end;

procedure TForm2.Label4MouseEnter(Sender: TObject);

begin

Label4.Font.Color:=255;

end;

procedure TForm2.Label4MouseLeave(Sender: TObject);

begin

Label4.Font.Color:=16777215;

end;

procedure TForm2.Label5MouseEnter(Sender: TObject);

begin

Label5.Font.Color:=255;

end;

procedure TForm2.Label5MouseLeave(Sender: TObject);

begin

Label5.Font.Color:=16777215;

end;

procedure TForm2.Label2Click(Sender: TObject);

begin

Form1.visible:=true;

Form2.visible:=false;

end;

procedure TForm2.Label3Click(Sender: TObject);

begin

Form3.visible:=true;

Form2.Visible:=false;

end;

procedure TForm2.Label4Click(Sender: TObject);

begin

application.MessageBox('Данный программный продукт был разработан Студентом АФ КПТК группы ВТП-09с Панчуриным Олегом.'+ #13 +' Использование данного продукта разрешено только в учебных целях.','О программе.');

end;

procedure TForm2.Label5Click(Sender: TObject);

begin

Close;

end;

end.

unit Unit3;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, jpeg, ExtCtrls;

type

 TForm3 = class(TForm)

   Image1: TImage;

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Memo1: TMemo;

   Button1: TButton;

   procedure Label2MouseEnter(Sender: TObject);

   procedure Label2MouseLeave(Sender: TObject);

   procedure Label3MouseEnter(Sender: TObject);

   procedure Label3MouseLeave(Sender: TObject);

   procedure Label4MouseEnter(Sender: TObject);

   procedure Label4MouseLeave(Sender: TObject);

   procedure Label5MouseEnter(Sender: TObject);

   procedure Label5MouseLeave(Sender: TObject);

   procedure Label2Click(Sender: TObject);

   procedure Label3Click(Sender: TObject);

   procedure Label4Click(Sender: TObject);

   procedure Label5Click(Sender: TObject);

   procedure Button1Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form3: TForm3;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm3.Label2MouseEnter(Sender: TObject);

begin

Label2.Font.Color:=255;

end;

procedure TForm3.Label2MouseLeave(Sender: TObject);

begin

Label2.Font.Color:=0;

end;

procedure TForm3.Label3MouseEnter(Sender: TObject);

begin

Label3.Font.Color:=255;

end;

procedure TForm3.Label3MouseLeave(Sender: TObject);

begin

Label3.Font.Color:=0;

end;

procedure TForm3.Label4MouseEnter(Sender: TObject);

begin

Label4.Font.Color:=255;

end;

procedure TForm3.Label4MouseLeave(Sender: TObject);

begin

Label4.Font.Color:=0;

end;

procedure TForm3.Label5MouseEnter(Sender: TObject);

begin

Label5.Font.Color:=255;end;

procedure TForm3.Label5MouseLeave(Sender: TObject);

begin

Label5.Font.Color:=0;end;

procedure TForm3.Label2Click(Sender: TObject);

begin

Memo1.lines.loadFromFile('1.txt');end;

procedure TForm3.Label3Click(Sender: TObject);

begin

Memo1.Lines.LoadFromFile('2.txt');end;

procedure TForm3.Label4Click(Sender: TObject);

begin

Memo1.Lines.LoadFromFile('3.txt');

end;

procedure TForm3.Label5Click(Sender: TObject);

begin

Memo1.Lines.LoadFromFile('4.txt');end;

procedure TForm3.Button1Click(Sender: TObject);

begin

Form2.visible:=true;Form3.Visible:=false;end;end.

ПРИЛОЖЕНИЕ Г

Контрольный пример

Контрольный пример включает вычисления не только по исходным значениям, но и по другим значениям введенными пользователем.

Для контрольной проверки программы попробуем изменить значения задачи:

Таблица Г.1 –                                                               Исходные данные

Базис

План

x1

x2

x3

x4

x5

х3

230

3/5

0

1

0

-1/30

х4

240

4/5

0

0

1

-1/10

х2

320

2/5

1

0

0

1/30

f

1280

-7/5

0

0

0

2/15

Введём данные из таблицы в программу (рисунок Г.1) и нажмём кнопку "Решить" и получим:

Рисунок Г.1- Вычисления

После заполнения нажмем кнопку «Ответ» для вывода ответа в текстовом поле.

Рисунок Г.2 – Получение результата.

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

 


Стр.

6

8

8

12

14

14

16

18

19

22

24

25

26

28

33

55




1. Маруся Чурай Новаторство у змалюванні образу народної поетеси
2. Основи проектування автоматизованих інформаційних систем
3. Практикум по BPwin Упражнение 6 Упражнение 6
4. Вы можете взять в аренду понравившейся вам реквизит для вашего удобства аренда рассчитана на 2е суток к пр
5. члены и функциичлены класса
6. Налоговые вычет
7. Задание {{567}} 205 На рисунке представлен график для выбора сечения ремня при расчёте клиноремённой передач
8. Золотым веком Литература этой поры явление уникальное исключительное несравненное
9. П рассматривает два взаимоисключающих проекта требующих одинаковых первоначальных инвестиций в 30 00000 и р
10. Чума Курсовая работа по зарубежной литературе
11. Полуостров Юкатан
12. Социальноэкономическая сущность финансов их роль в системе денежных отношений рыночного хозяйства функц
13. СТРОИТЕЛЬНЫЕ РАБОТЫ Сборник Е2 ЗЕМЛЯНЫЕ РАБОТЫ Выпуск 1 МЕХАНИЗИРОВАННЫЕ И РУЧНЫЕ ЗЕМЛЯНЫЕ
14. отстаньте не трогайте их
15. Курсовая работа- Организация, оформление и учет лизинговых операций в кредитных организация
16. на тему естественных беременности и родов соучредитель общественной организации Рождениесоздательниц
17. Статус и стиль деятельности менеджера паблик рилейшнз
18. лечить жажду медикаментами
19. культура в конкретних дисциплінах
20. Тема 2 МЕТОДИЧЕСКАЯ РАЗРАБОТКА ПРАКТИЧЕСКОГО ЗАНЯТИЯ ПО ТЕМЕ-