Реферат Решение транспортной задачи методом Фогеля
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Министерство образования и науки Республики Казахстан
Восточно-Казахстанский государственный технический университет
им. Д.М.Серикбаева
Колледж ВКГТУ
Отделение Информационных технологий, управления и экономики
Комиссия Программирования и информатики
Пояснительная записка
к курсовому проекту
по предмету «Моделирование производственных и экономических процессов»
Тема: «Решение транспортной задачи методом Фогеля»
Специальность 3706002 «Программное обеспечение вычислительной техники и автоматизированных систем»
Группа 06-КП-1
Преподаватель Осадчая Н.А.
Учащаяся Пампурина Т.В.
г.Усть-Каменогорск
2009
Министерство образования и науки Республики Казахстан
Восточно-Казахстанский государственный технический университет
им. Д.Серикбаева
Колледж ВКГТУ
Специальность 3706002 «Программное обеспечение вычислительной техники и автоматизированных систем»
ЗАДАНИЕ НА КУРСОВОЕ ПРОЕКТИРОВАНИЕ
Учащейся Пампуриной Татьяне Владимировне
Группы 06-КП-1 курса 4 .
Тема «Решение транспортной задачи
методом
Фогеля»
Выполнить следующие задания:
1. Написать программный продукт
2. Написать пояснительную записку, содержащую следующие разделы:
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1.АНАЛИТИЧЕСКАЯ ЧАСТЬ
1.1.Описание и постановка задачи
1.2. Описание и анализ математической модели
1.3.Обоснование выбора инструментальных средств
2. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ
2.1. Назначение и цель создания
2.2. Требования к системе
2.2.1 Требования к функциям системы
2.2.2.Требования к интерфейсу пользователя
2.2.3.Требования к защите информации
2.3.Перечень и описание входных данных
2.4.Руководство к использованию и эксплуатации
2.5.Результаты экспериментальной проверки
3.Охрана труда и техника безопасности
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗУЕМой литературы
ПРИЛОЖЕНИЯ
Дата выдачи задания 03.09.2008г.
Срок окончания разработки проекта 03.12.2008г.
Задание выдал преподаватель _________ Осадчая Н.А.
Содержание
Введение. 4
1 Аналитическая часть. 5
1.1 Описание и постановка задачи. 5
1.2 Описание и анализ математической модели. 5
1.3 Обоснование выбора инструментальных средств. 8
2 Технологическая часть. 9
2.1 Назначение и цель создания. 9
2.2 Требование к системе. 9
2.2.1 Требования к функциям системы.. 9
2.2.2 Требования к интерфейсу пользователя. 9
2.2.3 Требования к защите информации. 9
2.3 Перечень и описание входных данных. 10
2.4 Руководство к использованию и эксплуатации. 10
2.5 Результаты экспериментальной проверки. 14
3 Охрана труда и техника безопасности. 15
Заключение. 17
Список литературы.. 18
Приложения А Текст программы.. 19
Введение
Исторически математическая экономика началась с моделей простого и расширенного воспроизводства. В них отражались потоки денег и потоки товаров и продуктов. Это, например, модель Ф. Кенэ. Позднее эти модели подробно и более глубоко изучались в экономической кибернетике - здесь можно указать на работы О. Ланге. Рассмотрены схемы денежных и материальных потоков, обеспечивающих простое и расширенное воспроизводство, их идентификацию, модели математической статистики. Далее возникли концепции производственных функций, предельных и маргинальных значений, предельных полезностей и субъективных полезностей. Дальнейшее развитие - в рамках линейного и выпуклого программирования, выпуклого анализа, развитие тонких техник моделирования: имитационное моделирование, экспертные системы, нейронные сети.
Транспортная задача линейного программирования получила в настоящее время широкое распространение в теоретических обработках и практическом применении на транспорте и в промышленности. Особенно важное значение она имеет в деле рационализации поставок важнейших видов промышленной и сельскохозяйственной продукции, а также оптимального планирования грузопотоков и работы различных видов транспорта.
1 Аналитическая часть1.1 Описание и постановка задачи
Транспортная задача – это задача о наиболее экономном плане перевозок однородного продукта из пунктов производства (станций отправления) в пункты потребления (станции назначения).
Общая формулировка.
Некоторый однородный продукт производится в m пунктах производства A1, А2,…,Am. Задан объём производства ai пункта Ai (). Произведённый продукт должен быть перевезён в n пунктов потребления B1, B2, …,Bn. Известен спрос bj пункта Bj (). Заданы также транспортные издержки Cij, связанные с перевозкой единицы продукта из пункта Ai в пункт Bj. Требуется составить план перевозок, обеспечивающий при минимальных транспортных расходах удовлетворение спроса всех пунктов потребления за счёт продукта, произведённого во всех пунктах производства.
1.2 Описание и анализ математической модели
В поставленной задаче обозначив через хij количество единиц груза, запланированных к перевозке от i-го поставщика к j-му потребителю, сведём задачу в так называемую матрицу планирования, представленную в таблице 1.1
Таблица 1.1
Поставщики | Потребители | Запасы | ||||||||
B1 | … | Bj | … | Bn | ||||||
A1 | | x11 | | | x1j | | | x1n | a 1 | |
c11 | | … | c1j | | … | c1n | | |||
… | … | … | … | … | … | … | ||||
Ai | | xi1 | | | xij | | | xin | ai | |
ci1 | | … | cij | | … | cin | | |||
… | … | … | … | … | … | … | ||||
Am | | xm1 | | | xmj | | | xmn | am | |
cm1 | | | cmj | | | cmn | | |||
Потребности | b1 | … | bj | … | bn | S ai S bj | ||||
Тогда математическая формулировка транспортной задачи сводится к минимизации линейной формы
(1.1)
при ограничениях:
ограничение по запасам:
(1.2)
ограничение по потребностям:
(1.3)
xij³0 (1.4)
Различают задачи с закрытой моделью, когда Sai=Sbj и открытой моделью, когда Sai¹Sbj, т.е. баланс между запасами и потребностями отсутствует.
Необходимым и достаточным условием разрешимости транспортной задачи является равенство суммарных запасов суммарным потребностям, т.е.
(1.5)
Если , то вводят фиктивный (n+1)-й пункт назначения с потребностью и полагают ci,n+1=0, .
Если , то вводят фиктивный (m+1)-й пункт отправления с запасами и принимают cm+1,j=0, .
Основные особенности транспортной задачи:
1) ограничения заданы в виде равенств;
2) каждая неизвестная входит лишь в 2 уравнения;
3) коэффициенты при неизвестных равны 1.
И хотя транспортная задача относится к задачам линейного программирования, в связи с вышеперечисленными особенностями для её решения созданы специальные алгоритмы.
Решение транспортной задачи разбивается на 2 этапа:
1) Определение начального опорного плана.
2) Улучшение опорного плана.
Опорный план называется невырожденным, если содержит ровно (m+n-1) перевозку. Если перевозок меньше, чем m+n-1, то это вырожденный опорный план.
Для решения транспортной задачи используют различные методы, такие как: метод северо-западного угла, метод минимальной стоимости, метод Фогеля и метод потенциалов.
В данном курсовом проекте для решения транспортной задачи используется метод минимальной стоимости, а оптимизация опорного плана производиться методом потенциалов.
Был выбран метод потенциалов, т.к. этот метод производит улучшение опорного плана.
В методе Минимальной стоимости для отыскания опорного плана необходимо просмотреть всю матрицу стоимостей и выбрать наименьшую стоимость. Если таких стоимостей окажется несколько, то выбрать ту из них, в столбце или строке которой имеется наибольшая стоимость. Разместить в соответствующую клетку наибольшее возможное количество груза, при этом строка или/и столбец выпадает из дальнейших расчётов. С оставшимися стоимостями произвести те же действия. По окончании расчётов проверить правильность размещения перевозок в соответствии с отграничениями по запасам и по потребностям, посчитать стоимость перевозки.
Метод потенциалов можно применить только к невырожденному опорному плану. Если план вырожден, то его можно дополнить необходимым количеством нулевых перевозок.
Алгоритм метода потенциалов.
1) Любым методом построить опорный план, убедиться, что он невырожденный.
2) Каждому поставщику Ai
поставить в соответствие некоторый потенциал ui, а каждому потребителю Bj
– потенциал pj.
3) Для каждой перевозки опорного плана составить сумму потенциалов, приравнять её к стоимости перевозки: ui
+
pj
=с
ij. Таким образом будет получена система (m
+
n
-1) уравнений с (m
+
n) неизвестными. Такая система имеет бесконечное множество решений.
4) Выделить одно из возможных решений системы, присвоив любому из неизвестных произвольное значение. Из полученных значений потенциалов составить матрицу :
5) Вычислить max
(-
cij
). Если max
(-
cij)=0, то вычисления прекращаются и последний план является оптимальным. В противном случае в ячейку, соответствующую максимальной разности, ввести перевозку Q
>0. Чтобы не нарушился баланс перевозок, нужно отнять и прибавить Q в строках и столбцах так, чтобы по стокам и столбцам суммы Q были равны 0.
6) Выписать все разности, содержащие Q и присвоить Q значение наименьшего из уменьшаемых. Пересчитать опорный план с учётом полученного значения Q, проверить правильность размещения перевозок в соответствии с отграничениями по запасам и по потребностям, посчитать стоимость перевозки. При этом стоимость перевозки в каждой следующей таблице не должна превышать стоимости из предыдущей таблицы.
7) Убедиться, что опорный план невырожден (или привести его к невырожденному виду) и перейти к п.2.
По окончании расчётов проверить правильность размещения перевозок в соответствии с отграничениями по запасам и по потребностям, посчитать стоимость перевозки.
Пример решения транспортной задачи методом Фогеля представленный в таблице 1.2
Таблица 1.2
1.3 Обоснование выбора инструментальных средств
Для написания программы, позволяющей решить данную проблему, был выбран язык Delphi (а именно Borland Delphi 7.0). Причины такого выбора представлены ниже:
·
·
· В высших учебных заведениях и колледжах очень популярен язык Delphi, так как он является модернизированным «потомком» языка Pascal, широко применяемого во многих школах и лицеях, в качестве обучающего языка программирования.
· Создаваемые с его помощью программы могут работать не только под управлением Windows, а сама она относится к классу инструментальных средств ускоренной разработки программ.
· Визуальное конструирование форм избавляет программиста от многих аспектов разработки интерфейса программы, так как Delphi автоматически готовит необходимые программные заготовки и соответствующий файл ресурсов. Программист использует специальное окно, которое называется окном формы, как прототип будущего окна программы и наполняет его компонентами, реализующими нужные интерфейсные свойства (разного рода списки, кнопки, полосы прокрутки и т.п.). После размещения на форме очередного компонента, Delphi автоматически вставляет в связанный с формой модуль ссылку на компонент, и корректирует специальный файл описания формы с расширением DFM, который после компиляции преобразуется в ресурсный файл Windows.
· Использование компонентов не только во много раз сокращает сроки разработки программ, но и существенно снижает вероятность случайных ошибок, от которых, увы, не защищен ни один крупный программный проект. Однако в их применении есть оборотная сторона. Как правило, даже простые в функциональном отношении компоненты представляют лишь «вершину айсбергов» так как они создаются по объектно-ориентированной технологии и многие их функциональные черты наследуются от многочисленных родительских компонентов. В результате даже несложные программы, созданные в Delphi, редко имеют объем меньше сотен килобайт.
· Во всех случаях Delphi имеет самый быстрый среди продуктов подобного рода оптимизирующий компилятор, позволяющий создавать быстрые и относительно компактные программы.
2 Технологическая часть2.1 Назначение и цель создания
Главной задачей было изучение темы «Решение транспортной задачи методом Фогеля». Задача была предложена в качестве темы для курсового проекта по предмету «Моделирование производственных и экономических процессов». Так же целью создания программы было практическое закрепление навыков программирования и изучение языка Delphi.
2.2 Требование к системе
2.2.1 Требования к функциям системы
Программа предназначена для использования на ПК.
Для выполнения корректной работы этой программы необходимы:
1) Процессор не ниже Pentium 2;
2) Операционная система Windows 95, 98, 2000, XP;
3) Оперативная память не меньше 125 Мб;
4) Клавиатура, мышь;
5) Цветной монитор SVGA.
2.2.2 Требования к интерфейсу пользователя
Требования, предъявляемые к интерфейсу пользователя, приведены ниже:
· Программа содержит несколько рабочих форм, на которых расположены все функциональные элементы, что очень удобно и просто.
· Программа содержит эргономичный интерфейс, что позволяет каждому пользователю без предварительного обучения работать с этим приложением.
· В данной программе была создана детальная, предельно понятная справочная система, которая описывает все этапы работы с программой, от введения исходных значений, до выхода из программы.
2.2.3 Требования к защите информации
Программа проверяет правильность введенных пользователем значений, а именно не даст решить задачу при неверно введенных данных таких как, например: буква вместо числа, любой знак вместо числа, так же пока таблица не будет заполнена полностью. Если количество потребностей не равно количеству запасов, то добавляется строка или столбец, для того чтобы уровнять запасы и потребности.
2.3 Перечень и описание входных данных
В качестве входных данных для программы выступают следующие элементы:
1) Количество поставщиков
2) Количество потребителей
3) Количество запасов и потребностей
4) Стоимости перевозок
2.4 Руководство к использованию и эксплуатации
Для того чтобы установить программу необходимо запустить файл программы инсталлятора
Setup
.
exe
. После запуска файла появится окно, показанное на рисунке 2.1.
Рисунок 2.1 – Запуск инсталлятора.
Для запуска установки необходимо следовать инструкции программы.
Для запуска программы необходимо запустить ярлык с рабочего стола «Метод Фогеля.exe»
Общий вид меню программы приведен на рисунке 2.2.
Рисунок 2.2 – Общий вид окна заставки программы.
Для входа в главное окно программы необходимо кликнуть мышью на клавишу «Вход». Далее откроется окно программы, на которой будут происходить расчеты. Общий вид окна программы приведен на рисунке 2.3 ниже.
|
Рисунок 2.3 – Общий вид окна программы.
Ниже описаны основные элементы окна программы:
1) Кнопка «Задать размер». После нажатия клавиши на экране видим окно, в котором задается количество поставщиков и потребителей (смотреть Рисунок 2.4).
Рисунок 2.4 – Окно ввода количества поставщиков и потребителей.
2) Кнопка «Посчитать», производит вычисления, появляется после задания размера матрицы перевозок.
3) Кнопка «Очистить таблицу», очищает поля таблицы от данных.
4) Кнопка «О программе» выводит данные о создателях приложения (смотреть рисунок 2.5).
Рисунок 2.5 – О программе.
5) Кнопка «Меню». После нажатия клавиши появляется меню, имеющие кнопки: «Помощь» - выводит файл справку, «Выход» - закрывает приложение.
6) Таблица ввода дынных.
Просмотр результата выполнения программы после нажатия кнопки «Посчитать». Полученный опорный будет выведен в таблицу ввода первоначальных данных. Общий вид ответа приведен на рисунке 2.6 ниже.
Рисунок 2.6 – Просмотр ответа.
Ниже приведены этапы работы с программой:
1) Ввод количества строк и столбцов.
2) Заполнение таблицы стоимостей перевозок, ввод количества запасов и потребностей.
3) Расчет опорного плана перевозок методом Фогеля.
Просмотр справки вызывается нажатием кнопки «Справка» в главном меню. Она содержит подробное описание работы с программой. Общий вид справки приведен на рисунке 2.7 ниже.
Рисунок 2.7 – Справка.
2.5 Результаты экспериментальной проверки
После окончательной отладки программы была произведена серия тестов на решение задач автоматически и вручную. Результаты работы программы совпали с результатами, вычисленными вручную, что подтверждает правильность работы программы.
3 Охрана труда и техника безопасности
1) Инструкция предназначена для пользователей персональных компьютеров.
2) К работе с персональным компьютером допускаются лица, имеющие персональные навыки, изучившие руководство по эксплуатации персонального компьютера и знающие порядок включения и отключения электронных устройств; прошедшие вводный инструктаж, а также инструктаж по безопасности труда непосредственно на рабочем месте.
3) Профессиональные пользователи должны проходить обязательные предварительные (при поступлении на работу) и периодические медосмотры.
4) К непосредственной работе с персональным компьютером допускаются лица, не имеющие медицинских противопоказаний.
5) Работающие с персональным компьютером, обязаны:
· выполнять правила внутреннего распорядка, требования настоящей инструкции, и инструкции по эксплуатации правила электро-пожарной безопасности;
· знать принцип работы компьютера и методику правильной его эксплуатации;
· знать возможные вредные производственные факторы, характерные для работы с компьютером (воздействие электромагнитного и электростатического полей, переутомление зрения, снижение его остроты и др.);
· сообщать руководителю работ или техническому персоналу обо всех неполадках в работе компьютера;
· знать приемы освобождения от действия электрического тока лиц, попавших под напряжение, и способы оказания им первой помощи;
· знать расположение средств пожаротушения и уметь ими пользоваться.
6) Следует иметь в виду, что:
· расстояние между рабочими столами с компьютерами в направлении тыла поверхности одного видеомонитора и экрана другого видеомонитора должно быть не менее
· чтобы освещение не создавало слепящих бликов на клавиатуре и других устройствах ввода командной информации, компьютер должен быть расположен так, чтобы прямой свет не попадал на экран, иначе при работе с монитором будут быстро уставать глаза. Операторы не должны сидеть лицом к окнам;
· верхний край экрана следует располагать на уровне глаз или чуть ниже;
· оптимальное расстояние от глаз до экрана 600-
· высота клавиатуры должна быть отрегулирована так, чтобы кисти рук держались прямо (возможно применение подставок для кистей рук);
· с целью снижения статического напряжения мышц шейно-плечевой области и спины для предупреждения развития утомления необходимо, чтобы рабочий стул (кресло) позволял изменять позу, был подъемно-поворотным и регулируемым по высоте и углам наклона сидения и спинки от переднего сидения;
· кабели компьютера должны располагаться так, чтобы их нельзя было повредить неосторожным движением;
· для предотвращения образования и защиты от статического электричества, в помещении, где установлен компьютер, необходимо применять нейтрализаторы и увлажнители. Должна быть эффективная вентиляция и поддерживаться относительная влажность воздуха на уровне 40-60% (можно разместить вблизи компьютера цветы или аквариум).
7) Для обеспечения оптимальной работоспособности и сохранения здоровья профессиональных пользователей на протяжении рабочей смены должны устанавливаться регламентированные перерывы. Продолжительность непрерывной работы с персональным компьютером без регламентированного перерыва не должна превышать 2 часов.
8) При работе с персональным компьютером в ночную смену (c 22 до 6 час.), независимо от категории и вида трудовой деятельности, продолжительность регламентированных перерывов должна увеличиваться на 60 мин.
9) Невыполнение требований настоящей инструкции является нарушением производственной дисциплины. Виновные в этом несут ответственность в порядке, установленном действующим законодательством.
Заключение
В процессе выполнения курсового проекта была написана программа для решения транспортной задачи методом Фогеля, с использованием ЭВМ. Был глубоко изучен язык программирования DELPHI, многие его компоненты и закреплены навыки объектно-ориентированного программирования. Так же была изучена тема «Решение транспортной задачи методом Фогеля».
Курсовой проект состоит из двух частей – пояснительной записки, в корой рассмотрены все теоретические сведения, и программы, позволяющей автоматизировать процесс построения опорного плана методом Фогеля.
Список литературы
1. Исследование операций под редакцией Кремера
2. А.И. Ларионов, А.В. Юрченко – Экономико-математические методы в планировании
3. Н.Ш. Кремер - Математическое моделирование и модели в планировании
4. С. Вентцель - Исследование операций
5. А. Калихман - Сборник задач по математическому программированию
6. Н.А.Осадчая – Моделирование производственных и экономических процессов, курс лекций, колледж ВКГТУ, Усть-Каменогорск, 2007 / с.
7. Гофман В.Э., Мещеряков Е., Никифоров В.В., Хомоненко А.Д. Delphi 7 в подлиннике;
8. Баженова И.Ю. Delphi 7: Самоучитель программиста;
9. Белов В.В., Чистякова В.И. Программирование в Delphi: процедурное, объектно-ориентированное;
10. А.Н. Вальвачев, К.А. Сурков, Д.А. Сурков, Ю.М. Четырько. Программирование на языке Delphi. Учебное пособие. — 2005.;
11. Фленов Михаил - Библия Delphi 2007
Приложения А
Текст программы
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1, Unit5;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
form3.Hide;
form1.show;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
Close;end;
procedure TForm3.Button3Click(Sender: TObject);
begin
Application.HelpContext(0);
end;end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, Buttons, ShellAPi, ComCtrls, jpeg;
type
TForm1 = class(TForm)
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
StringGrid2: TStringGrid;
StringGrid1: TStringGrid;
StringGrid3: TStringGrid;
Button4: TButton;
Button3: TButton;
Image1: TImage;
Label4: TLabel;
Label6: TLabel;
Label3: TLabel;
Label5: TLabel;
Button5: TButton;
procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
procedure Button1Click(Sender: TObject);
procedure draw(pos,vert,hor:integer);
procedure shag1;
procedure shag3;
procedure shag4;
procedure shag5;
procedure shag6;
procedure shag8;
procedure shag0;
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
mass1:array[1..20,1..20] of integer;
stolb,strok,c1,c2,c3,c4,k,p,smin,o,o1:integer;
prv,prv2,prv3:boolean;
implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *.dfm}
//Вывод ошибки «только цифры»
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
ARow: Integer; const Value: String);
begin
if value<>'' then
try
mass1[acol,arow]:=strtoint(value);
except on Econverterror do begin showmessage(Только цифры!!!'); stringgrid1.cells[acol,arow]:=' '; end;end;
end;
// Кнопка посчитать
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
for o:=0 to 0 do begin
if p=1 then begin
for i:=1 to strok do
for j:=1 to stolb do
stringgrid1.Cells[j,i]:=inttostr(mass1[j,i]);
end;
shag0;
k:=0;
prv3:=false;
shag5;
if prv2=true then begin
shag1;
if prv3=false then begin
shag4;
while prv=false do
case o of
0:shag8;
end;
timer1.Enabled:=true;
shag6;
end;
end else showmessage(‘Запасы не равны потребностям');
p:=1;
end;
end;
//Загрузка картинок
procedure TForm1.draw(pos,vert,hor:integer);
var
B : TBitmap;
begin
B := TBitmap.Create;
if pos=1 then
B.LoadFromFile ('1.bmp') else B.LoadFromFile ('2.bmp');
form1.stringGrid1.Canvas.CopyRect(form1.stringGrid1.CellRect(vert, hor),
b.Canvas, Rect(0, 0, b.Height, b.Width));
end;
procedure TForm1.shag1;
var i,j:integer;
begin
try
for i:=1 to strok do
for j:=1 to stolb do
mass1[j,i]:=strtoint(stringgrid1.Cells[j,i]);
except on Econverterror do begin showmessage(Запасы не равны потребностям ');
prv3:=true;end;end;
for i:=1 to strok do
for j:=1 to stolb do
stringgrid1.Cells[j,i]:='';
end;
// Координаты чисел
procedure TForm1.shag3;
var i,j:integer;
buf:string;
begin
for i:=1 to strok do
for j:=1 to stolb do begin
if StringGrid1.cells[j,i]='-' then draw(2,j,i) else
begin draw(1,j,i);StringGrid1.Canvas.textout(j*51+34,
i*51+5,StringGrid1.Cells[j,i]);end;
StringGrid1.Canvas.textout(j*51+10,
i*51+30,inttostr(mass1[j,i]));end;
end;
//Кнопка очистить таблицу
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
timer1.Enabled:=false;
for i:=1 to strok+1 do
for j:=1 to stolb+1 do
stringgrid1.Cells[j,i]:='';
button1.Enabled:=true;
timer1.Interval:=1;
end;
procedure TForm1.shag4;
var
begin
for i:=1 to strok do
for j:=1 to stolb do
if stringgrid1.Cells[j,i]='' then inc(
if
end;
// Заполнение запасов и потребностей
procedure TForm1.shag5;
var i,j,zap,potr:integer;
begin
zap:=0;potr:=0;
for i:=1 to strok+1 do
for j:=1 to stolb+1 do begin
if (i=strok+1) and (j<>stolb+1) then zap:=zap+strtoint(stringgrid1.Cells[j,i]);
if (j=stolb+1) and (i<>strok+1) then potr:=potr+strtoint(stringgrid1.Cells[j,i]);end;
if zap=potr then begin prv2:=true;stringgrid1.Cells[stolb+1,strok+1]:=inttostr(zap)+'='+inttostr(potr);end end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
shag3;
timer1.Interval:=10000;end;
//Проверяет вырожденный или невырожденный
procedure TForm1.shag6;
var i,j,sc,col:integer;
begin
sc:=0;
col:=0;
for i:=1 to strok do
for j:=1 to stolb do
if stringgrid1.cells[j,i]<>'-' then
begin inc(sc);col:=col+strtoint(stringgrid1.cells[j,i])*mass1[j,i];end;
if sc=(strok+stolb-1) then
label5.Caption:='невырожденный' else label5.Caption:='вырожденный';
label6.Caption:=inttostr(col);
if col<smin then begin smin:=col;o1:=o;end;
end;
// Алгоритм Метода Фогеля
procedure TForm1.shag8;
var i,j,min,x,y,zapas,potreb,lol,max1,max2:integer;
begin
{ýòàï 1}
min:=100;
for i:=1 to strok do begin
for j:=1 to stolb do
if (mass1[j,i]<min) and (stringgrid1.cells[j,i]='') then begin min:=mass1[j,i];x:=i;y:=j;end;
stringgrid3.Cells[k,i-1]:=inttostr(min);
min:=100;
end;
min:=100;
for j:=1 to stolb do begin
for i:=1 to strok do
if (mass1[j,i]<min) and (stringgrid1.cells[j,i]='') then begin min:=mass1[j,i];end;
stringgrid2.Cells[j-1,k]:=inttostr(min);
min:=100;
end;
min:=100;
for i:=1 to strok do begin
for j:=1 to stolb do
if (mass1[j,i]<min)and (stringgrid1.cells[j,i]='')then begin if mass1[j,i]<>strtoint(stringgrid3.Cells[k,i-1]) then min:=mass1[j,i];end;
stringgrid3.Cells[k,i-1]:=inttostr(abs(strtoint(stringgrid3.Cells[k,i-1])-min));
min:=100;
end;
min:=100;
for j:=1 to stolb do begin
for i:=1 to strok do
if (mass1[j,i]<min)and (stringgrid1.cells[j,i]='') then begin if mass1[j,i]<>strtoint(stringgrid2.Cells[j-1,k]) then min:=mass1[j,i];end;
stringgrid2.Cells[j-1,k]:=inttostr(abs(strtoint(stringgrid2.Cells[j-1,k])-min));
min:=100;
end;
{ýòàï 2}
max1:=0;
for j:=1 to stolb do if strtoint(stringgrid2.Cells[j-1,k])>max1 then begin max1:=strtoint(stringgrid2.Cells[j-1,k]);y:=j;end;
for i:=1 to strok do if strtoint(stringgrid3.Cells[k,i-1])>max2 then begin max2:=strtoint(stringgrid3.Cells[k,i-1]);x:=i;end;
zapas:=mass1[stolb+1,x];
potreb:=mass1[y,strok+1];
lol:=zapas-potreb;
if lol=0 then begin
mass1[stolb+1,x]:=0;
mass1[y,strok+1]:=0;
for i:=1 to strok do
for j:=1 to stolb do
if (i=x) or (j=y) then
if stringgrid1.Cells[j,i]='' then begin stringgrid1.Cells[j,i]:='-';end;
stringgrid1.Cells[y,x]:=inttostr(zapas);
end;
if lol>0 then begin
mass1[stolb+1,x]:=lol;
mass1[y,strok+1]:=0;
for i:=1 to strok do
for j:=1 to stolb do
if (j=y) then
if stringgrid1.Cells[j,i]='' then begin stringgrid1.Cells[j,i]:='-';end;
stringgrid1.Cells[y,x]:=inttostr(zapas-lol);
end;
if lol<0 then begin
mass1[stolb+1,x]:=0;
mass1[y,strok+1]:=abs(lol);
for i:=1 to strok do
for j:=1 to stolb do
if (i=x) then
if stringgrid1.Cells[j,i]='' then begin stringgrid1.Cells[j,i]:='-';end;
stringgrid1.Cells[y,x]:=inttostr(zapas);
end;
shag4;inc(k);
end;
procedure TForm1.shag0;
var i,j,zap,potr:integer;
begin
zap:=0;potr:=0;
try
for i:=1 to strok+1 do
for j:=1 to stolb+1 do begin
if (i=strok+1) and (j<>stolb+1) then zap:=zap+strtoint(stringgrid1.Cells[j,i]);
if (j=stolb+1) and (i<>strok+1) then potr:=potr+strtoint(stringgrid1.Cells[j,i]);end;
except on Econverterror do begin showmessage(Таблица заполнена не полностью!!!');
prv3:=false;
end;
end;
if potr>zap then begin
stringgrid1.ColCount:=stringgrid1.ColCount+1;
stolb:=stolb+1;
for i:=1 to strok do stringgrid1.Cells[stolb+1,i]:=stringgrid1.Cells[stolb,i];
for i:=1 to strok do stringgrid1.Cells[stolb,i]:='0';
stringgrid1.Cells[stolb,strok+1]:=inttostr(potr-zap);
stringgrid1.Cells[stolb,0]:='B'+inttostr(stolb);
stringgrid1.Cells[stolb+1,0]:='ÇÀÏ.';
prv2:=true;
form1.width:=form1.width+51;
stringgrid1.width:= stringgrid1.width+51;
Label3.Top:=70+StringGrid1.Height;
Label4.Top:=38+StringGrid1.Height;
Label5.Top:=70+StringGrid1.Height;
Label6.Top:=38+StringGrid1.Height;
end;
if potr<zap then begin
stringgrid1.RowCount:=stringgrid1.RowCount+1;
strok:=strok+1;
for i:=1 to stolb do stringgrid1.Cells[i,strok+1]:=stringgrid1.Cells[i,strok];
for i:=1 to stolb do stringgrid1.Cells[i,strok]:='0';
stringgrid1.Cells[stolb+1,strok]:=inttostr(zap-potr);
stringgrid1.Cells[0,strok]:='A'+inttostr(strok);
stringgrid1.Cells[0,strok+1]:='ÏÎÒÐ.';
prv2:=true;
form1.Height:=form1.Height+51;
stringgrid1.Height:=stringgrid1.Height+51;
Label3.Top:=70+StringGrid1.Height;
Label4.Top:=38+StringGrid1.Height;
Label5.Top:=70+StringGrid1.Height;
Label6.Top:=38+StringGrid1.Height;
end;
for j:=1 to strok+1 do
for i:=1 to stolb+1 do begin
if (j=strok+1) and (i=stolb+1) then stringgrid1.cells[i,j]:='0';
mass1[i,j]:=strtoint(stringgrid1.cells[i,j]); end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
form4.show;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form3.Show;
Form1.Hide;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Form5.show;
Form1.Hide;
end;end.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm4 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var i,j,c1,c2,c3,c4:integer;
begin
try
Form1.Timer1.Enabled:=false;
for i:=1 to strok+1 do Form1.stringgrid1.rows[i].clear;
for i:=1 to stolb+1 do Form1.stringgrid1.cols[i].clear;
strok:=strtoint(edit2.Text);
stolb:=strtoint(edit1.Text);
Form1.stringgrid1.colcount:=stolb+2;
Form1.stringgrid1.rowcount:=strok+2;
for i:=1 to strok do Form1.stringgrid1.rows[i].Add('A'+inttostr(i));
for i:=1 to stolb do Form1.stringgrid1.cols[i].Add('B'+inttostr(i));
Form1.stringgrid1.rows[strok+1].Add('Потр.');
Form1.stringgrid1.cols[stolb+1].Add('Зап.');
Form1.button1.Enabled:=true;
Form1.button2.Enabled:=true;
Form1.Show;
Form4.Hide;
except on econverterror do
showmessage('Одно или несколько полей являются не заполненными !!!');end;end;
procedure TForm4.Button2Click(Sender: TObject);
begin
Close;end;end.
unit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm5 = class(TForm)
Image1: TImage;
procedure FormClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Image1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form5: TForm5;
implementation
uses Unit3, Unit1;
{$R *.dfm}
procedure TForm5.FormClick(Sender: TObject);
begin
Close;
end;
procedure TForm5.Button1Click(Sender: TObject);
begin
Form3.Show;
Form5.Hide;end;
procedure TForm5.Image1Click(Sender: TObject);
begin
Form1.Show;
Form5.Hide;
end;
end.