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

Транспортная задача как одна из самых распространенных специальных задач линейного программирования: понятие, основное назначение. Формальное описание метода минимального элемента. Характеристика этапов разработки алгоритма решения поставленной задачи.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 19.10.2012
Размер файла 713,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Введение

транспортный линейный программирование

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

Первая строгая постановка транспортной задачи принадлежит Хичкоку, и поэтому в зарубежной литературе иногда ее называют проблемой Хичкока.

Первый точный метод решения транспортной задачи разработан советскими учеными Л.В. Канторовичем и М.К. Гавуриным.

1.Аналитическая часть

1.1 Описание и постановка задачи

Пусть в пунктах А1, А2, …, Аm производят некоторый однородный продукт, причем объем производства в пункте Аi составляет ai единиц (i = 1, 2, …, m). Допустим, что данный продукт потребляют в пунктах В1, …, Вn, а объем потребления в пункте Вj составляет bj единиц (j = 1, 2, …, n).

Предположим, что из каждого пункта производства возможна транспортировка продукта в любой пункт потребления. Транспортные издержки по перевозке из пункта Аi в пункт Вj единицы продукции равны cij (i = 1, 2, …, m; j = 1, 2, …, n).

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

Условия транспортной задачи удобно представить в следующем виде:

Пусть xij - количество продукта, перевозимого из пункта Аi в пункт Вj. Требуется определить множество переменных xij>0 (i = 1, 2, …, m; j = 1, 2, …, n), удовлетворяющих условиям

(i = 1, 2, …, m), (1.1)

(j = 1, 2, …, n), (1.2)

и таких, что целевая функция достигает минимума.

(1.3)

Таблица 1.1 - Табличная форма записи условий транспортной задачи

Условие (1.1) гарантирует полный вывоз продукта из всех пунктов производства, а условие (1.2) означает полное удовлетворение спроса во всех пунктах потребления.

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

В открытой форме эти суммы не равны.

Необходимым и достаточным условием разрешимости транспортной задачи является равенство:

Если , то вводят фиктивный (n+1) пункт назначения с потребностью и полагают .

Если , то вводят фиктивный (m+1) пункт назначения с запасами и полагают .

1.2 Описание и анализ математической модели

Решение транспортной задачи распадается на два этапа: нахождение опорного плана, улучшение опорного плана.

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

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

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

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

Возможны три случая:

· если , то оставшуюся часть -й строки заполняем нулями;

· если , то оставшуюся часть -го столбца заполняем нулями;

· если , то оставшуюся часть строки и столбца заполняем нулями.

Далее этот процесс повторяют с незаполненной частью матрицы.

Пусть элементом с -ым порядковым номером оказался . Тогда ,

, g = 1, …, (k - 1);

, l = 1, …, (k - 1).

Возможны два случая:

· , тогда и оставшуюся часть строки заполняют нулями;

· , тогда и остаток столбца заполняют нулями.

1.3 Обоснование выбора инструментальных средств

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

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

Delphi -- язык и среда программирования, относящаяся к классу RAD- (Rapid Application Development _ «Средство быстрой разработки приложений») средств CASE - технологии. Delphi сделала разработку мощных приложений Windows быстрым процессом, доставляющим вам удовольствие. Приложения Windows, для создания которых требовалось большое количество человеческих усилий, например в С++, теперь могут быть написаны одним человеком, использующим Delphi.

Delphi обладает широким набором возможностей, начиная от проектировщика форм и заканчивая поддержкой всех форматов популярных баз данных. Среда устраняет необходимость программировать такие компоненты Windows общего назначения, как метки, пиктограммы и даже диалоговые панели. Работая в Delphi, вы неоднократно видели одинаковые «объекты» во многих разнообразных приложениях. Диалоговые панели (например, Choose File и Save File) являются примерами многократно используемых компонентов, встроенных непосредственно в Delphi, которая позволяет приспособить эти компоненты к имеющейся задаче, чтобы они работали именно так, как требуется создаваемому приложению. Также здесь имеются предварительно определенные визуальные и невизуальные объекты, включая кнопки, объекты с данными, меню и уже построенные диалоговые панели. С помощью этих объектов можно, например, обеспечить ввод данных просто несколькими нажатиями кнопок мыши, не прибегая к программированию. Это наглядная реализация применений CASE-технологий в современном программировании приложений. Та часть, которая непосредственно связана с программированием интерфейса пользователя с системой, получила название визуальное программирование.

2.Технологическая часть

2.1 Назначение и цель создания

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

Задание на разработку программного продукта было выдано преподавателем колледжа ВКГТУ Осадчей Н.А.. Программный продукт должен быть разработан в срок с пятого сентября до двадцать шестого октября две тысячи пятого года.

2.2 Требования к системе

2.2.1Требования к функциям системы

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

2.2.2 Требования к интерфейсу пользователя

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

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

· Процессор Celeron 1200 и выше;

· ОЗУ - 128 Мб и выше;

· Цветовая гамма - 32 бита;

· Занимаемое место на НЖМД -

· Монитор;

· Клавиатура;

· Манипулятор «Мышь»;

· 19,9 Mb свободного места на диске.

2.2.3 Требования к защите информации

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

· Ввести количества поставщиков и потребителей;

· Заполнить таблицу с условиями задачи. Выбрать путь заполнения вручную или выбрать путь заполнения случайными числами;

· Вывести в таблицу с результатом ответ на введенную транспортную задачу;

· Выйти из программы или начать алгоритм заново.

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

2.3 Перечень и описание входных данных

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

· Количество поставщиков;

· Количество потребителей;

· Стоимость перевозок;

· Количество запасов на каждом из пунктов отправления;

· Количество потребностей на каждом пункте назначения.

Все перечисленные выше пункты списка являются числами.

2.4 Руководство к использованию

При входе в программу появляется окошко, которое является окном запроса пароля.

В поле вводится пароль, заменяемый в самом поле ввода на знаки «*». После этого нажимается кнопка «Да», которая выполняет вход в программу. Нажатие кнопки «Нет» на данном этапе приведет к выходу из программы. При первом входе в программу пароля нет, то есть ничего в поле ввода пароля вводить не надо. Но при помощи кнопки «Смена пароля» можно ввести и изменить пароль. В поле ввода «Старый пароль» вводится старый пароль, в поля ввода «Новый пароль» и «Подтверждение» необходимо ввести тот пароль, который Вы хотели бы поставить при входе в программу (см. приложение А, рисунок 1).

После нажатия кнопки «Да» в окне входа в программу на экране появляется заставка, и далее появляется рабочее окно (см. приложение А, рисунок 2).

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

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

Если Вы остановите свой выбор на кнопке «Заполнить случайно», то это приведет к тому, что таблица исходных данных будет заполнена случайными числами, причем транспортная задача будет иметь закрытую форму. При нажатии кнопки «Заполнить случайно» автоматически независимый переключатель становится неактивным, а кнопка «Результат» активируется (см. приложение А, рисунок 3).

Если Вы щелкните по независимому переключателю, тем самым, поставив галочку, то дезактивируется кнопка «Заполнить случайно», а активной станет кнопка «Создать шапку таблицы». Ее нажатие приведет к созданию шапки таблицы и открытию полей таблицы для редактирования, а также станет активной кнопка «Принять данные» (см. приложение А, рисунок 4).

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

В случае, когда программа обнаружит, что суммы запасов и потребностей не равны, она выдаст запрос о том, что ей делать (см. приложение А, рисунок 6).

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

После того, как данные были приняты программой, активной становиться кнопка «Результат», а кнопка «Принять данные» дезактивируется.

Нажатие кнопки «Результат» приведет к появлению в таблице результата ответа на поставленную задачу, а в поле «Стоимость перевозок» появиться сумма затрат на перевозки (см. приложение А, рисунок 7).

Далее неактивной станет кнопка «Результат», а активируется кнопка «Заново». Нажатие кнопки заново приведет обращению рабочего окна в изначальную форму.

2.5 Результаты экспериментальной проверки

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

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

3.Охрана труда и техники безопасности

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

ЭВМ устанавливается и размещается в соответствии с требованиями технических условий заводов-изготовителей. Минимальная ширина проходов между компьютерами должна быть не менее одного метра. Рабочее место с дисплеями должно располагаться на расстоянии не менее 1,5 метра.

Площадь помещения для работающего на персональном компьютере из расчета на одного человека - не менее 6 квадратных метров, кубатура - 19,5 кубических метров, с учетом максимального числа одновременно работающих.

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

Конструкция рабочей мебели (столы, кресла, стулья) должны обеспечивать возможность индивидуальной регулировки соответственно росту работающего и создавать удобную позу. Часто используемые предметы труда (документы, клавиатура, дисплей, принтер) должны находиться в оптимальной рабочей зоне. Рабочее место для выполнения работ в положении сидя должно соответствовать требованиям ГОСТ и технической эстетики. В конструкции его элементов необходимо учитывать характер работы, психологические особенности и антропометрические данные человека.

Рабочий стол должен регулироваться по высоте в пределах 680-760 мм, при отсутствии такой возможности 720 мм, оптимальные размеры рабочей поверхности столешницы 1600900 мм. Под столешницей рабочего стола должно быть свободное пространство для ног с размерами по высоте не менее 600 мм, по ширине - 500 мм, по глубине - 650 мм.

Рабочий стул (кресло) должен быть снабжен подъемно-поворотным устройством, обеспечивающим регуляцию высоты сидения и спинки, его конструкции должна предусматривать также изменение угла наклона спинки. Рабочее кресло должно иметь подлокотники. Регулировка каждого параметра должна легко осуществляться, быть независимой и иметь надежную фиксацию. Высота поверхности сидения должна регулироваться в пределах 400-500 мм. Ширина сидения должна составлять не менее 400 мм, глубина - не менее 380 мм.

Высота опорной поверхности спинки должна быть не менее 300 мм. Ширина не менее 380 мм, радиус ее кривизны в горизонтальной плоскости 400 мм. Угол наклона спинки должен изменяться в пределах 90-110 % к плоскости сидения.

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

На рабочем месте необходимо предусматривать подставку для ног. Ее длина должна составлять 400 мм, ширина 350 мм, регулировка высоты 0-150 мм, угла наклона 0-120°.

В целях профилактики переутомления и перенапряжения при работе на ЭВМ необходимо выполнять комплексы упражнений. С целью снижения или устранения нервно - психического, зрительного и мышечного напряжения необходимо проводить сеансы психофизиологической разгрузки и снятия усталости во время регламентированных перерывов, и после окончания рабочего дня. Снижение или устранение нервно-психического, зрительного и мышечного напряжения, предупреждение переутомления и снятие усталости во время регламентированных перерывов и после окончания рабочего дня проводится в специально оборудованном помещении - комнате психологической разгрузки. Эту комнату следует располагать на расстоянии не белее 75 м от рабочих мест. Требования к оборудованию комнаты психологической разгрузки изложены в "Межотраслевых методических рекомендациях по предупреждению переутомления работников физического и умственного труда".

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

Основным перерывом является перерыв на обед. Не следует превышать темп работы порядка 10 тысяч нажатий клавиш в час (примерно 1500 слов).

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

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

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

Заключение

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

· Разработан алгоритм метода решения поставленной задачи;

· Написанная программа, пригодная для использования

Задачей данного курсового проекта являлось разработать программный продукт «Решение транспортной задачи методом минимальной стоимости» с использованием таблиц в Delphi.

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

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

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

Приложение А

Рисунок 1 - Вход в программу

Рисунок 2 - Рабочее окно

Рисунок 3 - Заполнение случайными числами

Рисунок 4 - Заполнение вручную

Рисунок 5 - Принятие данных

Рисунок 6 - Обработка открытой формы условий транспортной задачи

Рисунок 7 - Результат

Приложение В

unit Unit1_1;

interface

uses

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

Dialogs, Grids, StdCtrls, Buttons, Menus;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Button2: TButton;

StringGrid2: TStringGrid;

Edit3: TEdit;

Label3: TLabel;

GroupBox1: TGroupBox;

Button4: TButton;

CheckBox1: TCheckBox;

Button5: TButton;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N4: TMenuItem;

N8: TMenuItem;

N9: TMenuItem;

N10: TMenuItem;

PopupMenu1: TPopupMenu;

N11: TMenuItem;

N12: TMenuItem;

N13: TMenuItem;

N14: TMenuItem;

N15: TMenuItem;

N16: TMenuItem;

N17: TMenuItem;

N18: TMenuItem;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

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

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

procedure Button4Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Edit1Change(Sender: TObject);

procedure Edit2Change(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

n,m,s1,s2:integer;

ishod:array [1..100,1..100] of integer;

zap,potr:array [1..100] of integer;

s,o,q:string;

activ:integer;

VHODIM:boolean;

{ Public declarations }

end;

var

Form1: TForm1;

ac1,ac2:boolean;

implementation

uses Unit2, Unit5, Unit4;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var s1,s2,i,j,a,b:integer; s:string;

begin

Edit1.Enabled:=false;

Edit2.Enabled:=false;

Label1.Enabled:=false;

Label2.Enabled:=false;

Label3.Enabled:=true;

Edit3.Enabled:=true;

BitBtn1.Enabled:=true;N8.Enabled:=true;N13.Enabled:=true;

CheckBox1.Enabled:=false;

N5.Enabled:=false;

n:=strtoint(Edit1.Text);

m:=strtoint(Edit2.Text);

StringGrid1.ColCount:=m+2;

StringGrid1.RowCount:=n+2;

StringGrid1.FixedCols:=1;

StringGrid1.FixedRows:=1;

StringGrid1.FixedColor:=clmenu;

StringGrid2.ColCount:=m+1;

StringGrid2.RowCount:=n+1;

StringGrid2.FixedCols:=1;

StringGrid2.FixedRows:=1;

StringGrid2.FixedColor:=clmenu;

for i:=1 to n do

for j:=1 to m do

ishod[i,j]:=random(50);

while s<>'2' do

begin

for i:=1 to n do begin

a:= random(300);

s1:=s1+a;

zap[i]:=a;

StringGrid1.Cells[m+1,i]:=inttostr(zap[i]);

end;

for j:=1 to m do begin

b:= random(300);

s2:=s2+b;

potr[j]:=b;

StringGrid1.Cells[j,n+1]:=inttostr(potr[j]);

end;

if s1=s2 then s:='2' else

s1:=0; s2:=0;

end;

for i:=1 to m do begin

s:=inttostr(i);

StringGrid1.Cells[i,0]:='Пункт назначения'+s;

end;

for j:=1 to n do begin

s:=inttostr(j);

StringGrid1.Cells[0,j]:='Пункт отправления'+s;

end;

StringGrid1.Cells[m+1,0]:='Запасы';

StringGrid1.Cells[0,n+1]:='Потребности';

for i:=1 to n do

for j:=1 to m do

StringGrid1.Cells[j,i]:=inttostr(ishod[i,j]);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.Close;

form2.close;

end;

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

begin

case Key of

'0'..'9',#8: ; // цифры и <Backspase>

#13: Edit2.SetFocus; // клавиша <Enter>

else Key := Chr(0);

end;

end;

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

begin

case Key of

'0'..'9',#8: ; // цифры и <Backspase>

#13: Edit2.SetFocus; // клавиша <Enter>

else Key := Chr(0);

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

var i,j:integer;

begin

CheckBox1.Enabled:=false;

Button1.Enabled:=false; N11.Enabled:=false;

Button5.Enabled:=true;N7.Enabled:=true;N18.Enabled:=true;

N6.Enabled:=false;

n:=strtoint(Edit1.Text);

m:=strtoint(Edit2.Text);

StringGrid1.ColCount:=m+2;

StringGrid1.RowCount:=n+2;

StringGrid1.FixedCols:=1;

StringGrid1.FixedRows:=1;

StringGrid1.FixedColor:=clmenu;

StringGrid2.ColCount:=m+1;

StringGrid2.RowCount:=n+1;

StringGrid2.FixedCols:=1;

StringGrid2.FixedRows:=1;

StringGrid2.FixedColor:=clmenu;

for i:=1 to m do begin

s:=inttostr(i);

StringGrid1.Cells[i,0]:='Пункт назначения'+s;

end;

for j:=1 to n do begin

s:=inttostr(j);

StringGrid1.Cells[0,j]:='Пункт отправления'+s;

end;

StringGrid1.Cells[m+1,0]:='Запасы';

StringGrid1.Cells[0,n+1]:='Потребности';

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Button1.Enabled:= false;N11.Enabled:=false;

Button4.Enabled:= false;N17.Enabled:=false;

Button5.Enabled:= false;N7.Enabled:=false;N18.Enabled:=false;

BitBtn1.Enabled:= false;N8.Enabled:=false; N13.Enabled:=false;

CheckBox1.Enabled:= false;

Edit3.Enabled:= false;

Label3.Enabled:= false;

StringGrid1.Enabled:= false;

StringGrid2.Enabled:= false;

end;

procedure TForm1.Edit1Change(Sender: TObject);

begin

if (length(Edit1.Text)<>0) and (length(edit2.Text)<>0) then begin

ac1:=true;Button1.Enabled:= true;CheckBox1.Enabled:= true;

StringGrid1.Enabled:=true;StringGrid2.Enabled:=true;

N5.Enabled:=true;N4.Enabled:=true; N11.Enabled:=true;

end else begin

ac1:=false;Button1.Enabled:= false;CheckBox1.Enabled:= false;

StringGrid1.Enabled:=false;StringGrid2.Enabled:=false;

N5.Enabled:=false;N4.Enabled:=false; N11.Enabled:=false;

end;

end;

procedure TForm1.Edit2Change(Sender: TObject);

begin

if (length(Edit1.Text)<>0) and (length(edit2.Text)<>0) then begin

ac1:=true;Button1.Enabled:= true;CheckBox1.Enabled:= true;

StringGrid1.Enabled:=true;StringGrid2.Enabled:=true;

N5.Enabled:=true;N4.Enabled:=true;N11.Enabled:=true;end

else begin

ac1:=false;Button1.Enabled:= false;CheckBox1.Enabled:= false;

StringGrid1.Enabled:=false;StringGrid2.Enabled:=false;

N5.Enabled:=false;N4.Enabled:=false; N11.Enabled:=false;

end;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

StringGrid1.Options:=[goEditing];

activ:=activ+1;

Edit1.Enabled:=false;

Edit2.Enabled:=false;

Label1.Enabled:=false;

Label2.Enabled:=false;

N6.Enabled:=true;

if CheckBox1.Checked=true then begin

if ac1=true then begin

Button4.Enabled:=true;N6.Enabled:=true;N17.Enabled:=true;

Button1.Enabled:=false;N4.Enabled:=false;N11.Enabled:=false;

end;

end else begin

Button4.Enabled:=false;N6.Enabled:=false;N17.Enabled:=false;

Button1.Enabled:=true;N4.Enabled:=true;N11.Enabled:=true;

end;

end;

procedure TForm1.Button5Click(Sender: TObject);

var i,j,Jenya:integer;

begin

Jenya:=0;

for i:=1 to n+1 do

for j:=1 to m+1 do

if StringGrid1.Cells[j,i]<>'' then Jenya:=Jenya+1;

if Jenya=(((n+1)*(m+1))-1) then begin

BitBtn1.Enabled:=true; N8.Enabled:=true; N13.Enabled:=true;

Label3.Enabled:=true;

Edit3.Enabled:=true;

Button4.Enabled:=false; N8.Enabled:=true;N17.Enabled:=false;

N6.Enabled:=false;

N5.Enabled:=false;

n:=strtoint(Edit1.Text);

m:=strtoint(Edit2.Text);

s1:=0;s2:=0;

for i:=1 to n do begin

s1:=s1+strtoint(StringGrid1.Cells[m+1,i]);

end;

for j:=1 to m do begin

s2:=s2+strtoint(StringGrid1.Cells[j,n+1]);

end;

if s1<>s2 then begin

{showmessage('Для решения данной задачи необходимо, чтобы суммы запасов и потребностей совпадали');

exit;}form5.Show;

end else begin

for i:=1 to n do

for j:=1 to m do

ishod[i,j]:=strtoint(StringGrid1.Cells[j,i]);

for j:=1 to m do begin

potr[j]:=strtoint(StringGrid1.Cells[j,n+1]);

end;

for i:=1 to n do begin

zap[i]:=strtoint(StringGrid1.Cells[m+1,i]);

end;

Button5.Enabled:=false;N7.Enabled:=false;N18.Enabled:=false;

showmessage('Все введенные Вами данные приняты программой');

exit;

end;

end else begin

ShowMessage('Введите записи во все поля таблицы!!!');

exit;

end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var spez:array[1..100,1..100]of integer;

i,j,dx,min,max,sh,str,stl,k,l,i1,stoim,dlas1:integer;

vyh:boolean; mar:string;

begin

StringGrid2.Cells[0,0]:='Еденица продукции';

for i:=1 to n do

for j:=1 to m do

StringGrid2.Cells[j,i]:=inttostr(0);

for i:=1 to n do

for j:=1 to m do

spez[i,j]:=ishod[i,j];

vyh:=false;

while vyh<>true do

begin

dx:=0; sh:=0;max:=0; min:=0;

for i:=1 to n do

for j:=1 to m do

if spez[i,j]=(-1) then dx:=dx+1;

if dx=m*n then vyh:=true;

if dx<(m*n) then

begin

for i:=1 to n do

for j:=1 to m do

if spez[i,j]<>(-1) then min:=spez[i,j];

for i:=1 to n do

for j:=1 to m do

if (spez[i,j]<>(-1))and(spez[i,j]<min) then min:=spez[i,j];

for i:=1 to n do

for j:=1 to m do

if spez[i,j]=min then sh:=sh+1;

if sh=1 then

begin

for i:=1 to n do

for j:=1 to m do

if spez[i,j]=min then

begin

str:=i;

stl:=j;

end;

end;

if sh>1 then

begin

for i:=1 to n do

for j:=1 to m do

if spez[i,j]=min then

begin

for k:=1 to n do

if (k<>i)and(spez[k,j]>max) then

begin

max:=spez[k,j];

str:=i;

stl:=j;

end;

for l:=1 to m do

if (l<>j)and(spez[i,l]>max) then

begin

max:=spez[i,l];

str:=i;

stl:=j;

end;

end;

end;

if zap[str]<potr[stl] then

begin

StringGrid2.Cells[stl,str]:=inttostr(zap[str]);

potr[stl]:=potr[stl]-zap[str];

zap[str]:=0;

for i1:=1 to m do

spez[str,i1]:=-1;

end;

if potr[stl]<zap[str] then

begin

StringGrid2.Cells[stl,str]:=inttostr(potr[stl]);

zap[str]:=zap[str]-potr[stl];

potr[stl]:=0;

for i1:=1 to n do

spez[i1,stl]:=-1;

end;

if zap[str]=potr[stl] then

begin

StringGrid2.Cells[stl,str]:=inttostr(zap[str]);

potr[stl]:=0;

zap[str]:=0;

for i1:=1 to n do

spez[i1,stl]:=-1;

for i1:=1 to m do

spez[str,i1]:=-1;

end;

end;

end;

stoim:=0;

for i:=1 to n do

for j:=1 to m do

begin

stoim:=stoim+(strtoint(StringGrid2.Cells[j,i])*ishod[i,j]);

end;

inttostr(stoim);

Edit3.Text:=inttostr(stoim);

Button1.Enabled:=false;N4.Enabled:=false; N11.Enabled:=false;

BitBtn1.Enabled:=false;N8.Enabled:=false; N13.Enabled:=false;

BitBtn2.Enabled:=true;N9.Enabled:=true; N14.Enabled:=true;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);

var i,j:integer;

begin

CheckBox1.Checked:=false;

BitBtn2.Enabled:=false;N9.Enabled:=false;N14.Enabled:=false;

for i:=1 to n do

for j:=1 to m do

Stringgrid2.Cells[j,i]:='';

for i:=1 to n+1 do

for j:=1 to m+1 do

Stringgrid1.Cells[j,i]:='';

Label1.Enabled:=true;

Label2.Enabled:=true;

Edit1.Enabled:=true;

Edit2.Enabled:=true;

Edit1.Text:='';

Edit2.Text:='';

m:=0;

n:=0;

activ:=0;

StringGrid1.ColCount:=1;

StringGrid1.RowCount:=1;

StringGrid2.ColCount:=1;

StringGrid2.RowCount:=1;

StringGrid2.Cells[0,0]:='';

Label3.Enabled:=false;

Edit3.Text:='';

Edit3.Enabled:=false;

end;

end.

unit Unit2;

interface

uses

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

Dialogs, StdCtrls, Buttons, Mask,Registry, ExtCtrls;

type

TForm2 = class(TForm)

MaskEdit1: TMaskEdit;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

StaticText1: TStaticText;

Bevel1: TBevel;

procedure BitBtn3Click(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

private

{ Private declarations }

public

pass,newpass:STRING;

VHODIM:boolean;

{ Public declarations }

end;

var

Form2: TForm2;

implementation

uses Unit3, Unit1_1, Unit4;

{$R *.dfm}

procedure TForm2.BitBtn3Click(Sender: TObject);

begin

Form2.Enabled:=False;

form3.Show;

end;

procedure TForm2.FormActivate(Sender: TObject);

begin

MaskEdit1.Text := '';

MaskEdit1.SetFocus;

with TRegistry.Create do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey('Software', True);

if not KeyExists('MyProject') then CreateKey('MyProject');

OpenKey('MyProject', True);

if not ValueExists('Password') then begin

newpass := '';

WriteString('Password', newpass);

end

else

pass := ReadString('Password');

end;

end;

procedure TForm2.BitBtn1Click(Sender: TObject);

begin

if MaskEdit1.Text = pass then begin

{- ????? ?????? ????????, ??????? ??????????, ???? ?????? ?????? ????????? -}

Form4.Show;

Form2.Hide;

VHODIM:=true;

end

else MaskEdit1.SetFocus;

end;

procedure TForm2.BitBtn2Click(Sender: TObject);

begin

Close;

end;

end.

unit Unit3;

interface

uses

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

Dialogs, StdCtrls, Mask,Registry, ExtCtrls;

type

TForm3 = class(TForm)

MaskEdit1: TMaskEdit;

MaskEdit2: TMaskEdit;

MaskEdit3: TMaskEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Bevel1: TBevel;

procedure FormActivate(Sender: TObject);

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

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

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

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

v:boolean;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm3.FormActivate(Sender: TObject);

begin

v:=False;

MaskEdit1.Text := '';

MaskEdit2.Text := '';

MaskEdit3.Text := '';

MaskEdit1.Enabled := true;

MaskEdit1.SetFocus;

MaskEdit2.Enabled := false;

MaskEdit3.Enabled := false

end;

procedure TForm3.MaskEdit1KeyPress(Sender: TObject; var Key: Char);

begin

if (key = #13) and (MaskEdit1.Text = Form2.pass) then

begin

MaskEdit2.Enabled := true;

MaskEdit1.Enabled := false;

MaskEdit2.SetFocus;

end;

end;

procedure TForm3.MaskEdit2KeyPress(Sender: TObject; var Key: Char);

begin

if key = #13 then begin

MaskEdit3.Enabled := true;

MaskEdit3.SetFocus;

MaskEdit2.Enabled := false;

end;

end;

procedure TForm3.MaskEdit3KeyPress(Sender: TObject; var Key: Char);

begin

if (key = #13) and (MaskEdit2.Text = MaskEdit3.Text) then begin

with TRegistry.Create do

begin

RootKey := HKEY_LOCAL_MACHINE;

OpenKey('Software', True);

if not KeyExists('MyProject') then CreateKey('MyProject');

OpenKey('MyProject', True);

WriteString('Password', MaskEdit3.Text);

end;

v:=True;

Form3.Hide;

Form2.Enabled:=True;

end;

end;

procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

Canclose:=v;

end;

end.

unit Unit4;

interface

uses

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

Dialogs, ExtCtrls, StdCtrls;

type

TForm4 = class(TForm)

Image1: TImage;

Label1: TLabel;

Label2: TLabel;

Timer1: TTimer;

procedure FormCreate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

sss:Boolean;

{ Public declarations }

end;

var

Form4: TForm4;

implementation

uses Unit1_1, Unit2;

{$R *.dfm}

var

Back, Picture: TBitMap; // фон и картинка

BackRct : TRect; // положение и размер области фона,

// которая должна быть восстановлена

x,y:integer; // текущее положение картинки

W,H: integer; // размеры картинки

procedure TForm4.FormCreate(Sender: TObject);

begin

{ Свойству AutoSize обязательно надо

присвоить значение False. Это можно

сделать во время создания формы.

}

sss:=False;

Image1.AutoSize := False;

// создать два объекта - битовых образа

Back := TBitmap.Create; // фон

Picture := TBitmap.Create; // картинка

// загрузить и вывести фон

Back.LoadFromFile('11.bmp');

Image1.Width := Back.Width;

Image1.Height := Back.Height;

Image1.Canvas.Draw(0,0,Back);

// загрузить картинку, которая будет двигаться

Picture.LoadFromFile('22.bmp');

W := Picture.Width;

H := Picture.Height;

// определим "прозрачный" цвет

Picture.Transparent := True;

// прозрачный цвет картинки определяет

// левый верхний пиксел картинки

Picture.TransParentColor := Picture.Canvas.Pixels[1,1];

// начальное положение картинки

x := -W;

y := 320;

// определим сохраняемую область фона

BackRct:=Bounds(x,y,W,H);

end;

procedure TForm4.Timer1Timer(Sender: TObject);

begin

if Form2.VHODIM=true then begin

// восстановлением фона удалим рисунок

Image1.Canvas.CopyRect(BackRct,Back.Canvas,BackRct);

x:=x+100;

if (x > Image1.Width)and(Form2.VHODIM=true)and (sss=false) then begin

Form1.Show;Form4.Hide;sss:=true;

end;

if x > Image1.Width then

x:=-W;

// определим сохраняемую область фона

BackRct:=Bounds(x,y,W,H);

// выведем рисунок

Image1.Canvas.Draw(x,y,Picture);

end;

end;

procedure TForm4.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

// освободим память, выделенную

// для хранения битовых образов


Подобные документы

  • Общее понятие и характеристика задачи линейного программирования. Решение транспортной задачи с помощью программы MS Excel. Рекомендации по решению задач оптимизации с помощью надстройки "Поиск решения". Двойственная задача линейного программирования.

    дипломная работа [2,4 M], добавлен 20.11.2010

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

    курсовая работа [2,0 M], добавлен 12.02.2013

  • Описание алгоритма решения транспортной задачи по планированию перевозки зерна. Ход решения задачи вручную, в программе TORA методом наименьшего элемента, с помощью MS Excel. Разработка программы для решения задачи в общем виде средствами Delphi.

    курсовая работа [2,5 M], добавлен 22.11.2012

  • Краткий обзор решения транспортных задач. Экономическая интерпретация поставленной задачи. Разработка и описание алгоритма решения задачи. Построение математической модели. Решение задачи вручную и с помощью ЭВМ. Анализ модели на чувствительность.

    курсовая работа [844,3 K], добавлен 16.06.2011

  • Анализ метода линейного программирования для решения оптимизационных управленческих задач. Графический метод решения задачи линейного программирования. Проверка оптимального решения в среде MS Excel с использованием программной надстройки "Поиск решения".

    курсовая работа [2,2 M], добавлен 29.05.2015

  • Применение методов линейного программирования для решения оптимизационных задач. Основные понятия линейного программирования, свойства транспортной задачи и теоремы, применяемые для ее решения. Построение первичного опорного плана и системы потенциалов.

    курсовая работа [280,8 K], добавлен 17.11.2011

  • Особенности метода неопределенных множителей Лагранжа, градиентного метода и метода перебора и динамического программирования. Конструирование алгоритма решения задачи. Структурная схема алгоритма сценария диалога и описание его программной реализации.

    курсовая работа [1010,4 K], добавлен 10.08.2014

  • Основные принципы разработки программ. Разработка алгоритма решения задачи о пересечении двухвыпуклым многоугольником. Реализация разработанного алгоритма на языке программирования. Тесты для проверки работы программы. Графическая иллюстрация решения.

    курсовая работа [53,3 K], добавлен 20.11.2015

  • Обзор методов и подходов решения поставленной задачи аппроксимации логического вывода экспертной системы. Разработка и описание метода сетевого оператора для решения данной задачи. Разработка алгоритма решения. Проведение вычислительного эксперимента.

    дипломная работа [1,5 M], добавлен 23.02.2015

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

    курсовая работа [49,1 K], добавлен 24.05.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.