. ЛИНЕЙНЫЕ МЕТОДЫОПТИМИЗАЦИИ,ЗАДАЧА ЛИНЕЙНОГОПРОГРАММИРОВАНИЯ,ЕЕ ПОСТАНОВКАИ СВОЙСТВА
1.1 Постановказадачи линейногопрограммирования
В экономикепомимо соотношенийзатрат, выпуска,спроса, предложенияи т.п., частовозникаетнеобходимостьвыбора одногоиз возможныхвариантовфункционированияэкономическойсистемы. Экономическиоправдано втаких условияхставить вопросо выборе наилучшеговарианта. Чтопонимать подлучшим вариантомзадается в видекритерия (цели).В количественномвыражениикритерий представляетсобой функциональнуюзависимостьот переменныхпоказателей,в дальнейшембудем ее называтьцелевой (критериальной)функцией. Наилучшийвариант в такомслучае соответствуетнаибольшему(экстремальному,оптимальному)значению функции.
В экономическихзадачах, какправило, областьизмененияпеременныхпараметровограниченаи оптимальноезначение целевойфункции требуетсянайти на ограниченноммножестве.Область исследования,заключающаясяв нахожденииалгоритмоврешения подобныхзадач, образуетнаправление,которое называетсяматематическимпрограммированием.
Экономическиетребованиянакладываютсвои особенности:в практическихзадачах числопеременныхи ограниченийдостаточновелико, целеваяфункция невсегда дифференцируема.Поэтому методыклассическогоанализа дляотысканияэкстремумовк задачамматематическогопрограммированиячасто неприменимы.Возникаетнеобходимостьразработкиспециальныхметодов решениязадач математическогопрограммированияи, следовательно,как всегда втаких случаях,появляютсяновые направления,требующиеупорядочения,классификации.Классификациязадач происходитв зависимостиот экономическихусловий, видовограничений,переменныхи параметров,методов решения.
Традиционнов математическомпрограммированиивыделяют следующиеосновные разделы.
Линейноепрограммирование- целевая функциялинейна, множество,на которомищется экстремумцелевой функции,задается системойлинейных равенстви неравенств.В свою очередьв линейномпрограммированиисуществуютклассы задач,структуракоторых позволяетсоздать специальныеметоды их решения,выгодно отличающиесяот методоврешения задачобщего характера.Так, в линейномпрограммированиипоявился разделтранспортныхзадач, блочногопрограммированияи др.
Н
лист
Кп-км-п-44-2203-99
елинейноепрограммирование- нелинейныцелевая функцияи ограничения.Нелинейноепрограммированиепринято подразделятьследующимобразом:-
выпуклоепрограммирование- когда выпуклацелевая функция,если рассматриваетсязадача ее минимизации(либо выпуска,если ищетсямаксимум), ивыпукло множество,на которомрешаетсяэкстремальнаязадача;- квадратичноепрограммирование- когда целеваяфункция квадратичная,а ограничения- линейные равенстваи неравенства.
Многоэкстремальныезадачи - здесьобычно выделяютспециализированныеклассы задач,часто встречающихсяв приложениях,например, задачио минимизациина выпукломмножествевогнутых функций.
Важным разделомматематическогопрограммированияявляетсяцелочисленноепрограммирование- когда на переменныенакладываютсяусловия целочисленности.
Первой из"неклассических"задач оптимизациибыла подробноисследованазадача отысканияэкстремумалинейной функциина множестве,заданном линейныминеравенствамии равенствами.Раздел теорииоптимизации,изучающий такиезадачи, получилназвание "линейноепрограммирование".
В данномразделе изучаетсязадача линейногопрограммирования,которая задаетсяследующимобразом.
1. Задача решаетсяотносительно переменных .
В дальнейшемони будутзаписыватьсяв виде либовектора-столбца
(X1)
X = ( .. )
либо вектора-строких = (х1,..., хn).
Предполагается,что вектор хдолжен удовлетворятьсистеме nлинейных неравенств
a11x1+ ….+a1nxn
am1x1+….+amnxn
3. В экономическихзадачах присутствуетдополнительноенеобходимоеусловие: координатывектора х должныбыть неотрицательными:
X>= 0 (2)
где 0 - нулевойвектор-столбецразмерностиn.
4. Целеваяфункция представляетсобой линейнуюфункцию переменныхX1,…..,Xn
P1X1+…..PmXn=f(x1,….,xn) (3)
Лист
Кп-км-п-44-2203-99
5
.Общая задачалинейногопрограммирования(ЛП) состоит ввыборе векторах, удовлетворяющегосистеме неравенств(1),(2)и максимизирующегоцелевую функцию( 3 ).Математическизадача ЛПзаписываетсяследующимобразом:P1X1+…..+PnXn max(x1
при условиях
{a11x1+…….+a1nxn
{……………………………} (5)
{am1x1+…….+amnxn
x1>=0, x2>=0,……,xn>=0 (6)
или
n
E pixi max
J=1 x1,..,xn
при условиях
n
{ E a1jxj
j=1
{…………
n
{ E a1jxj
j=1
{…………
n
{ E mjxj
x1,….,xn >=0
Задача ЛинейногоПрограммированияв матричнойформе записываетсяследующимобразом. Обозначимчерез bвектор-столбецправой частиСЛН
(b1)
B = (….)
(bm)
через А - матрицукоэффициентовСЛН:
a11…..a1n
……..
A = ……..
Лист
Кп-км-п-44-2203-99
am1…..amnч
ерезр - вектор-строкукоэффициентовцелевой функции.Напомним, выражение(р, х) означаетскалярноепроизведениевекторов р их. Тогда в матричномвиде задачаЛП записывается:(P,X)max(x)
при условии:
Ax
x>=0
Таким образом,в задаче ЛинейногоПрограммированияконстантами(параметрами)являются коэффициентыматрицы А, векторправой частиВ и коэффициентыцелевой функции- вектор P.Подлежит определениювектор х*=х1,..,,хn,),который удовлетворяетограничениям( 8 ),( 9):
Ах*
х*>0,
и доставляетмаксимум целевойфункции ( 7):
max(p,x)=(р, х*).
Это матричнаязапись задачиЛП на максимумв стандартнойформе.
Запись задачилинейногопрограммирования( 4) -(6) или (7) - (9) называютзаписью ЗЛПв стандартнойформе.
Иногда, исходяиз практическихтребований,отдельныеограниченияна переменныех,, ..., х„ могутиметь вид точногоравенства
n
E aijxj=bi
I=1 (10)
Это значит,что решениетребуетсяискать средивекторов х,координатыкоторых удовлетворяютi-муограничениюкак точномуравенству.Чтобы привестив этом случаезадачу к стандартномувиду, уравнение(10)достаточнозаменить насистему из двух^неравенств:
{ E ai jxj
{ E aij xj>=bi(11)
или
{ E aij xj
{ E aij xj
Лист
Кп-км-п-44-2203-99
У
равнение( 11)и система (12 ) или эквивалентны.Задача линейногопрограммированиявида:mах(р, х)
Ах=B (13 )
х>0
называетсязадачей линейногопрограммированияв каноническойформе.
Чтобы привестизадачу линейногопрограммированияв стандартнойфюрме к формеканонической,следует ввестидополнительныепеременныеui,ui>=0,i=1,2,….,m , такие,что
E aij xj+ui=bi, i=1,….,m
Причем целеваяфункция приэтом должнаоставатьсянеизменной.Для этого запишемцелевую функциюв виде:
EpjXj+0*u1+0*u2+…..0*um
Здесь коэффициентыпри переменныхu1,….,um полагаютсяравными нулю.Тогда задача(7)- (9)в каноническомвиде принимаетвид:
( n )
( E PjXj ) maxx
( j=1 )
(14)
при условиях:
n
Eaijxj+ui=bi, i=1,…..,m (15)
j=1
x1,…..,xn>=0 u1,…..um>=0 (16)
Стандартнаязадача линейногопрограммированияна минимум
(матричнаязапись) записываетсяв виде:
(p,x) maxx (17)
при условиях:
ax>=b
x>=0 (18)
или в записив виде неравенств:
Лист
Кп-км-п-44-2203-99
E
pjXjmin x1..xnпри ограничениях:
E aij xj>=bi
…………..
Eaij xj>=bm
X1….xn>=0
Таким образом,не важно, в какойформе получаютсялинейные ограничения:в форме равенствили в форменеравенств.Эквивалентнымипреобразованиямивозможно привестинеравенствак равенствами наоборот.Необходимостьпреобразованийобычно связанас тем, какойприменяетсяметод решения.
Пусть некоторый,однородныйтовар (продукт)хранится наMскладах ипотребляетсяв Nпунктах (например,магазинах).Известны следующиепараметры:
ai - запаспродукта на -омскладе,ai>0, i=1,….,m
bj-потребностьв продукте в -омпункте,bj>0,j=1,….,n
Cij -стоимостьперевозкиединичногоколичестватовара с -госклада в -й пункт, . Планируетсяполностьюперевезти товарсо складов иполностьюудовлетворитьпотребностив пунктах назначения.При этом предполагается,что суммарныезапасы равнысуммарнымпотребностям:
m n
E ai = E bj (19)
i=1 j=1
Транспортнаязадача ставитсякак каноническаязадача ЛП следующегоспециальноговида:
m n
E E CijXij min (20)
i=1 j=1
при условиях:
Лист
Кп-км-п-44-2203-99
n
E xij=ai,i=1,…,m (21)
J=1
n
E xij=bj,j=1,….,n (22)
I=1
Xij>=0, i=1,…..m j=1,….n (23)
где - количествотовара, перевозимогос I-госклада в J-ыйпункт. Инымисловами, требуетсятак организоватьперевозкипродукта соскладов в пунктыпотребления,чтобы при полномудовлетворениипотребностейминимизироватьсуммарныетранспортныерасходы. Заметим,что условие( )является необходимыми достаточнымдля существованиярешения транспортнойзадачи.
Лист
Кп-км-п-44-2203-99
4 .Анализ задачиили модели.
4.1 Определениеопорного планатранспортнойзадачи
Для решениятранспортнойзадачи разработанонесколькометодов, каждыйиз которыхотличаетсяот другогометодом заполненияматрицы перевозок. Существуютдва типа транспортнойзадачи:открытая изакрытая.Транспортнаязадача называетсяоткрытой еслисумма запасовтовара на складахотличаетсяот суммы потребностейтоваров у магазинов.Транспортнаязадача называетсязакрытой , еслисумма запасовтовара на складахравняется суммепотребностеймагазинов.Решение существуеттолько длязакрытой транспортнойзадачи, поэтомуесли транспортнаязадача открытая, то ее надо привестик закрытомутипу. Для этого в случае , еслизапас товарана складахпревышаетпотребностьмагазинов, товводят фиктивногопотребителя,который выбираетвесь избытоктовара. В случаеже, если существуетдефицит товара,т.е. потребностьмагазиновбольше, чемзапас товаровна складах, товводят фиктивногопоставщика,с фиктивнымзапасом товарана складе. Вобоих случаяхв матрице тарифовперевозок |C|данномускладу илимагазинупроставляетсянулевая ценаперевозки.
Алгоритмметода минимальногоэлемента состоитв следующем.
Просматриваетсявся матрицатарифов перевозок,и из нее выбираетсяпозиция с наименьшимзначениемтарифа C,затем просматриваютсязначения наличиязапасов наскладе A и потребностиу потребителя B,затем в даннуюклетку записываетсявеличина D=MIN(A,B).Из запасовсоответствующегосклада и потребностеймагазина вычитаетсявеличина D. Если запас товара на складеисчерпан, тоэта строкаисключаетсяиз дальнейшегорассмотрения.Если потребностьмагазина втоваре удовлетворенаполностью, то этот столбецисключаетсяиз дальнейшегорассмотрения.Может бытьслучай , когдаодновременноисключаютсяи строка и столбец,этот случайназываетсявырожденным.В дальнейшемвесь процессповторяется до тех пор , покане будет исчерпанвесь запастоваров наскладах и небудет удовлетворенапотребностьвсех магазинов.По полученнойматрице перевозоквычисляется целевая функциязадачи Z.
Лист
Кп-км-п-44-2203-99
Метод состоитв следующем.Просматриваютсявсе строки истолбцы матрицытарифов, вычисляетсяразность междудвумя наименьшимиэлементамив строке илив столбце. Затемиз всех этихразностейвыбираетсястрока илистолбец смаксимальнойразность. Ввыбраннойстроке илистолбце , каки в методеминимальногоэлемента, заполняетсяклетка с наименьшимзначениемтарифа. Затемобнулявшаясястрока илистолбец исключаютсяиз рассмотренияи весь процессповторяетсядо полногоисчерпаниязапаса товаровна складах. Пополученнойматрице перевозоквычисляетсяцелевая функцияZ.
В начальнойсвоей стадииэтот методпохож на методминимальногоэлемента , нодля столбцов.Просматриваетсяпервый столбецматрицы тарифов,в нем находитсянаименьшийэлемент. Затемпроверяется, минимален лиэтот элементв своей строке.Если элементминимален всвоей строке,то по методуминимальногоэлемента в этуклетку заноситсязначение D=MIN(A,B),
соответствующиезапас и потребностьуменьшаютсяна эту величину.Обнулившаясястрока илистолбец исключаютсяиз рассмотренияи процессповторяется,начиная с первогонеисключенногостолбца. Еслинайденныйминимальныйэлемент неминимален всвоей строке,то происходитпереход к следующемустолбцу и такдо тех пор, покане будет найдентакой элемент.По полученнойматрице перевозоквычисляетсяцелевая функцияZ. Этотметод требуетинтенсивныхоперации обменас памятью , поэтомуболее громоздокпо сравнениюс остальнымии требует большихвычислительныхресурсов.
Как и любаязадача линейногопрограммирования,необходимопостроитьпервоначальныйопорный пландля решениязадачи. Однимиз методовпостроенияисходногоопорного планаявляется такназываемыйметод «северо-западного»угла.
Лист
Кп-км-п-44-2203-99
Метод состоитв следующем.Просматриваетсяматрица тарифовперевозок C, начинаяс левого верхнегоугла (клетки).В эту клеткузаписываетсявеличина D=MIN(A,B).Она вычитаетсяиз запасов ипотребностейсоответствующегосклада и магазина.Обнулившаясястрока илистолбец исключаютсяиз рассмотрения,затем процессопять повторяетсядля левой верхнейклетки оставшейсяматрицы и такдо тех пор покавесь запастоваров небудет исчерпан.Полученныйопорный планне оптимален,поэтому егодальнейшеерешение продолжаютодним из вышерассмотренныхметодов.
Лист
Кп-км-п-44-2203-99
2 .Предмодельныйанализ.
2.1 Анализсуществующиханалогов иподсистем
Программноеобеспечениедля решениязадач линейногопрограммированияи в частности,транспортнойзадачи разработаноуже в конце60-ых – начале70-ых годов и былореализованокак пакет программ– библиотек.Данный пакетзадач был реализованна таких алгоритмическихязыках какАлгол, Фортран.В западныхразработкахв основномприменялсяалгоритмическийязык Кобол. Споявлениемперсональныхкомпьютеровданный пакетбыл перемещенна ПК, с учетомособенностейреализациитранслятороввышеперечисленныхязыков на ПК.Также дополнительнобыли реализованыпакеты программ,в основномусилиями вузовна языках Паскаль,Си. Переноспрограммногообеспеченияна ПК открылновые возможностив решении задачлинейногопрограммированияи наглядногоотображениярезультатоввычислении,что отсутствовалона большихвычислительныхсистемах –мэйнфреймах.
Ход вычислениии его результаты,особенно длямногомерныхзадач с большимчислом переменныхможно былонаглядно отобразитьна мониторе.Кроме тогопоявлениеинтерактивныхпрограмм, программ, в ход которыхчеловек- оператормог активновмешаться,корректироватьпромежуточныерезультаты, изменить методикурасчетов, значительнооблегчал иускорял разработкунового программногообеспечения.
С развитиемаппаратногообеспечениясовершенствовалосьи программноеобеспечение.Алгоритмическиеязыки тожесовершенствовалисьсогласно потребностям экономики,науки и т.д.
Особо бурноеразвитие программногообеспеченияначалось споявлениемоперационнойсистемы Windows.Почти всесуществующеепрограммноеобеспечениеи алгоритмическиеязыки былиперенесенына эту операционнуюплатформу.ВозможностиWindows усилилиинтерактивнуюсторону этихалгоритмическихязыков, перейдяна объектно-ориентированныйпринцип построенияалгоритмов,что позволялоиспользоватьуже наработанноепрограммноеобеспечениебез большихизменений.
Одним из бурноразвивающихсяалгоритмическихязыков являетсяPascal иего диалекты.Первоначальноэтот язык былсоздан дляобучения студентовосновам программирования,ввиду своейпростоты инаглядностиконструкции.Он был созданНиклаусомВиртом, и послужилосновой дляцелого семействапаскале-подобныхязыков –Modula, Classcal, Object Pascal.
Наиболееразвитую системупрограммированияна языке Pascalпостроилафирма Borland– Turbo Pascal. Первоначальноона была реализованадля DOS,с появлениемWindows ,она была перенесенав нее. И наконец,была выпущенановая версиядля Windows– Delphi.
Лист
Кп-км-п-44-2203-99
Без баз данныхсегодня невозможнопредставитьработу большинствафинансовых,промышленных,торговых ипрочих организаций.Потоки информации,циркулирующиев мире, которыйнас окружает,огромны. Вовремени ониимеют тенденциюк увеличению.Не будь базданных, мы давнозахлебнулисьбы в информационнойлавине. Базыданных позволяютинформациюструктурировать,хранить и извлекатьоптимальнымдля пользователяобразом.
Посколькуиспользованиебаз данныхявляется однимиз краеугольныхкамней, на которыхпостроеносуществованиеразличныхорганизаций,пристальноевниманиеразработчиковприложенийбаз данныхвызывают инструменты,при помощикоторых такиеприложенияможно было бысоздавать.Выдвигаемыек ним требованияв общем видеможно сформулироватькак:
"быстрота,простота,эффективность,надежность".
Среди большогоразнообразияпродуктов дляразработкиприложенийDelphi занимаетодно из ведущихмест. Delphi иотдают предпочтениеразработчикис разным стажем,привычками,профессиональнымиинтересами.С помощью Delphiнаписаноколоссальноеколичествоприложений,десятки фирми тысячипрограммистов-одиночекразрабатываютдля Delphi дополнительныекомпоненты.
В основе такойобщепризнаннойпопулярностилежит тот факт,что Delphi, какникакая другаясистема программирования,удовлетворяетизложеннымвыше требованиям.Действительно,приложенияс помощью Delphiразрабатываютсябыстро, причемвзаимодействиеразработчикас интерактивнойсредой Delphiне вызываетвнутреннегоотторжения,а наоборот,оставляетощущение комфорта.Delphi -приложенияэффективны,если разработчиксоблюдаетопределенныеправила (и часто- если не соблюдает).Эти приложениянадежны и приэксплуатацииобладаютпредсказуемымповедением.
Н
Лист
Кп-км-п-44-2203-99
овот проста лиDelphi?И да, и нет. Оналишь кажетсяпростой, посколькумногие "подводныекамни" скрытыот разработчика.Однако чембольше изучаешьее, тем большестановитсяясной ее глубина,которая одновременнои вызываетуважение, ипугает. Лишьсо временемприходит пониманиетого, что длянаписаниядействительномощных и функциональныхприложенийтребуетсяпостоянноеизучение Delphi.Б лок-схемаменю определениеопорного плана(Transtask.pas)
1
2
3
Да
нет
4 Да
5
нет
6 Да
7
нет
8 Да
9
нет
Лист
Кп-км-п-44-2203-99
10
11
12
13
Да
14
нет
15
16
Лист
Кп-км-п-44-2203-99
Блок-схемаподпрограммырешения методомминимальногоэлемента MINIELEM
1
2
3
4
5
6 Да
7
нет
8
Да
9
нет
Лист
Кп-км-п-44-2203-99
10
11
Да
12
13
Лист
Кп-км-п-44-2203-99
Блок-схемаподпрограммырешения транспортнойзадачи Transsolver
1
2
Да
3
нет
4 Да
5
нет
6
7
нет
8
Лист
Кп-км-п-44-2203-99
unitUnit1;
interface
uses
Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids;
type
TForm1= class(TForm)
StringGrid1:TStringGrid;
private
{Private declarations }
public
{Public declarations }
end;
var
Form1:TForm1;
word:string;
words:TStringList;
i:integer;
implementation
{$R*.DFM}
Form1.slString=TStringList.Create;
fori:=1 to 8 do
begin
word:=IntTostr(i);
words.add(word)
end
end.
Лист
Кп-км-п-44-2203-99
unitTransTask;
interface
uses
Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,ExtCtrls, Grids, ComCtrls, Math;
type
TfmTransTask= class(TForm)
pgcTransTask:TPageControl;
tbsAbout:TTabSheet;
tbsData:TTabSheet;
tbsTarif:TTabSheet;
tbsSolve:TTabSheet;
Label1:TLabel;
edProviderCount:TEdit;
spnProviderCount:TUpDown;
Label2:TLabel;
stgProvider:TStringGrid;
Label3:TLabel;
Label4:TLabel;
edCustomerCount:TEdit;
spnCustomerCount:TUpDown;
stgCustomer:TStringGrid;
Label5:TLabel;
lblTypeTask:TLabel;
lblProviderGruz:TLabel;
lblCustomerGruz:TLabel;
stgTarif:TStringGrid;
stgSolve:TStringGrid;
rgMetod:TRadioGroup;
rbMinelem:TRadioButton;
rbFogel:TRadioButton;
rbTwoWall:TRadioButton;
btnSolve:TButton;
btnPrint:TButton;
Label6:TLabel;
Label7:TLabel;
Label8:TLabel;
Label9:TLabel;
btnLoadData:TButton;
btnLoadDataC:TButton;
lblProvider:TLabel;
lblCustomer:TLabel;
lblTupeTask:TLabel;
lblMsg:TLabel;
Label10:TLabel;
lblZ:TLabel;
procedureFormCreate(Sender: TObject);
procedureedProviderCountChange(Sender: TObject);
procedureedCustomerCountChange(Sender: TObject);
procedurebtnLoadDataClick(Sender: TObject);
procedurebtnLoadDataCClick(Sender: TObject);
procedurebtnSolveClick(Sender: TObject);
procedurebtnPrintClick(Sender: TObject);
Лист
Кп-км-п-44-2203-99
private{ Private declarations }
public
{Public declarations }
end;
var
fmTransTask:TfmTransTask;
a,b:array of integer;// наличиегруза у поставщиков
//и спрос у потребителей
c:array of array of integer; // матрицатарифов перевозок
d:array of array of integer;// матрицаперевозок(решение)
z,m,n:integer;//число поставщикови потребителей
s:string;
implementation
{$R*.DFM}
procedureShowSolve;
var
i,j:integer;
begin
fori:= 0 to m-1 do
forj:= 0 to n-1 do
fmTransTask.stgSolve.Cells[j+1,i+1]:=IntToStr(d[i,j]);
fmTransTask.lblZ.Caption:=IntToStr(z);
end;
procedureMinelem;
label
l1;
var
i,j,imin,jmin,cmin:integer;
set_i:setof 0..255;
set_j:setof 0..255;
begin
//создаем множествоиндексов
set_i:=[];
fori:=0 to m-1 do include(set_i,i);
set_j:=[];
forj:=0 to n-1 do include(set_j,j);
z:=0;
repeat
//поиск первоначальногоминимальногоьэлемента вматрице тарифов
fori:= 0 to m-1 do
forj:= 0 to n-1 do
if(i in set_i) and (j in set_j) then
begin
cmin:=c[i,j];
gotol1
end;
l1:
//поиск минимальногоэлемента в
//в матрице тарифовc
fori:= 0 to m-1 do
forj:= 0 to n-1 do
if(i in set_i) and (j in set_j) then
ifc[i,j]
begin
Лист
Кп-км-п-44-2203-99
cmin:=c[i,j];imin:=i;
jmin:=j
end;
//определениевеличины поставки
d[imin,jmin]:=min(a[imin],b[jmin]);
// определяемисключаемуюстроку столбец
a[imin]:=a[imin]-d[imin,jmin];
ifa[imin]=0 then
exclude(set_i,imin);
b[jmin]:=b[jmin]-d[imin,jmin];
ifb[jmin]=0 then
exclude(set_j,jmin);
z:=z+d[imin,jmin]*cmin
until(set_i=[]) and (set_j=[]);
ShowSolve
end;
procedureFogel;
var
i,j:integer;
cminprev,cmin:integer;
SubCol,SubRow:arrayof array of integer;
set_i,set_j:setof 0..255;
imin,jmin:integer;
imax,jmax:integer;
SubRowMax,SubColMax:integer;
begin
//размещаеммассивы
SetLength(SubRow,m);
fori:= 0 to m-1 do SetLength(SubRow[i],2);
SetLength(SubCol,n);
forj:= 0 to n-1 do SetLength(SubCol[j],2);
set_i:=[];
fori:=0 to m-1 do include(set_i,i);
set_j:=[];
forj:=0 to n-1 do include(set_j,j);
repeat
//цикл по строкам
fori:= 0 to m-1 do
ifi in set_i then
begin
//ищем первоначальныйминимальныйэлемент в строке
forj:= 0 to n-1 do
ifj in set_j then
begin
cmin:=c[i,j];
break
end;
//ищем 1-ое наименьшеезначение встроке
forj:= 0 to n-1 do
Лист
Кп-км-п-44-2203-99
if j in set_j thenif c[i,j]
begin
cmin:=c[i,j];
SubRow[i,1]:=j
end;
cminprev:=cmin;
//ищем первоначальныйминимальныйэлемент в строке
forj:= 0 to n-1 do
if(j in set_j) and (jSubRow[i,1]) then
begin
cminprev:=c[i,j];
break
end;
//ищем 2-ое наименьшеезначение встроке
forj:= 0 to n-1 do
if(j in set_j) and (jSubRow[i,1]) then
ifc[i,j]
cminprev:=c[i,j];
//Вычисляемразность междудвумя наименьшими
SubRow[i,0]:=cminprev-cmin;
end;
//цикл по столбцам
forj:= 0 to n-1 do
ifj in set_j then
begin
//ищем первоначальныйминимальныйэлемент в столбце
fori:= 0 to m-1 do
ifi in set_i then
begin
cmin:=c[i,j];
break
end;
//ищем 1-ое наименьшеезначение встолбце
fori:= 0 to m-1 do
ifi in set_i then
ifc[i,j]
begin
cmin:=c[i,j];
SubCol[j,1]:=i
end;
cminprev:=cmin;
//ищем первоначальныйминимальныйэлемент в столбце
fori:= 0 to m-1 do
if(i in set_i) and (iSubCol[j,1]) then
begin
cminprev:=c[i,j];
break
end;
//ищем 2-ое наименьшеезначение встолбце
fori:= 0 to m-1 do
if(i in set_i) and (iSubCol[j,1]) then
ifc[i,j]
cminprev:=c[i,j];
//Вычисляемразность междудвумя наименьшими
SubCol[j,0]:=cminprev-cmin;
end;
Лист
Кп-км-п-44-2203-99
//отыскиваеммаксимальноезначение встроке// сперванаходим начальныйнаибольшийэлемент
fori:= 0 to m-1 do
ifi in set_i then
begin
SubRowMax:=Subrow[i,0];
break
end;
//Теперь просматриваемвсю строку
fori:= 0 to m-1 do
ifi in set_i then
ifSubRow[i,0]>=SubRowMax then
begin
SubRowMax:=SubRow[i,0];
imax:=i
end;
//отыскиваеммаксимальноезначение встроке
//сперва находимначальныйнаибольшийэлемент
forj:= 0 to n-1 do
ifj in set_j then
begin
SubColMax:=SubCol[j,0];
break
end;
//Теперь просматриваемвсю строку
forj:= 0 to n-1 do
ifj in set_j then
ifSubCol[j,0]>=SubColMax then
begin
SubColMax:=SubCol[j,0];
jmax:=j
end;
//сравниваеммаксимальноезначение разностипо строкам истолбцам
ifSubRowMax>SubColMax then
begin
d[imax,SubRow[imax,1]]:=min(a[imax],b[SubRow[imax,1]]);
a[imax]:=a[imax]-d[imax,SubRow[imax,1]];
b[SubRow[imax,1]]:=b[SubRow[imax,1]]-d[imax,SubRow[imax,1]];
ifa[imax]=0 then Exclude(set_i,imax);
ifb[SubRow[imax,1]]=0 then
Exclude(set_j,SubRow[imax,1]);
z:=z+d[imax,SubRow[imax,1]]*c[imax,SubRow[imax,1]];
ifset_i=[] then set_j:=[];
ifset_j=[] then set_i:=[]
end
else
begin
d[SubCol[jmax,1],jmax]:=min(a[SubCol[jmax,1]],b[jmax]);
a[SubCol[jmax,1]]:=a[SubCol[jmax,1]]-d[SubCol[jmax,1],jmax];
b[jmax]:=b[jmax]-d[SubCol[jmax,1],jmax];
ifa[SubCol[jmax,1]]=0 then Exclude(set_i,SubCol[jmax,1]);
ifb[jmax]=0 then
Exclude(set_j,SubCol[jmax,1]);
z:=z+d[SubCol[jmax,1],jmax]*c[SubCol[jmax,1],jmax];
ifset_i=[] then set_j:=[];
ifset_j=[] then set_i:=[]
end
Лист
Кп-км-п-44-2203-99
until (set_i=[]) and (set_j =[]);ShowSolve
end;
procedureTwoWall;
var
RowMin,ColMin:integer;
i,j,jj,j0:integer;
imin,jmin:integer;
set_i,set_j:setof 0..255;
begin
set_i:=[];
fori:=0 to m-1 do include(set_i,i);
set_j:=[];
forj:=0 to n-1 do include(set_j,j);
repeat
//начинаем циклпо столбцам
forj:= 0 to n-1 do
ifj in set_j then
begin
//находим начальныйминимальныйэлемент строки
fori:= 0 to m-1 do
ifi in set_i then
begin
RowMin:=c[i,j];
break
end;
//теперь просматриваемвесь столбец
fori:=0 to m-1 do
ifi in set_i then
ifc[i,j]
begin
RowMin:=c[i,j];
imin:=i
end;
//минимальныйэлемент в j-омстолбце найден
//проверяем ,минимальныйли он в своейстроке
j0:=j;
forjj:= 0 to n-1 do
ifjj in set_j then
ifc[imin,jj]
j0:=jj;
//проверяем поиндексу не тотли это элемент
ifj=j0 then
begin
d[imin,j]:=min(a[imin],b[j]);
a[imin]:=a[imin]-d[imin,j];
b[j]:=b[j]-d[imin,j];
ifa[imin]=0 then exclude(set_i,imin);
ifb[j]=0 then exclude(set_j,j);
z:=z+d[imin,j]*c[imin,j];
end
end
until(set_i=[]) and (set_j=[]);
ShowSolve
e
Лист
Кп-км-п-44-2203-99
nd;procedureTfmTransTask.FormCreate(Sender: TObject);
var
i,j:integer;
begin
m:=3;
n:=3;
SetLength(a,m);
fori:= 0 to m-1 do a[i]:=0;
SetLength(b,n);
forj:= 0 to n-1 do b[j]:=0;
SetLength(c,m);
fori:= 0 to m-1 do SetLength(c[i],n);
fori:= 0 to m-1 do
forj:= 0 to n-1 do
c[i,j]:=0;
SetLength(d,m);
fori:= 0 to m-1 do SetLength(d[i],n);
fori:= 0 to m-1 do
forj:= 0 to n-1 do
d[i,j]:=0;
fori:= 1 to m do
begin
stgProvider.Cells[i-1,0]:=IntToStr(i);
str(a[i-1],s);
stgProvider.Cells[i-1,1]:=s;
end;
forj:= 1 to n do
begin
stgCustomer.Cells[j-1,0]:=IntToStr(j);
str(b[j-1],s);
stgCustomer.Cells[j-1,1]:=s;
end;
fori:= 1 to m do
stgTarif.Cells[0,i]:=IntToStr(i);
forj:= 1 to n do
stgTarif.Cells[j,0]:=IntToStr(j);
fori:= 1 to m do
stgSolve.Cells[0,i]:=IntToStr(i);
forj:= 1 to n do
stgSolve.Cells[j,0]:=IntToStr(j);
end;
procedureTfmTransTask.edProviderCountChange(Sender: TObject);
var
i:integer;
b
Лист
Кп-км-п-44-2203-99
eginstgProvider.ColCount:=StrToInt(edProviderCount.Text);
stgTarif.RowCount:=stgProvider.ColCount+1;
stgSolve.RowCount:=stgTarif.RowCount;
m:=StrToInt(edProviderCount.Text);
SetLength(a,m);
SetLength(c,m);
fori:= 0 to m-1 do SetLength(c[i],n);
SetLength(d,m);
fori:= 0 to m-1 do SetLength(d[i],n);
stgProvider.Cells[stgProvider.ColCount-1,0]:=edProviderCount.Text;
stgTarif.Cells[0,stgProvider.ColCount]:=edProviderCount.Text;
stgSolve.Cells[0,stgProvider.Colcount]:=edProviderCount.Text;
end;
procedureTfmTransTask.edCustomerCountChange(Sender: TObject);
var
i:integer;
begin
stgCustomer.ColCount:=StrToInt(edCustomerCount.Text);
stgTarif.ColCount:=stgCustomer.ColCount+1;
stgSolve.ColCount:=stgTarif.ColCount;
n:=StrToInt(edCustomerCount.Text);
SetLength(b,n);
SetLength(c,m);
fori:= 0 to m-1 do SetLength(c[i],n);
SetLength(d,m);
fori:= 0 to m-1 do SetLength(d[i],n);
stgCustomer.Cells[stgCustomer.ColCount-1,0]:=edCustomerCount.Text;
stgTarif.Cells[stgCustomer.ColCount,0]:=edCustomerCount.Text;
stgSolve.Cells[stgCustomer.Colcount,0]:=edCustomerCount.Text;
end;
procedureTfmTransTask.btnLoadDataClick(Sender: TObject);
var
i,j:integer;
suma,sumb:integer;
begin
fori:= 0 to m-1 do
ifstgProvider.Cells[i,1]'' then
a[i]:=StrToInt(stgProvider.Cells[i,1])
else
a[i]:=0;
suma:=0;
fori:= 0 to m-1 do suma:=suma+a[i];
lblProvider.Caption:=IntToStr(suma);
forj:= 0 to n-1 do
ifstgCustomer.Cells[j,1]'' then
b[j]:=StrToInt(stgCustomer.Cells[j,1])
else
b[j]:=0;
sumb:=0;
forj:= 0 to n-1 do sumb:=sumb+b[j];
lblCustomer.Caption:=IntToStr(sumb);
ifsumbsuma then
Лист
Кп-км-п-44-2203-99
beginlblTypeTask.Caption:='Открытая';
Ifsumb>suma then
lblMsg.Caption:='Создатьфиктивногопоставщикас грузом '+IntToStr(sumb
-suma);
ifsumb lblMsg.Caption:='Создатьфиктивногопотребителясо спросом '+ IntToStr(suma-sumb) end else begin lblTypeTask.Caption:='Закрытая'; lblMsg.Caption:='' end; btnSolve.Enabled:=True end; procedureTfmTransTask.btnLoadDataCClick(Sender: TObject); var i,j:integer; begin fori:= 0 to m-1 do forj:= 0 to n-1 do ifstgTarif.Cells[j+1,i+1]'' then c[i,j]:=StrToInt(stgTarif.Cells[j+1,i+1]); end; procedureTfmTransTask.btnSolveClick(Sender: TObject); begin if rbMinelem.Checked then Minelem; if rbFogel.Checked then Fogel; if rbTwoWall.Checked then TwoWall end; procedureTfmTransTask.btnPrintClick(Sender: TObject); var i,j:integer; out:TextFile; begin AssignFile(out,'rezult.txt'); Rewrite(out); writeln(out,'Исходныеданные транспортнойзадачи'); writeln(out,'потребностьпотребителей'); forj:= 0 to n-1 do write(out,b[j]:8); writeln(out); writeln(out,'Матрицатарифов перевозок'); fori:= 0 to m-1 do begin write(out,a[i]:8); forj:= 0 to n-1 do write(out,c[i,j]:8); writeln(out) end; writeln(out,'Матрицаперевозок(решение)'); fori:= 0 to m-1 do begin Лист Кп-км-п-44-2203-99
Лист
Кп-км-п-44-2203-99
writeln(out)end;
CloseFile(out);
end;
End.
7.8 Инструкция
Аппаратныеи программныетребования
Для нормальнойработы программынеобходимперсональныйкомпьютерсовместимыйс IBM PC ,с процессоромне ниже
486, тактовойчастотой 120 Мгц,оперативнойпамятью неменее 8 МБ, занимаемоеместо на дискепосле инсталляции5 МБ.
Операционнаясистема Windows95,98,NT.
Инсталляцияи запуск программы.
В
Лист
Кп-км-п-44-2203-99
Косновным критериямкачества любоймодели относятсятакие как:
критерийадекватности;
чувствительности;
устойчивостимодели.
Критерийадекватности
Подадекватностьюмодели понимаетсяее способностьнаиболее точноотражать всесвойства ихарактеристикимоделируемойсреды. В качествекритериевадекватностиможно выбрать, например, величинуотличия (абсолютныхи относительных)входных и выходныххарактеристикмодели и реальногообъекта, сравнительнаяоценка реакциимодели и объектаи т.д.
Критерийчувствительности
Подкритериемчувствительностипонимают степеньвоздействияизмененияпараметровмодели на результатывыдаваемыемоделью. Изменениепараметровможно моделироватьменяя коэффициентыв системе уравнений, описывающихмодель, характеризменениявходных данныхи т.д.
Критерийустойчивости
Критерийустойчивости– это количественнаяили качественнаяоценка, котораяхарактеризуетисследуемуюмодель какустойчивуюили неустойчивую.
П
Лист
Кп-км-п-44-2203-99
Лист
Кп-км-п-44-2203-99
6 .Тестированиеи отладка
6.1 Синтаксическаяотладка
Синтаксическаяотладка предназначенадля устраненияошибок в языковыхконструкцияхна этапе написанияисходноготекста программы.Большинствоинтегрированныхпакетов разработкипрограммногообеспечениясодержат встроенныесредства проверкипрямо в ходенаписания кодапрограммы.Средства проверкине только находятсинтаксическиеошибки, но такжеделают подсказкиили дают рекомендациидля написанияданной конструкции.Второй этап, на которомвыявляютсясинтаксическиеошибки – этокомпиляция,когда компиляторстрока за строкойанализируетисходный коди выдает листингсинтаксическихошибок.
Семантическаяотладка осуществляетсядля проверкисемантикиязыковых конструкциии являетсяодним из этаповсинтаксическойотладки.
Тестовыеотчеты и анализтестирования
Присдаче программногообеспеченияв эксплуатациюнеобходимапровести еготестовый прогонв области допустимыхзначении входныхпараметров.Для этого , восновном проводятручной обсчетодного илинесколькихвариантоврешения задачии затем сверяютвоспроизводимость результатовмоделью. Адекватностьюмодели служитполная воспроизводимость тестовыхданных.
Лист
Кп-км-п-44-2203-99
6 .2Семантическаяотладка
Семантическаяотладка - этопроцесс нахожденияи исправленияошибок связанныхс неправильнымуказаниемлогическихстраниц данных.
Семантическаяотладка подразумеваетв себя проверкупоэтапногохода выполненияпрограммы. Этоможно выявитьпри тестированиепрограммыправильно лимы задали тип False или True.
В Delpfiпри выполненииопераций влогическихвыраженияхподдерживаетсядве различныемодели:
вычислениепо полной схеме
вычислениепо короткойсхеме.
При полнойсхеме всегдавычисляютсявсе операндыи выполняютсявсе операциивыражения, дажеесли его результатбудет известенуже после первойоперации.
При использованиикороткой схемывычислениеоперандов ирезультатовопераций выполняетсястрого с левана право ипрекращается,как тольковыполнениедальнейшихдействий перестанетоказыватьвлияние наконечный результатвсего выражения.
6.4 Оптимизацияпрограммы
Входе отладкипрограммногопакета возникаетвопрос о такихпоказателяхкак скорость(быстродействие)работы программы,объем занимаемогоместа на диске,необходимыйобъем оперативнойпамяти
Лист
Кп-км-п-44-2203-99
О писаниеблок-схемыпрограммыTranstask.pas
№ п/п | Содержание |
1 | Начало |
2 | Вызовглавной формы |
3 | Выборметода решения |
4 | Методминимальногоэлемента |
5 | Вызываетсяпроцедураmetod1 |
6 | МетодФогеля |
7 | Вызываетсяпроцедураmetod2 |
8 | Методдвойногопредпочтения |
9 | Вызываетсяпроцедураmetod3 |
10 | Вводразмерноститаблицы перевозокm,n |
11 | Отображениепустой таблицыперевозокm*n |
12 | Вводтаблицы данных:ВекторА, Вектор В,Матрица С |
13 | Проверяетсяоткрытая задача |
14 | Да.Введениефиктивногопоставщикаили потребителя. |
15 | Нет.Решение транспортнойзадачи. |
16 | Отображениерезультатоврешения |
17 | Конец |
ОписаниеБлок-схемы менюопределениеопорного плана.
№ п.п | Содержание |
1 | Начало |
2 | Методминимальногоэлемента |
3 | Вызываетсяпрограммаminiem |
4 | МетодФогеля |
5 | ВызываетсяпрограммаFogel |
6 | Методдвойногопредпочтения |
7 | ВызываетсяпрограммаDoublePref |
8 | Конец |
Лист
Кп-км-п-44-2203-99
О писаниеблок-схемыОпределениеопорного планатранспортнойзадачи методомминимальногоэлемента.
№ п.п | Содержание |
1 | Начало |
2 | Выборминимальноготарифа |
3 | Определяемimin,j min. |
4 | Amin = Min(a i min, b j min) |
5 | Корректируемэлементы исходногомассива |
6 | Ai min =0 |
7 | Исключаемстроку imin |
8 | Bj min = 0 |
9 | Исключаемстолбец jmin |
10 | Заносимв матрицуперевозокзначение Amin |
11 | Проверяем(ai j and b i j) = 0 |
12 | Вычислениецелевой функцииZ |
13 | Конец |
Лист
Кп-км-п-44-2203-99
Студентагруппы П-44
ГолубовскогоДениса Николаевича
Тема:Нахождениеопорного планатранспортнойзадачи
курсовогопроекта ТлисоваЛ.Б
5 Лист Кп-км-п-44-2203-99
.1 Тестированиепрограмм
Тестированиеалгоритмови программ --одна из наиболеесложных иответственныхзадач в процессеих отладки.Времени длятестированиямало, но и спешкав работе недопустима,слишком дорогообходятсянеудачныепопытки предъявитьрешение задачи.Проверка корректностиалгоритмов,равно как исоставлениеавторами задачидостаточнополного наборакорректныхтестов -- наборовданных для задачи и ответовк ним -- далеконе всегдапредставляютсобой простуюпроблему.
Взадачах наэтапе тестированияпрограмм естьмного общего-- и те и другиедолжны обеспечитькорректностьалгоритмов.Но есть и различия.Автор задачине ограниченво времени, нодолжен предусмотретьвсе возможныеогрехи участника.Спецификаположениятестирующего,связана с коварствомсоставителятестов, от которогоможно ожидать,например,непредвиденнойглубины рекурсии,разрядности,точности вычисленийили размерностинаборов данных.Поэтому будетнеправильно,успешно решивзадачу длянарисованногона листочкебумаги примера.
Будьтевнимательны!Всегда естьопасностьполучить посуществу правильный,но не тот ответ.Кроме того,способ описанияответа можетпослужитьнамеком наиспользуемыйавтором алгоритмрешения задачи.
Проверкаалгоритма наданных максимальнойустановленнойразмерности:по количествуперечисленныхв условияхзадачи объектов,по количествусвязей междуними, по разрядностии точностимашинногопредставлениячисловых параметрови пр. Такая проверканужна для выявленияи отсева неэффективных- медленно работающихили нерациональноиспользующихпамять программ.Известны случаи,когда, в принципе,правильноработающийалгоритм приводилк ошибочномуответу из-заошибок переполнения-- в условияхзадачи оговариваетсядиапазон илиразрядностьисходных данных,но не разрядностьпромежуточныхрезультатовили ответа.Типичным примеромгрубой ошибкитакого родаможет служитьнахождениеопорного планатранспортнойзадачи. Проверкаработоспособностиалгоритма ввырожденныхслучаях: срабатываниепустого илисостоящегоиз единственногоэлемента цепногосписка, работапрограммы сграфом, не содержащимдуг и т.п. В некоторыхслучаях, например,при декомпозициизадачи, когдарешение задачисводится крешению задачименьшей размерностипереход отначальногоi=0 уменьшениемна единицуможет привестик непредусмотренномуэффекту выходаза границызарезервированнойпамяти. Результатработы на нижнейгранице размерностилегко просчитывается,иногда он будетполучен каки в общем случае,иногда удобнейвручную просчитатьего и предусмотретьособую веткупрограммы, ноникогда о немне следуетзабывать.
Следуетиметь ввиду,что построениеавторами заданийтестов, особенно,значительнойразмерностипредставляетсобой непростуюзадачу. Возможнонесколькоподходов кпостроениютестов.
С
оставлениетестов вручную.Это возможно,когда решениезадачи непредставляетсобой вычислительнойсложности (всясложность --логическая).Задача "Путьна кубе" раздела"Геометрия"-- пример именнотакой задачи.Во всех остальныхслучаях подобныйпуть тупиковый.У участниковолимпиадыиногда выборанет, но не забывайтепроверитьслучаи вырожденнойи максимальнойразмерностихотя бы в тривиальномварианте (матрицаиз нулей и единицне содержитнулей или единиц,в ней единственнаястрока илиединственныйстолбец, в графенет дуг, илиграф полный).П
рименениеслучайныхчисел. Такиегенераторытестов удобноконструироватьдля числовыхпоследовательностей,матриц илиграфов. Достаточнозадать один-- два параметранастройкидатчика случайныхчисел и в вашемраспоряжениизамечательныетесты. Припостроенииматрицы из 0-1таким параметромбудет доляединиц средиэлементовматрицы, координатыочереднойединицы определяютсяв результатеиспытания сравномернымраспределениемсреди элементовэтой матрицы,при построенииграфа -- среднеечисло дуг, выходящихиз вершины.Лист
Кп-км-п-44-2203-99
По дисциплинеКомпьютерноемоделирование
Наименованиеучебного предмета
На тему:Нахождениеопорного планатранспортнойзадачи
Группа П-44
Специальность2203 “ПрограммноеобеспечениеВТ и АС”
Председательруководитель
курсовогопроектирования
ТлисоваЛ.Б
Дата___________
1 .2Описание целеймоделированияих приоритеты.
Цель - Этообраз несуществующего,но желаемогос точки зрениярассматриваемойпроблемы состояниясреды.
Система- Средство достиженияцели, т,е всёто, что нужнодля достиженияцели.
Модель служитдля исследования.
Требованияк модели:
наглядность
обозримость
доступностьдля исследования
Моделированиеявляетсяэкспериментальнойи прикладнойметодологиейимеющая целью:
описаниеповедениясистемы
по строительныетеории и гипотезыкоторые могутобъяснитьнаблюдаемоеповедение.
Использоватьэти теории дляпредсказаниябудущего поведениясистемы, т.етех воздействийкоторые могутбыть вызваныизменениемв системе илиизменениеспособов еёфункционирования.
Данные скоторыми приходитьсяиметь дело ,часто представляютсяв виде таблицы.Это может бытьсвязано либос тем, что объём таблиц ограничени в них можнопривести лишьнекоторыеданные.
Цель интерполяциисостоит в отысканиизначения функциив некоторойпромежуточнойточке по отношениюк табличнымданным.
лист
Кп-км-п-44-2203-99
2
лист
Кп-км-п-44-2203-99
.2 Анализ техническогообеспечениясреды моделирования.ЭВМ широкоприменяетсядля решениянаучных, техническихи экономическихзадач. Они способныпроизводитьвычисленияочень быстро,выводить оченьточные результаты,заполнятьбольшие массивыинформациии производитьдлинные и сложныепоследовательныевычислениябез вмешательствачеловека.
Современныйкомпьютер имеетследующиеосновные компоненты:
центральныйпроцессор ,который выполняетарифметическиеи логическиеоперации иорганизуетпроцесс выполненияпрограмм.
Память служащаядля храненияинформации
В
нешниеустройствадля управлениякомпьютерови ввода - выводаинформации.