Методы сетевого планирования
История создания средств цифровой вычислительной техники. Методы и модели линейного программирования. Экономическая постановка задачи. Выбор метода реализации задачи. Особенности выбора языка программирования. Решение задачи сетевым методом планирования.
Рубрика | Экономико-математическое моделирование |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 19.02.2015 |
Размер файла | 842,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Введение
Математическое программирование -- область математики, разрабатывающая теорию и численные методы решения многомерных экстремальных задач с ограничениями, т. е. задач на экстремум функции многих переменных с ограничениями на область изменения этих переменных.
Один из разделов математического программирования - линейным программированием. Методы и модели линейного программирования широко применяются при оптимизации процессов во всех отраслях народного хозяйства: при разработке производственной программы предприятия, распределении ее по исполнителям, при размещении заказов между исполнителями и по временным интервалам, при определении наилучшего ассортимента выпускаемой продукции, в задачах перспективного, текущего и оперативного планирования и управления; при планировании грузопотоков, определении плана товарооборота и его распределении; в задачах развития и размещения производительных сил, баз и складов систем обращения материальных ресурсов и т. д. Особенно широкое применение методы и модели линейного программирования получили при решении задач экономии ресурсов (выбор ресурсосберегающих технологий, составление смесей, раскрой материалов), производственно-транспортных и других задач.
Сетевое планирование применяется для создания оптимального плана выполнения работ в сфере промышленного производства, строительства, организации научно-исследовательских работ и т. д. Исходным материалом для сетевого планирования является программа выполнения работ. Программа содержит перечень работ, которые подлежат выполнению с указанием длительности выполнения каждой работы и ее стоимости. На основе этих данных строится сетевая модель (график). Построенная сетевая модель анализируется и при необходимости выполняются некоторые действия по ее улучшению. По данным сетевой модели строится календарный график выполнения работ, где указаны сроки выполнения каждого вида работ, определяются взаимосвязи между работами. По календарному графику определяются критические работы, которые при их выполнении берутся под строгий контроль.
В данной курсовой работе рассматривается сетевые методы планирования. Целью курсовой работы является решение задачи сетевым методом планирования, а также ее программная реализация на одном из языков программирования. Задача проектирования состоит в том, чтобы максимально просто добиться результата поставленной задачи.
1. Экономическая постановка задачи
Определить длину кратчайшего проложения кабельных сетей в организации. Расстояния между шестью серверными машинами представлены в таблице 1.
Таблица 1.1 - Длины маршрутов между серверными машинами
Город |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
6 |
4 |
12 |
14 |
22 |
||
2 |
6 |
3 |
8 |
7 |
20 |
||
3 |
4 |
3 |
10 |
11 |
18 |
||
4 |
12 |
8 |
10 |
9 |
16 |
||
5 |
14 |
7 |
11 |
9 |
10 |
||
6 |
22 |
20 |
18 |
16 |
10 |
2. Математическая постановка задачи
Сетевая модель -- графическое отображение выполняемых работ в их технологической последовательности с указанием времени выполнения каждой работы. Основными элементами сетевой модели являются:
1. Событие -- фиксируемый момент времени завершения i-й работы и начало выполнения (i+1)-й работы. На сетевом графике событие обозначается кружком с порядковым номером.
2. Работа -- это активные действия по созданию материального или интеллектуального продукта с привлечением различных ресурсов: финансовых, материальных, энергетических и т.д. Различают несколько видов работ:
- действительная работа, определение дано выше;
- ожидание -- вид работы, который требует для своей реализации только затрат времени: просушка окрашенных изделий, затвердевание бетона и т. д.;
- фиктивная работа -- логическая связь между событиями, не требующая затрат каких-либо ресурсов, т. е. какая-либо работа не может начинаться до тех пор, пока другая работа (или работы) не будет закончена.
- Действительная работа и ожидание изображаются на сетевом графике сплошной линией со стрелкой, а фиктивная работа -- пунктирной линией со стрелкой в соответствии с рисунком 2.1.
Рисунок 2.1- Действительная и фиктивная работы
3. Путь -- это непрерывная последовательность событий и работ, которые включаются только 1 раз. Форма (конфигурация) пути может быть произвольной. Длина пути рассчитывается как сумма времени выполнения работ, входящих в путь.
4. Критический путь -- это путь, который содержит напряженные работы. Напряженная работа не имеет резервов по времени для своей реализации. Работы, имеющие резервы по времени, называются некритическими. Для некритических работ имеется возможность передвинуть сроки начала и окончания работы, причем общий срок выполнения всех работ остается прежним.
5. Исходное событие. Каждая сетевая модель имеет одно исходное событие, из которого вытекает одна или несколько работ. Исходное событие не имеет входящих работ. Исходное событие имеет порядковый номер ноль.
6. Завершающее событие. Каждая сетевая модель имеет одно завершающее событие, в котором заканчивается одна или несколько работ. Завершающее событие не имеет выходящих работ и имеет последний порядковый номер.
При построении сетевой модели надо соблюдать правила:
* сетевая модель может содержать только одно начальное и одно завершающее событие;
* в сети не должно быть «висячих» событий, т. е. тупиковых событий, кроме завершающего в соответствии с рисунком 2.2, и событий, не имеющих входящих работ, кроме начального события в соответствии с рисунком 2.3.
Рисунок 2.2, 2.3 - «Висячие» события
- нумерация событий выполняется слева направо. Также слева направо указывается направление стрелок, изображающих работы. Каждая работа начинается из события с меньшим порядковым номером и заканчивается в событии с большим порядковым номером;
- между двумя соседними событиями может быть только одна работа. Если имеется несколько параллельно выполняемых работ, которые начинаются в одном событии и заканчиваются в другом, то одну из этих работ оставляют без изменения, а для остальных действительных работ добавляют промежуточные события и фиктивные работы в соответствии с рисунком 2.4;
а
Рисунок 2.4 - Добавление промежуточных событий и фиктивных работ: а -- параллельные работы; б -- фиктивные работы
- в сетевой модели запрещено наличие замкнутых контуров в соответствии с рисунком 2.5, т. е. выполнение работ по кольцу с возвращением к начальному событию;
- сетевая модель должна иметь максимально простую форму;
- сетевая модель должна строго соответствовать технологическому процессу (порядку выполнения работ);
- каждая работа маркируется двумя цифрами. Первая цифра -- номер события начала работы, вторая цифра -- номер события окончания работы. Маркировка работ должна быть уникальной.
Рисунок 2.5 - Замкнутые контуры
Особое внимание следует уделить правильной нумерации событий и, как следствие, правильной маркировке работ.
Нумерацию событий в сетевом графике в соответствии с рисунком 2.6, рекомендуется выполнять по следующему алгоритму
Рисунок 2.6 - Исходный сетевой график
- определить начальное событие. Для нашего примера -- событие А. Этому событию присвоить ранг 0;
- условно вычеркнуть работы, выходящие из события А в соответствии с рисунком 2.7. Событиям Б, В и Г, которые имеют только выходящие работы, присвоить ранг 1;
Рисунок 2.7 - Определение событий первого ранга
Условно вычеркиваем работы, выходящие из событий 1-го ранга в соответствии с рисунком 2.8. Событиям Д и Е присваиваем ранг 2 и т. д. Событиям 3 и Ж -- ранг 3, событию И-- ранг 4;
Рисунок 2.8 - Определение событий второго ранга.
После назначения ранга событиям выполняется нумерация событий по следующим правилам:
- события нумеруются слева направо, т. е. от начального события к конечному событию;
- если несколько событий имеют одинаковый ранг, то нумерация событий выполняется сверху вниз.
Итоговая нумерация событий указана на рисунке 2.9.
Рисунок 2.9 - Итоговая нумерация событий
экономический сетевой вычислительный
3. Выбор метода реализации задачи
Данную задачу сетевого планирования можно решить несколькими алгоритмами, в данном случае используется алгоритм Литтла, или другое название метод «ветвей и границ» или так называемая задача «Коммивояжера». Так же как и в целочисленном программировании, при использовании алгоритма Литтла необходимо определить верхнюю и нижнюю оценки для разделения множества решений на два класса. Различают две группы задач, решаемых этим алгоритмов: задачи на минимум (определяют нижнюю оценку или границу) и задачи на максимум (определяют верхнюю границу или оценку).
Идея алгоритма такова: определяют нижнюю оценку (для задачи на минимум) и разделяют исходную матрицу на две примерно равные части. Затем уменьшают размер матрицы и определяют «плату» за уменьшение размера матрицы. Размер платы может быть или положительный или нулевой т.е. увеличивать или не изменять размера нижней оценки. Размер матрицы уменьшается до 2 х 2. Затем выполняют движение в обратном порядке и получают оптимальный (по стоимости) маршрут.
4. Технические и инструментальные средства обеспечения задачи
4.1 Краткая характеристика ЭВМ
Компьюмтер (англ. computer -- «вычислитель»), ЭВМ (электронная вычислительная машина) -- машина для проведения вычислений, а также приёма, переработки, хранения и выдачи информации по заранее определённому алгоритму (компьютерной программе).
На заре эры компьютеров считалось, что основная функция компьютера -- вычисление. Однако в настоящее время полагают, что основная их функция -- управление.
История создания средств цифровой вычислительной техники уходит в глубь веков. Она увлекательна и поучительна, с нею связаны имена выдающихся ученых мира.
В дневниках гениального итальянца Леонардо да Винчи (1452-1519) уже в наше время был обнаружен ряд рисунков, которые оказались эскизным наброском суммирующей вычислительной машины на зубчатых колесах, способной складывать 13-разрядные десятичные числа. Специалисты известной американской фирмы IBM, 1969 году, воспроизвели машину в металле и убедились в полной состоятельности идеи ученого.
В те далекие годы гениальный ученый был, вероятно, единственным на Земле человеком, который понял необходимость создания устройств для облегчения труда при выполнении вычислений.
1623 г. Через сто с лишним лет после смерти Леонардо да Винчи нашелся другой европеец - немецкий ученый Вильгельм Шиккард (1592-1636), не читавший, естественно, дневников великого итальянца, - который предложил свое решение этой задачи. Причиной, побудившей Шиккарда разработать счетную машину для суммирования и умножения шестиразрядных десятичных чисел, было его знакомство с польским астрономом И. Кеплером. Ознакомившись с работой великого астронома, связанной в основном с вычислениями, Шиккард загорелся идеей оказать ему помощь в нелегком труде. В письме на его имя, он приводит рисунок машины и рассказывает, как она устроена. К сожалению, данных о дальнейшей судьбе машины история не сохранила. По-видимому, ранняя смерть от чумы, охватившей Европу, помешала ученому выполнить его замысел.
Об изобретениях Леонардо да Винчи и Вильгельма Шиккарда стало известно лишь в наше время. Современникам они были неизвестны.
В 1641-1642 гг. девятнадцатилетний Блез Паскаль (1623-1662), тогда еще мало кому известный французский ученый, создает действующую суммирующую машину ("паскалину").
Вначале он сооружал ее с одной единственной целью - помочь отцу в расчетах, выполняемых при сборе налогов. В последующие четыре года им были созданы более совершенные образцы машины. Они строились на основе зубчатых колес, могли производить суммирование и вычитание десятичных чисел. Было создано примерно 50 образцов машин, Б. Паскаль получил королевскую привилегию на их производство, но практического применения "паскалины" не получили, хотя о них много говорилось и писалось.
В 1673 г. другой великий европеец, немецкий ученый Вильгельм Готфрид Лейбниц (1646-1716), создает счетную машину (арифметический прибор, по словам Лейбница) для сложения и умножения двенадцатиразрядных десятичных чисел. К зубчатым колесам он добавил ступенчатый валик, позволяющий осуществлять умножение и деление.
Заслуги В. Лейбница, однако, не ограничиваются созданием "арифметического прибора". Начиная со студенческих лет и до конца жизни он занимался исследованием свойств двоичной системы счисления, ставшей в дальнейшем основной при создании компьютеров. Он придавал ей некий мистический смысл и считал, что на ее базе можно создать универсальный язык для объяснения явлений мира и использования во всех науках, в том числе в философии.
В 1799 г. во Франции Жозеф Мари Жакард (1752-1834) изобрел ткацкий станок, в котором для задания узора на ткани использовались перфокарты. Необходимые для этого исходные данные записывались в виде пробивок в соответствующих местах перфокарты. Так появилось первое примитивное устройство для запоминания и ввода программной (в данном случае управляющей ткацким процессом) информации.
1836-1848 г.г. Завершающий шаг в эволюции цифровых вычислительных устройств механического типа сделал английский ученый Чарльз Беббидж (1791-1871). Аналитическая машина, проекткоторой он разработал, явилась механическим прототипом появившихся спустя столетие ЭВМ. В ней предполагалось иметь те же, что и в ЭВМ, пять основных устройств: арифметическое, памяти, управления, ввода, вывода. Программа выполнения вычислений записывалась на перфокартах (пробивками), на них же записывались исходные данные и результаты вычислений.
Главной особенностью конструкции этой машины является программный принцип работы.
Принцип программы, хранимой в памяти компьютера, считается важнейшей идеей современной компьютерной архитектуры. Суть идеи заключается в том, что:
- программа вычислений вводится в память ЭВМ и хранится в ней наравне с исходными числами;
- команды, составляющие программу, представлены в числовом коде по форме ничем не отличающемся от чисел.
Программы вычислений на машине Беббиджа, составленные дочерью Байрона Адой Августой Лавлейс (1815-1852), поразительно схожи с программами, составленными впоследствии для первых ЭВМ. Замечательную женщину назвали первым программистом мира.
Несмотря на все старания Ч. Беббиджа и А. Лавлейс, машину построить не удалось... Современники, не видя конкретного результата, разочаровались в работе ученого. Он опередил свое время.
Непонятым оказался еще один выдающийся англичанин, живший в те же годы, - Джордж Буль(1815-1864). Разработанная им алгебра логики (алгебра Буля) нашла применение лишь в следующем веке, когда понадобился математический аппарат для проектирования схем ЭВМ, использующих двоичную систему счисления. "Соединил" математическую логику с двоичной системой счисления и электрическими цепями американский ученый Клод Шеннон в своей знаменитой диссертации (1936 г.).
Через 63 года после смерти Ч. Беббиджа нашелся "некто", взявший на себя задачу создать машину, подобную по принципу действия той, которой посвятил жизнь Ч. Беббидж. Им оказался немецкий студент Конрад Цузе (1910-1985). Работу по созданию машины он начал в 1934 г., за год до получения инженерного диплома. Конрад ничего не знал ни о машине Беббиджа, ни о работах Лейбница, ни об алгебре Буля, тем не менее, он оказался достойным наследником В. Лейбница и Дж. Буля, поскольку вернул к жизни уже забытую двоичную систему исчисления, а при расчете схем использовал нечто подобное булевой алгебре. В 1937г. машина Z1 (что означало "Цузе 1") была готова и заработала! Она была, подобно машине Беббиджа, чисто механической.
К. Цузе установил несколько вех в истории развития компьютеров: первым в мире использовал при построении вычислительной машины двоичную систему исчисления (1937 г.), создал первую в мире релейную вычислительную машину с программным управлением (1941 г.) и цифровую специализированную управляющую вычислительную машину (1943 г.).
Эти воистину блестящие достижения, однако, существенного влияния на развитие вычислительной техники в мире не оказали... Публикаций о них и какой-либо рекламы из-за секретности работ не было, и поэтому о них стало известно лишь спустя несколько лет после завершения Второй мировой войны.
По-другому развивались события в США. В 1944 г. ученый Гарвардского университета ГовардАйкен (1900-1973) создает первую в США (тогда считалось первую в мире!) релейно-механическую цифровую вычислительную машину МАРК-1. В машине использовалась десятичная система счисления. Замечательным качеством машины была ее надежность. Установленная в Гарвардском университете, она проработала там 16 лет!
Вслед за МАРК-1 ученый создает еще три машины (МАРК-2, МАРК-3 и МАРК-4) - тоже с использованием реле, а не электронных ламп, объясняя это ненадежностью последних.
В отличие от работ Цузе, которые велись с соблюдением секретности, разработка МАРК1 проводилась открыто, и о создании необычной по тем временам машины быстро узнали во многих странах. Шутка ли, за день машина выполняла вычисления, на которые ранее тратилось полгода! Дочь К. Цузе, работавшая в военной разведке и находившаяся в то время в Норвергии, прислала отцу вырезку из газеты, сообщающую о грандиозном достижении американского ученого.
К. Цузе мог торжествовать. Он во многом опередил появившегося соперника. Позднее он направит ему письмо и скажет об этом.
В начале 1946 г. начала считать реальные задачи первая ламповая ЭВМ «ЭНИАК» (ENIAC), созданная под руководством физика Джона Мочли (1907-1986) при Пенсильванском университете. По размерам она была более впечатляющей, чем МАРК-1: 26 м в длину, 6 м в высоту, вес 35 тонн. Но поражали не размеры, а производительность - она в 1000 раз превышала производительность МАРК-1! Таков был результат использования электронных ламп!
В 1945 г., когда завершались работы по созданию ЭНИАК, и его создатели уже разрабатывали новый электронный цифровой компьютер ЭДВАК, в котором намеривались размещать программы в оперативной памяти, чтобы устранить основной недостаток ЭНИАКа - сложность ввода программ вычислений, к ним в качестве консультанта был направлен выдающийся математик, участник Матхеттенского проекта по созданию атомной бомбы Джон фон Нейман (1903-1957). В1946 г. Нейманом, Голдстайном и Берксом (все трое работали в Принстонском институте перспективных исследований) был составлен отчет, который содержал развернутое и детальное описание принципов построения цифровых электронных вычислительных машин, которых и придерживаются до сих пор.
Для написания и работы программы необходима ЭВМ со следующими минимальными параметрами (для Delphi 7):
? процессор Intel Pentium 90;
? операционная система Microsoft Windows 95, 98;
? оперативнаяпамять32MB;
? жесткийдиск 80Мб.
Для компьютера с Delph 7:
? процессор Pentium 166 MHz
? операционная система MicrosoftWindows 98, 2000, andXP;
? оперативнаяпамять 256 MB;
? жесткийдиск 475Мб.
Эти параметры необходимы только для языков программирования. Написанная и откомпилированная программа намного менее требовательна к параметрам компьютера.
4.2 Особенности выбора языка программирования
Delphi -- результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль начиная с версии 5.5 добавил в Паскаль объектно-ориентированные свойства, а Delphi -- объектно-ориентированный язык программирования с возможностью доступа к метаданным классов (то есть к описанию классов и их членов) в компилируемом коде, также называемом интроспекцией. Так как все классы наследуют функции базового класса TObject, то любой указатель на объект можно преобразовать к нему, после чего воспользоваться методом ClassType и функцией TypeInfo, которые и обеспечат интроспекцию. Также отличительным свойством Delphi от С++ является отсутствие возможности располагать объекты в стеке (объекты, унаследованные из Турбо Паскаля, располагаться в стеке могут) -- все объекты попадают в динамически выделяемую область (кучу).
Внешний вид среды программирования Delphi отличается от многих других из тех, что можно увидеть в Windows. Кпримеру, Borland Pascal for Windows 7. 0, Borland C++ 4. 0, Word for Windows, Program Manager - этовсе MDI приложенияивыглядятпо-другому, чем Delphi. MDI (MultipleDocumentInterface) - определяет особый способ управления нескольких дочерних окон внутри одного большого окна.
Среда Delphi же следует другой спецификации, называемой SingleDocumentInterface (SDI), и состоит из нескольких отдельно расположенных окон. Это было сделано из-за того, что SDI близок к той модели приложений, что используется в Windows 95.
Среда разработки Delphi ориентирована, прежде всего, на создание программ для семейства операционных систем Windows. При этом большое внимание уделяется возможности визуальной разработки приложений с помощью большого набора готовых компонентов, а в стандартную поставку Delphi входят основные объекты, которые образуют удачно подобранную иерархию из 270 базовых классов, позволяющих избежать ручного кодирования. Эти компоненты охватывают практически все аспекты применения современных информационных технологий. Программа, написанная на языке Delphi, является своего рода последовательностью инструкций. Их чаще обычного называют операторами.
Название данного языка программирования перекликается с именем одного из древнегреческих городов на побережье Коринфского залива - Дельфы. Однако, в отличие от этого памятника, который в настоящее время напоминает лишь развалины, Delphi входит в число популярных современных систем, позволяющих разрабатывать программы. Глава исследовательской группы по созданию системы программирования DelphiЧакЯзджевски как-то вспоминал, что имя Delphi, в конце концов, было выдвинуто Дэнни Торпом в момент очередной "мозговой атаки".
Разработчики хотели, что бы в названии были отражены исключительные возможности продукта при работе с базами данных, а Delphi как раз кстати сочеталось с необычайно заслуженным именем в данной области - Oracle. Система программирования Delphi включает в себя одни из лучших, а может и самые лучшие достижения современной теории разработки программ. Редко, но можно услышать, что Delphi представляет собой интегрированную среду для создания программ. Это, правда, ведь эта среда содержит много необходимых инструментов и компонентов, из которых впоследствии, как дом по кирпичикам, складываются проекты - готовые программы. Delphi представляет собой визуальную среду программирования, то есть интерфейс программы разрабатывается всего лишь простым перемещением необходимых составных элементов из соответствующего набора, что под силу даже тем, кто способен создавать уникальные сооружения, используя детали детского конструктора. Чтобы эта инструкция своего рода "ожила" и начала свою работу, нужно поразмыслить еще кое о чем - о написании программы ее поведения.
В качестве базового языка программирования в Delphi был выбран ObjectPascal, другими словами, Паскаль, основанный на объектно-ориентированном программировании. Ядром, буйно разросшимся впоследствии в ветвистое дерево Delphi, стал язык программирования TurboPascal. Основное различие системы программирования Delphi от TurboPascal состоит в том, что TurboPascal по большей степени разработан для работы в текстовом режиме операционной системы DOS, а система программирования Delphi ориентирован на графический режим.
Графические возможности Delphi дают возможность лицезреть на дисплее монитора, как "оживают" многочисленные конструкции языка, что играет большую роль для эффективного усвоения за короткое время. Delphi является мощной системой программирования, которая имеет множество приложений везде: научные и инженерные расчеты, автоматизация управленческой деятельности. Delphi - достаточно тонкий и универсальный инструмент, который способен на многое, если им руководит опытный мастер.
Delphi является результатом развития языка программирования TurboPascal, возникший из языка Паскаль. Pascal был в то время процедурным языком, тогда как TurboPascal добавил в Pascal объектно-ориентированное программирование, а для Delphi - возможность доступа к описанию классов и членов класса в исходном коде. Отличительное свойство Delphi от C++ заключается в отсутствии возможности размещать объекты в стеке - все эти объекты впоследствии оказываются в динамической выделяемой области (куче). Объекты БД в Delphi основаны на SQL и включают в себя полную мощь BorlandDatabaseEngine. В состав Delphi также включен Borland SQL Link, поэтому доступ к СУБД Oracle, Sybase, Informix и InterBase происходит с высокой эффективностью. Кроме того, Delphi включает в себя локальный сервер Interbase для того, чтобы можно было разработать расширяемые на любые внешние SQL-сервера приложения в онлайновом режиме.
В Delphi операция присвоения значения переменной обозначается при помощи двоеточия со знаком равенства, :=, что является заимствованием из математической нотации. Знак равенства без двоеточия -- это оператор проверки равенства, возвращающий булево значение. Напротив, C-подобных языках оператором присваивания является знак одинарный знак равенства, а оператором проверки равенства -- двойной, ==. В силу того, что в этих языках программирования присваивание является лишь выражением, возвращающем значение переменной слева, не так уж редки следующие неочевидные ошибки.
4.3 Алгоритм программы
1. Выбор размера матрицы
2. Ввод данных в матрицу
3. Цикл зануления матрицы и определение нижней оценки
4. Цикл вычисления оценок клетки
5. Зануление матрицы
6. Определение нижней оценки клетки
7. Постройка древа подмножеств
8. Вывод данных, определение длины пути и оптимальный обход городов
5. Решение задачи теста для написания и отладки программы
Таблица 5.1 - Длины маршрутов между городами
Город |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
6 |
4 |
12 |
14 |
22 |
||
2 |
6 |
3 |
8 |
7 |
20 |
||
3 |
4 |
3 |
10 |
11 |
18 |
||
4 |
12 |
8 |
10 |
9 |
16 |
||
5 |
14 |
7 |
11 |
9 |
10 |
||
6 |
22 |
20 |
18 |
16 |
10 |
Для начала нужно выполнить «зануление» матрицы используя дельта метод при решении транспортных задач:
№ |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
6 |
4 |
12 |
14 |
22 |
||
2 |
6 |
3 |
8 |
7 |
20 |
||
3 |
4 |
3 |
10 |
11 |
18 |
||
4 |
12 |
8 |
10 |
9 |
16 |
||
5 |
14 |
7 |
11 |
9 |
10 |
||
6 |
22 |
20 |
18 |
16 |
10 |
||
№ |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
2 |
0 |
8 |
10 |
18 |
||
2 |
3 |
0 |
5 |
4 |
17 |
||
3 |
1 |
0 |
7 |
8 |
15 |
||
4 |
4 |
0 |
2 |
1 |
8 |
||
5 |
7 |
0 |
4 |
2 |
3 |
||
6 |
12 |
10 |
8 |
6 |
0 |
||
№ |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
2 |
0 |
6 |
10 |
15 |
||
2 |
2 |
0 |
3 |
4 |
14 |
||
3 |
0 |
0 |
5 |
8 |
12 |
||
4 |
3 |
0 |
2 |
1 |
5 |
||
5 |
6 |
0 |
4 |
0 |
0 |
||
6 |
11 |
10 |
8 |
4 |
0 |
Рисунок 5.1 - Этапы «зануления» исходной матрицы
После «зануления» матрицы её элементы должны содержать или положительные, или нулевые значения. Сумма вычтенных значений со строками равна 35 (4+3+3+8+7+10), по столбцам - 6 (1+0+0+2+0+3). Общая сумма всех вычитаний - 41. Это и есть нижняя оценка.
Из условия задачи ясно, что надо побывать в каждом городе один раз. То есть замкнутый маршрут (цикл) должен содержать уникальные номера городов и переходы из одного города в другой должны выполняться по одному разу в каждой строке и каждом столбце. Также надо помнить, что стоимость маршрута не может быть меньше нижней оценки (общей суммы выполненных вычитаний).
Далее для каждой клетки матрицы, содержащей ноль, надо вычислить частную оценку клетки или просто оценку клетки.
Оценка клетки определяется как сумма минимальных элементов соответствующей строки и столбца.
Клетка 1-3 содержит значение ноль. Оценка этой клетки будет равна сумме минимального элемента по первой строке и минимального элемента по третьему столбцу 2+0=2. Для клетки 3-2 оценка будет 0+0=0. Оценки клеток представлены клеток представлены в виде верхнего индекса на рисунке 5.2:
№ |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
2 |
02 |
6 |
10 |
15 |
||
2 |
2 |
02 |
3 |
4 |
14 |
||
3 |
02 |
00 |
5 |
8 |
12 |
||
4 |
3 |
01 |
2 |
1 |
5 |
||
5 |
6 |
00 |
4 |
03 |
05 |
||
6 |
11 |
10 |
8 |
4 |
05 |
Рисунок 5.2 - Расчет оценок клеток
Начиная с этого момента приступаем к построению дерева ветвления алгоритма. Максимальная оценка 5 принадлежит двум клеткам 5-6 и 6-5. Поэтому за «нулевое» ребро принимается или ребро 5-6, или ребро 6-5.
Возьмем ребро 5-6. Все маршруты разобьем на содержащие ребро 5-6 и не содержащее это ребро. Обе группы маршрутов будут иметь стоимость не менее нижней оценки.
Проанализируем выполненные преобразования и построим дерево алгоритма. В результате расчета «зануления» исходной матрицы была получена нижняя оценка - 41. Таким образом, стоимость любого допустимого маршрута будет не менее 41. После вычисления оценок нулевых оценок, была выбрана клетка 5-6 с максимальной оценкой 5. Соответственно, ребро, соединяющие города 5 и 6, было объявлено «нулевым», и все возможные маршруты были разделены на две группы: содержащие ребро 5-6 и не содержащие этого ребра. Новая нижняя оценка для маршрутов, не содержащих ребра 5-6, должна быть увеличена на оценку клетки 5-6 и составит 41+5=46.
На первом шаге нулевое ребро было помечено серым цветом и изъято из дальнейшего рассмотрения. Далее рассматривалась только левая ветвь дерево ветвления алгоритма. Общая сумма «зануления» равна 5. Нижняя оценка для левой группы маршрутов составит 41+5=46.
На втором шаге была выбрана клетка 6-4 с оценкой 7. Новая нижняя оценка для маршрутов группы, не содержащей ребро 4-5, будет 53 и ветвление будет выполнено по ребру 6-4. Общая сумма «зануления» (по строкам и столбцам) составит 3. Нижняя оценка для левой группы маршрутов будет 46+3=49.
На третьем шаге будет удалено ребро 2-5. Оценка клетки 2-5 составляет 4. Следовательно, нижняя оценка правой группы маршрутов будет 49+4=53. Общая сумма «зануления» - 2. Нижняя оценка левой группы маршрутов равна 49+2=51.
На четвертом шаге выбрана клетка 3-2 с оценкой 2. Нижняя оценка правой группы маршрутов равна 51+2=53. Общая сумма «зануления» - 1. Нижняя оценка левой группы маршрутов равна 51+1=52. В результате анализа было составлено дерево ветвления алгоритма (в соответствии с рисунком 5.3).
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Рисунок 5.3 - Дерево ветвления алгоритма
Построение оптимального маршрута выполним используя рисунок 6 и 5. На последнем (четвертом шаге) осталось два свободных (не запрещенных) ребра 1-3 и 4-1. Оба ребра включает в маршрут и добавляем ребра из левой ветви.
Оптимальный маршрут будет состоять ребер 1-3; 4-1; 3-2; 2-5; 6-4 и 5-6. После упорядочения получим: 1-3-2-5-6-4-1.
Ответ: длина оптимального маршрута не менее 52, порядок объезда городов: 1-3-2-5-6-4-1.
6. Анализ полученных результатов
Программа полностью работоспособна и верно рассчитывает задачу-тест. Результат работы программы отображен на рисунке 6.1:
Рисунок 6.1 - Результат работы программы
7. Инструкция пользователю и описание программы
Запуск программы представляет собой окно в котором находится таблица расстояний между серверными машинами для заполнения которой необходимо выбрать количество серверов, и заполнить таблицу.
Рисунок 7.1 - Окно ввода данных в программу
После выбора количества серверов и заполнения данных, необходимо нажать кнопку «Расчет» для расчета оптимального пути обхода.
После проведения всех расчетов в графе Длина пути и Оптимальный путь обхода будут предоставлены результаты. В графе Дерево подмножеств будет показано вычисление минимального пути.
Рисунок 7.2 - окно вычисления программы и вывод результатов
Полученные данные можно сохранить на компьютере для дальнейшей работы, или открыть их на другом компьютере. Для это нужно открыть меню Файл/Сохранить, появиться диалоговое окно сохранения, файл сохраняется с расширением *.kom. Чтобы открыть файл нужно выбрать меню Файл/Открыть и в диалоговом окне выбрать файл с расширением *.kom.
В меню Справка можно просмотреть что делает программа и что нужно для её выполнения. В меню Теория будет описаны действия пользователя в программе для получения результатов.
Рисунок 7.3 - справка о теории
В меню Справка/О программе будет описано для чего создана эта программа
Рисунок 7.4 - справка о программе
Заключение
Задача сетевого метода планирования используется в решениях поиска наикратчайшего пути с минимально затраченными ресурсами. Суть таких задач состоит в нахождении суммарной минимальной характеристики (расстояния, стоимости и т.д.), при этом мы должны проложить все кабеля n серверных станций по одному разу, и вернуться к самой первой станции с которого начали.
Существуют несколько методов решения таких задач: метод полного перебора, «жадные» методы (Крускала, Прима, и т.п.), генетические алгоритмы и еще множество их обобщений. Однако только метод Литтла (метод ветвей и границ) дает нам в итоге самое оптимальное решение.
В основе метода лежит следующая идея если нижняя граница для подобласти A дерева поиска больше, чем верхняя граница какой-либо ранее просмотренной подобласти B, то A может быть исключена из дальнейшего рассмотрения (правило отсева).
Задачи сетевого метода планирования имеют множество обобщений и методы её решения в различных проявлениях используются на практике.
Список литературы
1. Вентцель Е.С. Исследование операций: задачи, принципы, методология. - М.: Высшая школа, 2010. - 208 с.
2. Исследование операций в экономике/ Под ред. Кремера Н.Ш. - М.:ЮНИТИ, 2011. - 407 с.
3. Конюховский П.В. Математические методы исследования операций в экономике. Краткий курс. - СПб.: Питер, 2010. - 208 с.
4. Просветов Г.И. Математические методы в экономике: Учебно-методическое пособие. - М.: Издательство РДЛ, 2011. - 160 с.
5. Орлова И.В. Экономико-математическое моделирование: Практическое пособие по решению задач. - М.: Вузовский учебник, 2011. - 144 с.
6. Костевич Л.С. Математическое программирование: Информационные технологии оптимальных решений. - Мн.: Новое знание, 2010. - 424 с.
7. Акулич И.Л. Математическое программирование в примерах и задачах. - М.: Высшая школа, 2012. - 319 с.
Приложение
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, Menus;
const
NN=10;
type
Gorod=array[1..NN,1..NN] of integer;
Dopolnit=array[1..NN] of integer;
ConPrived=array[0..NN,0..2] of integer;
Iskluch=array[1..NN] of byte;
ItogPuti=array[1..NN*2] of integer;
type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label4: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
Label6: TLabel;
Label7: TLabel;
ComboBox1: TComboBox;
Label2: TLabel;
Label13: TLabel;
Label15: TLabel;
Label18: TLabel;
Label12: TLabel;
Label19: TLabel;
Label16: TLabel;
Label110: TLabel;
Label14: TLabel;
Label17: TLabel;
Label11: TLabel;
Label23: TLabel;
Label25: TLabel;
Label28: TLabel;
Label22: TLabel;
Label29: TLabel;
Label26: TLabel;
Label210: TLabel;
Label24: TLabel;
Label27: TLabel;
Label21: TLabel;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Edit19: TEdit;
Edit110: TEdit;
Edit21: TEdit;
Edit22: TEdit;
Edit23: TEdit;
Edit24: TEdit;
Edit25: TEdit;
Edit26: TEdit;
Edit27: TEdit;
Edit28: TEdit;
Edit29: TEdit;
Edit210: TEdit;
Edit31: TEdit;
Edit32: TEdit;
Edit33: TEdit;
Edit34: TEdit;
Edit35: TEdit;
Edit36: TEdit;
Edit37: TEdit;
Edit38: TEdit;
Edit39: TEdit;
Edit310: TEdit;
Edit41: TEdit;
Edit42: TEdit;
Edit43: TEdit;
Edit44: TEdit;
Edit45: TEdit;
Edit46: TEdit;
Edit47: TEdit;
Edit48: TEdit;
Edit49: TEdit;
Edit410: TEdit;
Edit51: TEdit;
Edit52: TEdit;
Edit53: TEdit;
Edit54: TEdit;
Edit55: TEdit;
Edit56: TEdit;
Edit57: TEdit;
Edit58: TEdit;
Edit59: TEdit;
Edit510: TEdit;
Edit61: TEdit;
Edit62: TEdit;
Edit63: TEdit;
Edit64: TEdit;
Edit65: TEdit;
Edit66: TEdit;
Edit67: TEdit;
Edit68: TEdit;
Edit69: TEdit;
Edit610: TEdit;
Edit71: TEdit;
Edit72: TEdit;
Edit73: TEdit;
Edit74: TEdit;
Edit75: TEdit;
Edit76: TEdit;
Edit77: TEdit;
Edit78: TEdit;
Edit79: TEdit;
Edit710: TEdit;
Edit81: TEdit;
Edit82: TEdit;
Edit83: TEdit;
Edit84: TEdit;
Edit85: TEdit;
Edit86: TEdit;
Edit87: TEdit;
Edit88: TEdit;
Edit89: TEdit;
Edit810: TEdit;
Edit91: TEdit;
Edit92: TEdit;
Edit93: TEdit;
Edit94: TEdit;
Edit95: TEdit;
Edit96: TEdit;
Edit97: TEdit;
Edit98: TEdit;
Edit99: TEdit;
Edit910: TEdit;
Edit101: TEdit;
Edit102: TEdit;
Edit103: TEdit;
Edit104: TEdit;
Edit105: TEdit;
Edit106: TEdit;
Edit107: TEdit;
Edit108: TEdit;
Edit109: TEdit;
Edit1010: TEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedureFormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
procedureInputMatrix;
procedureEtap(varGInd:integer);
procedureKonkurir(varr,m:byte);
procedureOpredilPuti;
procedureSbros;
procedureDelStrStolb(Stroka,Stolb:byte);
procedure Tree(K,XPos,YPos,Index,RG,MG,Blok,GIn:byte);
functionObjEdit(S: string; IndexX: byte; IndexY: byte): TEdit;
functionObjLabel(S: string; IndexX: byte): TLabel;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ParKonkur,GorodaIJ:Gorod;
Ci,Cj:Dopolnit;
GIndexKon:ConPrived;
IsklStrok:Iskluch;
IsklStolb:Iskluch;
TreeList:TEdit;
ListName:TLabel;
Puti,NewPut:ItogPuti;
N:byte;
K:integer;
implementation
{$R *.dfm}
{****************************************************}
{Функция обращение к элементам EditчерезихName в строковом режиме}
function TForm1.ObjEdit(S: string; IndexX: byte; IndexY: byte): TEdit;
begin
Result:=Form1.FindComponent(S + IntToStr(IndexX) + IntToStr(IndexY)) as TEdit;
end;
{****************************************************}
{Функция обращение к элементам LabelчерезихName в строковом режиме}
function TForm1.ObjLabel(S: string; IndexX: byte): TLabel;
begin
Result:=Form1.FindComponent(S + IntToStr(IndexX)) as TLabel;
end;
{****************************************************}
{Процедура чтения матрицы из Edit`ов}
procedure TForm1.InputMatrix;
var
i,j:integer;
begin
for i:=1 to N do
begin
GorodaIJ[i,i]:=-1;
for j:=1 to N do
begin
ifi<>j then
begin
GorodaIJ[i,j]:=StrToInt(ObjEdit('Edit',i,j).Text);
end;
end;
end;
end;
{****************************************************}
{Процедура нахождения перспективной пары из множества конкурирующих пар}
procedure TForm1.Konkurir(varr,m:byte);
var
i,j,l:byte;
xmin,ymin,max:integer;
begin
for i:=1 to N do
for j:=1 to N do
ParKonkur[i,j]:=-1;
{Определяем множество конкурирующих пар городов и определяем для них оценку}
for i:=1 to N do
for j:=1 to N do
ifGorodaIJ[i,j]=0 then
begin
xmin:=9999; ymin:=9999;
for l:=1 to N do
begin
if (GorodaIJ[i,l]<=xmin) and (GorodaIJ[i,l]<>-1) and (l<>j) then
xmin:=GorodaIJ[i,l];
if (GorodaIJ[l,j]<=ymin) and (GorodaIJ[l,j]<>-1) and (l<>i) then
ymin:=GorodaIJ[l,j];
end;
ifxmin=9999 then xmin:=0;
ifymin=9999 then ymin:=0;
ParKonkur[i,j]:=xmin+ymin;
end;
{Находим перспективную пару (r,m)}
max:=-1;
for i:=1 to N do
for j:=1 to N do
ifParKonkur[i,j]>max then
begin
max:=ParKonkur[i,j];
r:=i; m:=j;
end;
end;
{***************************************************}
{Процедуры ПРИВЕДЕНИЯ матрицы.
А также для нахождения нижней оценки G}
procedure TForm1.Etap(varGInd:integer);
var
i,j,min:integer;
begin
GInd:=0;
{Находим минимальный элемент матрицы по строкам}
for i:=1 to N do
begin
min:=-1;
for j:=1 to N do
begin
ifGorodaIJ[i,j]<>-1 then
begin
if min=-1 then min:=GorodaIJ[i,j];
ifGorodaIJ[i,j]<=min then
begin
min:=GorodaIJ[i,j];
end;
end;
end;
if min=-1 then min:=0;
Cj[i]:=min;
end;
{отнимаем минимальные элементы из элементов соответствующих строк}
for i:=1 to N do
begin
for j:=1 to N do
begin
ifGorodaIJ[i,j]<>-1 then
GorodaIJ[i,j]:=GorodaIJ[i,j]-Cj[i];
end;
end;
{Находим минимальный элемент полученной матрицы по столбцам}
for j:=1 to N do
begin
min:=-1;
for i:=1 to N do
begin
ifGorodaIJ[i,j]<>-1 then
begin
if min=-1 then min:=GorodaIJ[i,j];
ifGorodaIJ[i,j]<=min then
begin
min:=GorodaIJ[i,j];
end;
end;
end;
if min=-1 then min:=0;
Ci[j]:=min;
end;
{отнимаем минимальные элементы из элементов соответствующих столбцов и находим оптимальное множество с оценкой}
for i:=1 to N do
begin
GInd:=GInd+Cj[i]+Ci[i];
for j:=1 to N do
begin
ifGorodaIJ[i,j]<>-1 then
GorodaIJ[i,j]:=GorodaIJ[i,j]-Ci[j];
end;
end;
end;
{****************************************************}
{ПроцедуравычеркиванияизматрицыStrokaстрокииStolbстолбца}
procedure TForm1.DelStrStolb(Stroka,Stolb:byte);
var
i:byte;
begin
if (Stroka<>0) and (Stolb<>0) then
for i:=1 to N do
begin
GorodaIJ[Stroka,i]:=-1;
GorodaIJ[i,Stolb]:=-1;
end;
end;
{****************************************************}
{Процедура нахождения оптимального пути}
procedure TForm1.OpredilPuti;
var
i,j,k,l:integer;
Fl:boolean;
begin
{Поиск начального элемента}
for i:=1 to n do
begin
Fl:=False;
for j:=1 to N do
ifPuti[i*2-1]=Puti[j*2] then Fl:=true;
if not Fl then
begin
NewPut[1]:=Puti[i*2-1];
NewPut[2]:=Puti[i*2];
end;
end;
{Составления оптимального маршрута}
fork:=1 toN+1 do
begin
for l:=1 to N+1 do
ifPuti[l*2-1]=Newput[k] then
begin
NewPut[k]:=Puti[l*2-1];
NewPut[k+1]:=Puti[l*2];
end;
NewPut[N+1]:=newput[1];
end;
{Вывод последовательности городов на экран}
for i:=1 to N do
Label3.Caption:=Label3.Caption+'A'+inttostr(newPut[i])+'->';
Label3.Caption:=Label3.Caption+'A'+inttostr(newPut[N+1]);
end;
{****************************************************}
{Процедура проверки на замкнутость пути}
procedureProverkaIskl;
var
i,j,Stroka,Stolbec,x,y:byte;
begin
x:=0;
y:=0;
for i:=1 to N do
begin
Stroka:=0;
Stolbec:=0;
for j:=1 to N do
begin
if (GorodaIJ[i,j]=-1) and (IsklStrok[i]<>1) then
if (IsklStolb[j]<>1) then Stroka:=1;
if (GorodaIJ[j,i]=-1) and (IsklStolb[i]<>1) then
if (IsklStrok[j]<>1) then Stolbec:=1;
end;
if (Stroka=0) and (IsklStrok[i]<>1) then
begin
x:=i;
Stroka:=1;
end;
if (Stolbec=0) and (IsklStolb[i]<>1) then y:=i;
end;
if x<>0 then
if y<>0 then GorodaIJ[x,y]:=-1;
end;
{****************************************************}
{Процедура вывода дерева ветления на экран}
procedure TForm1.Tree(K,XPos,YPos,Index,RG,MG,Blok,GIn:byte);
begin
with Image1.Picture.Bitmap.Canvas do
begin
Font.Name:='Arial';
Font.Style:=[fsBold];
Pen.Width:=2;
Pen.Color:=clMaroon;
if (XPos=0) and (YPos=0) then
begin
Font.Size:=7;
Font.Color:=clBlue;
Brush.Color:=clYellow;
Ellipse(N*30-15,10,15+N*30,40);
TextOut(N*30-10,18,'G[0]');
Brush.Color:=clWhite;
Font.Color := clBlue;
TextOut(N*30-27,18,IntToStr(GIn));
end
else begin
Font.Size:=7;
Font.Color:=clBlue;
Brush.Color:=clYellow;
Ellipse(XPos*50+N*30-30-YPos*30+K*60,10+YPos*50,XPos*50+N*30-60-YPos*30+K*60,40+YPos*50);
TextOut(XPos*50+N*30-58-YPos*30+K*60,18+YPos*50,('G['+IntToStr(Index+1)+','+IntToStr(XPos)+']'));
Brush.Color:=clWhite;
Font.Color := clGreen;
if Blok=1 then
Font.Style:=[fsStrikeOut,fsBold]
elseFont.Style:=[fsBold];
TextOut(XPos*55+N*30-60-YPos*30+K*60,YPos*50-8,'('+IntToStr(RG)+','+IntToStr(MG)+')');
Font.Color := clBlue;
Font.Style:=[fsBold];
TextOut(XPos*94+N*30-115-YPos*30+K*60,YPos*50+18,IntToStr(GIn));
Pen.Color:=clRed;
MoveTo(XPos*50+N*30-45-YPos*30+K*60,10+YPos*50);
LineTo(Index+N*30-(YPos-1)*30+K*60,38+(Index)*50);
end;
end;
end;
{****************************************************}
{Процедура создания главной формы}
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.Bitmap:=nil;
Image1.Picture.Bitmap := TBitmap.Create;
Image1.Picture.Bitmap.Width := Image1.Width;
Image1.Picture.Bitmap.Height := Image1.Height;
end;
{****************************************************}
{Процедура сброса всех значений}
procedure TForm1.Sbros;
var
i,j:integer;
begin
K:=-1;
for i:=1 to NN do
begin
Ci[i]:=0;
Cj[i]:=0;
IsklStrok[i]:=0;
IsklStolb[i]:=0;
for j:=1 to NN do
GorodaIJ[i,j]:=0;
end;
for i:=0 to NN do
for j:=0 to 2 do
GIndexKon[i,j]:=0;
for i:= 1 to NN*2 do
begin
Puti[i]:=0;
NewPut[i]:=0;
end;
Label3.Caption:='';
Image1.Picture.Bitmap.canvas.fillrect(canvas.cliprect) ;
if N>6 then
begin
Image1.Width:=250+(N-6)*30;
Image1.Height:=310+(N-6)*50;
Image1.Picture.Bitmap.Width := Image1.Width;
Image1.Picture.Bitmap.Height := Image1.Height;
Form1.Height:=395+(N-6)*50;
Form1.Width:=640+(N-6)*30;
end
else
begin
Image1.Width:=250;
Image1.Height:=310;
Form1.Height:=445;
Form1.Width:=640;
end;
end;
{****************************************************}
{Процедура нажатия кнопки начала}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,RGor,MGor:byte;
Flag:boolean;
begin
K:=-1;
{Получения количества городов}
N:=StrToInt(ComboBox1.Text);
{Сброс всех значений на 0}
Sbros;
Flag:=true;
{Ввод матрицы длин путей между городами}
InputMatrix;
{Предварительный этап.Определения исходного множества G0}
Etap(GIndexKon[0,1]);
GIndexKon[0,2]:=GIndexKon[0,1];
{Вывод G0 на экран в виде вершины дерева}
Tree(0,0,0,0,0,0,0,GIndexKon[0,1]);
{Определение множества конкурирующих пар и выбор перспективной пары}
Konkurir(RGor,MGor);
Puti[1]:=RGor;
Puti[2]:=MGor;
GorodaIJ[RGor,MGor]:=-1;
{i-ыеитерации.}
for i:=1 to N-1 do
if Flag then
begin
{ОпределениемножестваG(i,2)}
Etap(GIndexKon[i,2]);
ifGIndexKon[i-1,1]<GIndexKon[i-1,2] then
GIndexKon[i,2]:=GIndexKon[i,2]+GIndexKon[i-1,1]
else begin GIndexKon[i,2]:=GIndexKon[i,2]+GIndexKon[i-1,2];
K:=K+1;
End;
{Вывод подмножества G(i,2) на экран в виде листа дерева}
Tree(K,2,i,i-1,RGor,MGor,1,GIndexKon[i,2]);
{Удаление RGor'ой строки и MGor'ого столбца}
DelStrStolb(RGor,MGor);
IsklStrok[RGor]:=1;
IsklStolb[MGor]:=1;
{Вызов процедуры предотвращения образования коротких и длинных подциклов}
ProverkaIskl;
{Определение множества G(i,1)}
Etap(GIndexKon[i,1]);
ifGIndexKon[i-1,1]<GIndexKon[i-1,2] then
GIndexKon[i,1]:=GIndexKon[i,1]+GIndexKon[i-1,1]
elseGIndexKon[i,1]:=GIndexKon[i,1]+GIndexKon[i-1,2];
Label6.Caption:='Длинапути: '+IntToStr(GIndexKon[i,1]);
{Вывод подмножества G(i,1) на экран в виде листа дерева}
Tree(K,1,i,i-1,RGor,MGor,0,GIndexKon[i,1]);
{Определение множества конкурирующих пар и выбор перспективной пары}
Konkurir(RGor,MGor);
ifParKonkur[RGor,MGor]>=0 then
begin
Puti[i*2+1]:=RGor;
Puti[i*2+2]:=MGor;
end;
ifParKonkur[RGor,MGor]<0 then Flag:=false;
IsklStrok[RGor]:=1;
IsklStolb[MGor]:=1;
GorodaIJ[RGor,MGor]:=-1;
end;
{Определение оптимального маршрута}
OpredilPuti;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
i,j:byte;
begin
for i:=1 to NN do
begin
ObjLabel('Label1',i).Visible:=False;
ObjLabel('Label2',i).Visible:=False;
for j:=1 to NN do
ObjEdit('Edit',i,j).Visible:=False;
end;
N:=StrToInt(ComboBox1.Text);
for i:=1 to N do
begin
ObjLabel('Label1',i).Visible:=True;
ObjLabel('Label2',i).Visible:=True;
for j:=1 to N do
ObjEdit('Edit',i,j).Visible:=True;
end;
end;
procedure TForm1.N2Click(Sender: TObject);
var
FInput:Integer;
i,j:byte;
s,num:integer;
begin
Sbros;
OpenDialog1.InitialDir:=Application.ExeName;
OpenDialog1.Filter:='ФайлКоммивояжера (*.kom)|*.kom';
if not OpenDialog1.Execute then exit;
FInput:=FileOpen(OpenDialog1.FileName,fmOpenRead);
FileRead(FInput,num,sizeof(num));
for i:=1 to num do
for j:=1 to num do
ifi<>j then
begin
FileRead(FInput,s,sizeof(s));
ObjEdit('Edit',i,j).Text:=IntToStr(s);
end;
ComboBox1.ItemIndex:=num-2;
ComboBox1Change(ComboBox1);
FileClose(FInput);
end;
procedure TForm1.N3Click(Sender: TObject);
var
FOutput:Integer;
i,j:byte;
s,num:integer;
begin
SaveDialog1.InitialDir:=Application.ExeName;
SaveDialog1.Filter:='ФайлКоммивояжера(*.kom)|*.kom';
if not SaveDialog1.Execute then exit;
FOutput:=FileOpen(SaveDialog1.FileName,fmOpenWrite);
ifFOutput=-1 then
FOutput:=FileCreate(ChangeFileExt(SaveDialog1.FileName,'.kom'));
num:=StrToInt(ComboBox1.Text);
FileWrite(FOutput,num,sizeof(num));
for i:=1 to num do
for j:=1 to num do
ifi<>j then
begin
s:=StrToInt(ObjEdit('Edit',i,j).Text);
FileWrite(FOutput,s,SizeOf(s));
end;
FileClose(FOutput);
ChangeFileExt(SaveDialog1.FileName,'.kom');
procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.N7Click(Sender: TObject);
begin
ShowMessage ('I?ia?aiiaaey?aoaieycaaa?eeiiieaiy?a?a, iooaiiaia?o?aieyieieiaeuiiaiiooeiaoiaaai?iaiaeniieucoyiaoiaaaoaae e a?aieo')
end;
procedure TForm1.N8Click(Sender: TObject);
begin
ShowMessage('A a?aoa "Eiee?anoaiai?iaia" oeacaou ?eneioi?ae, a oaaeeoa "?annoiyieyia?aoai?iaaie" aaanoecia?aiey, aeaaiiaeucaiieiyaonyaaoiiaoe?anee, ciae ### yoi 0');
ShowMessage('Aey?an?aoaio?iiia?aoueiiieo "Iaeoeioou", iieo?aiiua?acoeuoaouaoaooioia?a?aouny a a?aoaAeeiaiooe e Iioeiaeuiueiaoia, a oae?aaoaaoiieacaiiAa?aaiiiaiii?anoa');
ShowMessage('?acoeuoaouii?iinio?aieouiaeiiiu?oa?a n ?anoe?aieai *.kom a iaiea n i?ia?aiiie');
Подобные документы
Цель работы: изучить и научиться применять на практике симплекс - метод для решения прямой и двойственной задачи линейного программирования. Математическая постановка задачи линейного программирования. Общий вид задачи линейного программирования.
реферат [193,4 K], добавлен 28.12.2008Применение линейного программирования для решения транспортной задачи. Свойство системы ограничений, опорное решение задачи. Методы построения начального опорного решения. Распределительный метод, алгоритм решения транспортной задачи методом потенциалов.
реферат [4,1 M], добавлен 09.03.2011Решение задачи линейного программирования графическим и симплекс-методом. Решение задачи двойственной к исходной. Определение оптимального плана закрепления потребителей за поставщиками однородного груза при условии минимизации общего пробега автомобилей.
контрольная работа [398,2 K], добавлен 15.08.2012Математическая формулировка задачи линейного программирования. Применение симплекс-метода решения задач. Геометрическая интерпретация задачи линейного программирования. Применение методов линейного программирования к экстремальным задачам экономики.
курсовая работа [106,0 K], добавлен 05.10.2014Построение одноиндексной математической модели задачи линейного программирования, ее решение графическим методом. Разработка путей оптимизации сетевой модели по критерию "минимум исполнителей". Решение задачи управления запасами на производстве.
контрольная работа [80,8 K], добавлен 13.12.2010Математическая формализация оптимизационной проблемы. Геометрическая интерпретация стандартной задачи линейного программирования, планирование товарооборота. Сущность и алгоритм симплекс-метода. Постановка транспортной задачи, последовательность решения.
учебное пособие [126,0 K], добавлен 07.10.2014Формулировка проблемы в практической области. Построение моделей и особенности экономико-математической модели транспортной задачи. Задачи линейного программирования. Анализ постановки задач и обоснования метода решения. Реализация алгоритма программы.
курсовая работа [56,9 K], добавлен 04.05.2011- Примеры использования графического и симплексного методов в решении задач линейного программирования
Экономико-математическая модель получения максимальной прибыли, её решение графическим методом. Алгоритм решения задачи линейного программирования симплекс-методом. Составление двойственной задачи и её графическое решение. Решение платёжной матрицы.
контрольная работа [367,5 K], добавлен 11.05.2014 Решение задачи линейного программирования графическим способом. Определение экстремальной точки. Проверка плана на оптимальность. Правило прямоугольников. Анализ и корректировка результатов решения задач линейного программирования симплексным методом.
контрольная работа [40,0 K], добавлен 04.05.2014Общая постановка задачи линейного программирования (ЛП). Приведение задачи ЛП к стандартной форме. Теоремы двойственности и их использование в задачах ЛП. Транспортная задача и её решение методом потенциалов. Интерполирование табличных функций.
курсовая работа [337,1 K], добавлен 31.03.2014