48564 (Разработка имитационной модели транспортной сети), страница 2
Описание файла
Документ из архива "Разработка имитационной модели транспортной сети", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48564"
Текст 2 страницы из документа "48564"
увеличивают поток через каждое ребро этого пути на величину ;
строят новый поток и переходят к шагу 2.
Обычно сеть задается матрицей пропускной способностей всех ребер сети . Задавая , затем вычисляют на k-м шаге матрицу значений потоков на дугах . Строят матрицу разностей . В этой матрице насыщенным ребрам при потоке будут соответствовать нулевые элементы, ненасыщенным - ненулевые элементы. Поэтому вычисление матрицы достаточно как для построения множества узлов по которым вещество из достигает по ненасыщенным ребрам до , так и для построения последовательности ненасыщенных ребер.
Технология составления этих списков следующая:
сначала составляют список узлов, в каждый из которых ведет ненасыщенное ребро из вершины i;
далее для каждого i-го узла составляют свой список узлов, в каждый из которых из i-го узла ведет ненасыщенное ребро (за исключением тех узлов, которые уже вошли в ранее составленные списки) и так далее.
Этот процесс выписывания списков заканчивается в двух случаев. Либо появиться узел , что означает продолжение работы алгоритма, либо в список выписанных узлов не попал узел , что означает конец расчетов.
1.4 Метод Монте-Карло
Пусть требуется разыграть дискретную случайную величину X, т. е получить последовательность её возможных значений xi, зная закон распределения X:
X | x1 | x2 | … | xn |
p | p1 | p2 | … | pn |
Рисунок 1.1 - Распределение случайной величины X
Обозначим через R непрерывную случайную величину, распределённую равномерно в интервале (0,1), а через rj, - её возможные значения, т.е. случайные числа.
Разобьём интервал 0 R <1 на оси Оr точками с координатами p1, p1+ p2, p1+ p2+ p3,..., p1 + p2 +…+ pn-1 на n частичных интервалов ∆1, ∆2,..., ∆n, длины которых p1, p2,…, pn соответственно. Таким образом, |∆i|= pi (1), где i=1, 2, …,n.
Теорема: если каждому случайному числу rj (0 rj <1), которое попало в интервал ∆i, ставить в соответствие возможное значение xi, то разыгрываемая величина будет иметь заданный закон распределения:
Так как при попадании случайного числа rj в частичный интервал ∆i разыгрываемая величина принимает возможное значение xi, а таких интервалов всего n, то разыгрываемая величина имеет те же возможные значения, что и X, а именно x1, x2,..., xn. Вероятность попадания случайной величины R в интервал ∆i равна его длине, а в силу |∆i|= pi, получим, что вероятность попадания R в интервал ∆i равна pi. Следовательно, вероятность того, что разыгрываемая величина примет возможное значение xi, также равна pi. Таким образом разыгрываемая величина имеет заданный закон распределения как показано на рисунке 1.1
Правило: для того чтобы разыграть дискретную случайную величину, заданную законом распределения (2) нужно:
1) разбить интервал (0;
2) оси на Or на n частичных интервалов:
∆1 = (0; p1), ∆2= (p1; p1 +p2),..., ∆n= (p1 +p2 +…+pn-1;
3) выбрать случайное число rj (например, из таблицы случайных чисел). Если rj попало в частичный интервал ∆i, то разыгрываемая случайная величина приняла возможное значение xi.
2. Имитационная моделЬ железнодорожной сети
2.4 Формализация модели железнодорожной сети
Рассмотрим железнодорожную сеть:
Рисунок 2.1.1 - Граф железнодорожной сети
Узлы - это города, через которые проходит сеть дорог. Дуги - это участки пути, соединяющие соответствующие города. Каждая дуга имеет свою пропускную способность. В сети кроме транзитных потоков существуют внутренние транспортные потоки, которые значительно снижают пропускную способность участка сети дорог. В каждом узле происходят процессы формирования и расформирования составов.
Пусть имеется один узел отправления и один узел назначения. Требуется определить с учётом структуры сети и имеющихся параметров максимальный поток в сети с минимальными затратами всех ресурсов. Таким образом, ставится задача определения с помощью имитационной модели максимального потока между начальным и конечным узлом графа, поиск узких мест в сети, устранение которых позволит достичь оптимальной организации потоков в железнодорожной сети.
Эта задача решается следующим образом. Для получения усредненных характеристик максимального потока и его “выгоды" необходимо провести N прогонов.
На первой итерации применения процедуры Монте-Карло вероятностная задача поиска максимального потока в сети превращается в классическую. При этом определяются компоненты матрицы пропускных способностей путём вычисления cijl=cij-vijl, где vijl определяется по функции распределения Hij (v) путём нахождения единичного жребия третьего типа.
При учёте влияния внутренних потоков на пропускные ситуации в сети возможны следующие ситуации:
внутренних потоков нет на участке дороги;
внутренние потоки влияют на пропускную способность участка таким образом, что она уменьшается, но остаётся больше либо равна значению потока на этом участке, т.е. , где - пропускная способность сети изменённая с учётом внутренних потоков (при этом алгоритм Форда-Фалкерсона работает и находится максимальный поток и его распределение по ветвям сети);
внутренние потоки влияют на пропускную способность участка таким образом, что она уменьшается и становится меньше значения потока на этом участке, т.е. , где - пропускная способность сети изменённая с учётом внутренних потоков (в этих условиях алгоритм Форда Фалкерсона не работает и данная ситуация говорит о возникновении “пробки" в сети на этом участке).
Для каждого i-го узла сети с учётом заданных функций распределения времён формирования-расформирования вычисляется среднее время нахождения в i-ом узле транспортной единицы. В качестве начального потока выбираются значения матрицы .
На k-ой итерации (k - номер итерации в алгоритме Форда-Фалкерсона) с помощью алгоритма Форда-Фалкерсона, используя изменённую матрицу пропускных способностей определяется само распределение потока по сети и его значение потока. По формулам (1.2), (1.3), и (1.4) с учётом распределения потоков, определяется обобщённый показатель “выгоды" этого потока. Значения потока, матрица значений распределения потока по ветвям и показатель “выгоды" запоминаются в базе данных модели (БДМ). Модифицируется номер итерации процедуры Монте-Карло (l=l+1) и все расчёты повторяются сначала.
По завершении N итераций этих расчётов в БДМ модели сформированы следующие выборки: выборка матриц распределения потока по ветвям сети, то есть для каждого элемента матрицы распределений потока имеется своя выборка; выборка значений максимального потока; выборка интегральных показателей “выгоды" потока.
По этим выборкам объема N формируются средние значения, а именно:
; ;
Все эти значения должны быть вычислены и представлены пользователю по завершении работы программы.
Для поиска узких мест в Gh с начальным пунктом Z и конечным пунктом Y проведём покомпонентное вычитание из этой матрицы соответствующих значений матрицы пропускных способностей Сh::
В тех местах, где элементы этой матрицы будет иметь отрицательное значение, находятся “узкие места" в Gh. На величину этой разности пропускные способности сij должны быть увеличены для того, чтобы граф Gh обеспечивал максимальный поток транзитных маршрутов в направлении из точки Z в точку Y.
Таким образом, по завершении работы программы, также должны быть получены следующие значения: матрица, характеризующая узкие места в сети, и рекомендуемая матрица пропускной способности для данной сети дорог.
Алгоритм работы модели основан на сочетании процедуры Монте-Карло и теоремы Форда-Фалкерсона и применением единичного жребия третьего типа.
2.5 Алгоритм работы модели железнодорожной сети
Алгоритм работы модели железнодорожной сети представлен на рисунке 2.2 Для работы программного обеспечения необходимо задать следующие входные значения:
- матрица пропускной способности сети;
- матрица расстояния между узлами;
- матрица стоимости единицы пути;
- функция распределения времени на формирование и расформирование составов;
- вектор времени на формирование и расформирование составов;
- количество прогонов программы.
Рассмотрим работу модели на первом прогоне (i=1). Программное обеспечение учитывает, что в сети кроме транзитных потоков существуют внутренние транспортные потоки. Эти внутренние потоки влияют на пропускную способность сети. Таким образом, на каждом прогоне изменяется матрица пропускных способностей c [i,j] путем разыгрывания единичного жребия третьего типа.
С помощью алгоритма Форда-Фалкерсона вычисляется максимальный поток maxpotok, распределение потока в сети f [i,j], и по формулам (1.2), (1.3) и (1.4) определяется обобщённый показатель “выгоды" этого потока Фzy. Все эти значения запоминаются в базе данных ЭВМ.
Если i<=pr, то программа продолжает первоначальные вычисления. В противном случае (если i>pr) вычисляется следующие средние значения: максимальный поток maxpotok, распределение потоков f [i,j] и обобщённый показатель “выгоды" Фzy на каждом прогоне. Далее определяются узкие места в сети. Для этого вычисляются значения: fср [i,j] -c [i,j] и в тех местах, где матрица принимает отрицательные значения на величину этой разницы увеличиваются пропускные способности матрицы c [i,j] для обеспечения рациональной организации потоков железнодорожной сети.
После завершения работы программы новая матрица пропускных способностей c [i,j], будет обеспечивать максимальный поток транзитных маршрутов в железнодорожной сети в направлении из начального пункта в конечный.
Рисунок 2.2 - Блок-схема реализованного программного обеспечения
2.6 Решение тестовых задач с помощью имитационной модели
Модель железнодорожной транспортной сети, представленная в данной курсовой работе, предоставляет следующие возможности:
поиск максимального потока и усредненного потока в сети железнодорожных дорог различным количеством узлов (N<100);
поиск узких мест и оптимальная организация потоков в сети дорог.
Интерфейс реализован на языке Borland Delphi 7.0. На рисунке 2.3 представлен интерфейс программного обеспечения.
Рисунок 2.3 - Интерфейс программного обеспечения
Рассмотрим функционирование модели на следующем примере. Для работы программы можно использовать либо данные, которые представлены в файле 11. txt, либо ввести свои необходимые значения которые в дальнейшем можно сохранить в txt-файле. Данные вводятся при запуске программы.
При задании произвольных значений входных данных пользователь должен учитывать, что если задать стоимость единицы пути либо дину дуги, не существующей дороги, то программа выдаст предупреждение о неправильном вводе начальных данных.
Файл 11. txt содержит следующие значения:
Матрица пропускной способности:
Вектор вероятности:
Время задержки транспорта:
Матрица стоимости пути единицы пути:
Матрица длины дороги:
Коэффициенты важности:
Количество прогонов: 10
Если необходимо создать текстовый файл с новыми данными, то нужно прописать необходимые значения и нажать на кнопку “Запись в файл". Эти значения записываются txt-файл и при дальнейшей работе с ними нужно нажать на кнопку “Чтение из файла". На рисунке 2.4 представлен пример заполнения входных значений. Когда все значения заполнены, нажимаем на кнопку “Вычислить". При этом появляется форма, указанная на рисунке 2.5
Рисунок 2.4- Пример ввода данных.
Таким образом, на форме представлены следующие результаты работы программы: матрица размером 2х10, в первом столбце которой представлены значения максимальных потоков на каждом прогоне, во втором - значения обобщенных показателей “выгоды"; среднее значение показателей выгоды и максимальных потоков, полученных на каждом прогоне; матрица усредненного потока.
Рисунок 2.5- Полученный результат
Для просмотра полученной матрицы пропускных способностей необходимо нажать на кнопку “Жми сюда”. Появляется форма, которая указана на рисунке 2.6
Таким образом при выполнении программы с начальными данными, расположенными в текстовом файле 11. txt мы получим следующие результаты:
Матрица усредненного потока всей сети:
Среднее значение выгоды: 0,82
Среднее значение потока: 7
Новая пропускная способность:
Полученная новая матрица пропускных способностей, будет обеспечивать максимальный поток транзитных маршрутов в железнодорожной сети в направлении из начального пункта в конечный для данной сети дорог.
Рисунок 2.6- Рекомендуемая пропускная способность
Заключение
В ходе реализации курсовой работы были выполнены все поставленные задачи и разработана имитационная модель транспортной сети с учетом одного входа и одного выхода в сети.
Таким образом, были решены следующие частные задачи:
актуальность использования имитационной модели для исследования потоков транспортной сети;
составление списков входных и выходных параметров имитационной модели железнодорожной транспортной сети;
разработка и реализация алгоритма имитационной модели;
решение тестовых задач с помощью имитационной.
Таким образом, был разобран материал по данной курсовой работе и выявлена актуальность разработки имитационной модели транспортной сети и выполнено программное обеспечение, реализующее работу модели железнодорожной сети. Данная модель разработана для случая одного входа и одного выход в сеть и нуждается в дополнительной модификации программы, что будет выполнено в следующей курсовой работе.
Список использованных источников
-
Максимей И.В. Имитационное моделирование на ЭВМ. - М.: Радио и связь, 1988. - 232 с.
-
Технология системного моделирования / Под общ. ред. С.В. Емельянова. - М.: Машиностроение; Берлин: Техник, 1988. - 520 с.
-
Задачи и модели ИСО. Ч.3. Технология имитации на ЭВМ и принятие решений: Уч. пособие / И.В. Максимей, В.Д. Левчук, С.П. Жогаль, В.Н. Подобедов. - Гомель: БелГУТ, 1999. - 150 с.
-
Левчук В.Д. Базовая схема формализации системы моделирования MICIC4 // Проблемы программирования. - 2005. - № 1. - С.85-96.
Приложение
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, jpeg;
type
TForm1 = class (TForm)
GroupBox1: TGroupBox;
Panel1: TPanel;
Panel2: TPanel;
VertexPrompt: TLabel;
VertexCount: TEdit;
Button1: TButton;
Button2: TButton;
Capofedge: TStringGrid;
GroupBox3: TGroupBox;
StringGrid1: TStringGrid;
GroupBox4: TGroupBox;
StringGrid2: TStringGrid;
Edit1: TEdit;
Button3: TButton;
Memo1: TMemo;
Button4: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Label1: TLabel;
StringGrid3: TStringGrid;
GroupBox5: TGroupBox;
Label2: TLabel;
Edit2: TEdit;
StringGrid4: TStringGrid;
StringGrid5: TStringGrid;
Label3: TLabel;
Label4: TLabel;
Edit3: TEdit;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit4: TEdit;
Label8: TLabel;
Edit5: TEdit;
Label9: TLabel;
Panel3: TPanel;
Image1: TImage;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Edit6: TEdit;
Label13: TLabel;
Edit7: TEdit;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Button5: TButton;
Label17: TLabel;
procedure Button2Click (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure VertexCountChange (Sender: TObject);
procedure Button3Click (Sender: TObject);
procedure Button4Click (Sender: TObject);
procedure Edit2Change (Sender: TObject);
procedure Button5Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const
N1=100;
l=MAXINT;
var
Form1: TForm1;
n: integer;
kol2,op,rr,nn,mi,tool,kon: integer;
j1,l6,w, i,z,j,ko,h1,h2,sum,ss,maxpotok,j3,k3,kk,potok,o,ll,kol1,pp,p1,j2,kol,t: integer;
c: array [1. N1,1. N1] of integer;
c1: array [1. N1,1. N1] of real;
c2: array [1. N1,1. N1] of real;
tt: array [1. .50,1. .50] of real;
fij: array [1. .50,1. .50] of real;
yij: array [1. .50,1. .50] of real;
y1i: array [1. .50,1. .50] of real;
xij: array [1. .10,1. .50] of real;
fij1: array [1.20,1.20] of real;
ttt: array [1.20,1.20] of real;
dij: array [1.20] of real;
Fi: array [1.20] of real;
lhh: array [1.20,1.20] of real;
hij: array [1.20] of real;
hi: array [1.20] of integer;
potokvr: array [1.20] of integer;
d11,d22,d33,z1,l5,mm,ten,w1,t1,kol3,lop,bpp,loop,ten1,bred1,bred2: real;
lh: array [1. N1,1. N1] of integer;
qh: array [1. N1,1. N1] of integer;
f: array [1. N1,1. N1] of integer;
const
size = N1 + 2;
type
queue = record
a: array [0. size-1] of integer;
head, tail: integer;
end;
var
p: array [1. N1] of integer; // номер предыдущей вершины
v: array [1. N1] of boolean; // посещенность
q: queue;
implementation
{$R *. dfm}
procedure init_queue (var q: queue); // инициализировать очередь
begin
with q do
begin
tail: = 0;
head: = 0;
end;
end;
function is_queue_empty (const q: queue): boolean; // Проверка пустоты
begin
is_queue_empty: = q. tail = q. head;
end;
procedure push (var q: queue; x: integer); // Положить элемент в очередь
begin
with q do
begin
a [tail]: = x;
tail: = (tail + 1) mod size;
end;
end;
function pop (var q: queue): integer; // Достать из очереди
begin
with q do
begin
pop: = a [head] ;
head: = (head + 1) mod size;
end;
end;
// Метод Форда-Фалкерсона
function mff (xo, xn: integer): boolean;
var
i, j: integer;
begin
fillchar (v, sizeof (v), false); { обнуляем массив посещений }
init_queue (q); { инициализируем очередь }
push (q, xo); { заталкиваем в очередь исток }
v [xo]: = true; { посетили исток }
p [xo]: = - 1; { у истока нет предка }
while not is_queue_empty (q) do { пока очередь не пуста }
begin
i: = pop (q); { достаем вершину из очереди }
for j: = 1 to n do { перебираем все вершины }
if not v [j] and { вершина не посещена }
(c [i, j] -f [i, j] > 0) then { ребро i->j ненасыщенное }
begin
v [j]: = true; { посетили вершину j }
push (q, j); { положили веришину j в очередь }
p [j]: = i; { i предок j }
end;
end;
mff: = v [xn] ; { дошли ли до стока }
end;
{ min: минимум из двух вещественных чисел }
function min (a, b: integer): integer;
begin
if a > b then min: = b else min: = a;
end;
// максимальное значение потока }
procedure maxpotok1 (xo, xn: integer);
var
k: integer;
d,d1,potok: integer;
begin
kk: =0;
repeat
begin
if c [1,j3] <>0 then
begin
kk: =kk+1;
j3: =j3+1;
end
else j3: =j3+1;
end;
until j3>n;
fillchar (f, sizeof (f), 0); // обнуляем gjnjr
potok: = 0;
while mff (xo, xn) do // Пока существует путь от xo в xn}
begin
d: = l;
d1: = l; // ребро в этом пути с минимальной
k: = xn; // пропускной способностью
while k <> xo do
begin
d: = min (d,c [p [k], k] -f [p [k], k]);
d1: = min (d1,c [p [k], k] -f [p [k], k]);
k: = p [k] ;
end;
k: = xn; // идем по найденому пути от xo к xn
while k <> xo do
begin
f [p [k], k]: = f [p [k], k] + d; // увеличиваем по прямым ребрам
f [k, p [k]]: = f [k, p [k]] - d; // уменьшаем по обратным ребрам
k: = p [k] ;
end;
j3: =1;
potok: = potok + d1;
// увеличиваем поток
if k3<>kk then k3: =k3+1 else
begin
i: =1; j2: =1;
for j1: =1+t to n+t do
begin
for j: =1 to n do
begin
tt [j1,j2]: =f [i,j] ;
if j2<=n then j2: =j2+1;
if j2>n then j2: =1;
end;
if i t: =t+n; potokvr [z]: =potok; z: =z+1; // строим lhh kol2: =0; for i: =1 to n do for j: =1 to n do kol2: =kol2+lh [i,j] ; for i: =1 to n do for j: =1 to n do lhh [i,j]: =lh [i,j] /kol2; // построили матрицу lhh // дополнительная часть программы {razigrivaem} p1: =1; for i: =1 to n do begin sum: =0; ko: =0; t1: =0; for j: =1 to n do if f [i,j] >0 then begin w1: =Random; for w: =1 to ll do begin if w1 ss: =f [i,j] *hi [w] ; sum: =sum+ss; ko: =ko+f [i,j] ; break; end else t1: =hij [w] +t1; end; end; if ko=0 then ko: =1; dij [p1]: =sum/ko; p1: =p1+1; end; for i: =1 to n do for j: =1 to n do begin yij [i,j]: =d11*lhh [i,j] ; fij1 [i,j]: =0; end; {umnozit matr na vek} i: =0; while op<=n do begin rr: =1; i: =i+1; while rr<=n do begin mm: =0; for j: =1 to n do mm: =mm+qh [i,j] *lh [j,rr] ; ttt [op,rr]: =mm; rr: =rr+1; end; op: =op+1; end; lop: =0; for i: =1 to n do for j: =1 to n do lop: =lop+ttt [i,j] ; for i: =1 to n do for j: =1 to n do ttt [i,j]: =d33* (ttt [i,j] /lop); for i: =1 to n do for j: =1 to n do if f [i,j] >0 then begin fij1 [i,j]: =lh [i,j] /f [i,j] +dij [i] ; kol3: =kol3+fij1 [i,j] ; end; for i: =1 to n do for j: =1 to n do begin fij1 [i,j]: = (fij1 [i,j] /kol3) *d22; end; {vischitivaem vse fij*} for i: =1 to n do for j: =1 to n do begin fij [i,j]: =ttt [i,j] +fij1 [i,j] +yij [i,j] ; end; {nahodim F=sumfij*} lop: =0; for i: =1 to n do for j: =1 to n do lop: =lop+fij [i,j] ; Fi [mi]: =lop; mi: =mi+1; // конец дополнительной части end; end; maxpotok: =potok; // возвращаем максимальный поток end; procedure TForm1. Button2Click (Sender: TObject); begin Form1. Close; end; procedure TForm1. Button1Click (Sender: TObject); var i,j,fcost: integer; begin Label10. Visible: =false; Label11. Visible: =true; Label12. Visible: =true; Edit6. Visible: =true; Label13. Visible: =true; Label14. Visible: =false; Label15. Visible: =true; Label17. Visible: =true; Button5. Visible: =true; Edit7. Visible: =true; Panel3. Visible: =true; Image1. Visible: =true; d11: =strtofloat (Edit3. text); d22: =strtofloat (Edit4. text); d33: =strtofloat (Edit5. text); GroupBox3. Visible: =false; Label1. Visible: =true; Edit1. Visible: =true; n: =strtoint (VertexCount. text); ll: =strtoint (Edit2. text); for i: =1 to n do for j: =1 to n do begin c [j, i]: =StrToInt (CapOfEdge. Cells [i,j]); end; for i: =1 to n do for j: =1 to n do begin qh [j, i]: =StrToInt (StringGrid3. Cells [i,j]); end; for i: =1 to n do for j: =1 to n do begin lh [j, i]: =StrToInt (StringGrid1. Cells [i,j]); end; for i: =1 to ll do hij [i]: =StrToFloat (StringGrid4. Cells [i-1,0]); for i: =1 to ll do hi [i]: =StrToInt (StringGrid5. Cells [i-1,0]); maxpotok1 (1,n); // ср. поток for i: =1 to mi-1 do ten: =ten+potokvr [i] ; ten1: =trunc (ten/ (mi-1)); // ср. выгода for i: =1 to mi-1 do loop: =loop+Fi [i] ; loop: =loop/ (mi-1); // матрица всех потоков j1: =0; j2: =0; for i: =1 to t do begin j: =1; j2: =j2+1; j3: =1; while j<=n do begin bpp: =0; for h1: =0 to mi do bpp: =bpp+tt [i+n*h1,j] ; yij [j2,j3]: =bpp/ (mi-1); j3: =j3+1; j: =j+1; end; end; // усредненная матрица всех потоков for i: =1 to n do for j: =1 to n do begin y1i [i,j]: =round (yij [i,j]); end; i: =1; bred1: =0; begin for j: =1 to n do bred1: =bred1+y1i [i,j] ; if bred1>ten1 then begin j: =1; while j<=n do begin if (yij [i,j] -trunc (yij [i,j]) >=0.5) and (yij [i,j] -trunc (yij [i,j]) <1) then begin y1i [i,j]: =y1i [i,j] -1; break; end else j: =j+1; end; end; if bred1 while j<=n do begin if (yij [i,j] -trunc (yij [i,j]) >=0.5) and (yij [i,j] -trunc (yij [i,j]) <1) then begin y1i [i,j]: =y1i [i,j] +1; break; end else j: =j+1 end; end; for j: =1 to n do y1i [j, i]: =-1*y1i [i,j] ; end; i: =n; bred1: =0; begin for j: =1 to n do bred1: =bred1+y1i [i,j] ; bred1: =-1*bred1; if bred1>ten1 then begin j: =1; while j<=n do begin if (yij [i,j] -trunc (yij [i,j]) >=0.5) and (yij [i,j] -trunc (yij [i,j]) <1) then begin y1i [i,j]: =y1i [i,j] +1; break; end else j: =j+1; end; end; if bred1 while j<=n do begin if (yij [i,j] -trunc (yij [i,j]) >=0.5) and (yij [i,j] -trunc (yij [i,j]) <1) then begin y1i [i,j]: =y1i [i,j] -1; break; end else j: =j+1 end; end; for j: =1 to n do y1i [j, i]: =-1*y1i [i,j] ; end; kon: =0; while kon<=n-1 do begin bred2: =0; i: =2+kon; for j: =1 to n do bred2: =bred2+y1i [i,j] ; begin if bred2>0 then begin j: =2+kon; while j<=n-1 do begin if (yij [i,j] -trunc (yij [i,j]) >=0.5) and (yij [i,j] -trunc (yij [i,j]) <1) then begin y1i [i,j]: =y1i [i,j] -1; break; end else j: =j+1 end; end; if bred2<0 then begin j: =2+kon; while j<=n-1 do begin if (yij [i,j] -trunc (yij [i,j]) >=0.5) and (yij [i,j] -trunc (yij [i,j]) <1) then begin y1i [i,j]: =y1i [i,j] +1; break; end else j: =j+1 end; end; for j: =2+kon to n-1 do y1i [j, i]: =-1*y1i [i,j] ; end; kon: =kon+1; end; // поиск узких мест в сети дорог for i: =1 to n do for j: =1 to n do c1 [i,j]: =y1i [i,j] -c [i,j] ; for i: =1 to n do for j: =1 to n do CapOfEdge. Cells [j, i]: =floattostr (y1i [i,j]); for i: =1 to n do for j: =1 to n do StringGrid3. Cells [j, i]: =Floattostr (c1 [i,j]); edit1. text: =floattostr (loop); edit6. text: =floattostr (ten1); edit7. text: =floattostr (maxpotok); loop: =0; ten1: =0; end; procedure TForm1. VertexCountChange (Sender: TObject); var i,j: integer; begin z: =1; mi: =1; t: =0; ss: =0; kk: =0; k3: =1; kol: =0; kol1: =0; ko: =0; sum: =0; l5: =0; l5: =0; pp: =1; o: =1; op: =1; // hij [1]: =0.2; hij [2]: =0.3; hij [3]: =0.5; d33: =0.25; // hi [1]: =4; hi [2]: =5; hi [3]: =3; d11: =0.25; d22: =0.5; l6: =0; if VertexCount. Text<>'' then begin CapOfEdge. ColCount: =StrToInt (VertexCount. Text) +1; CapOfEdge. RowCount: =StrToInt (VertexCount. Text) +1; StringGrid3. ColCount: =StrToInt (VertexCount. Text) +1; StringGrid3. RowCount: =StrToInt (VertexCount. Text) +1; StringGrid1. ColCount: =StrToInt (VertexCount. Text) +1; StringGrid1. RowCount: =StrToInt (VertexCount. Text) +1; n: =StrToInt (VertexCount. Text); for i: =1 to n do begin CapOfEdge. Cells [0, i]: ='x'+IntToStr (i); CapOfEdge. Cells [i,0]: ='x'+IntToStr (i); end; for i: =1 to n do for j: =1 to n do begin CapOfEdge. Cells [i,j]: ='0'; end; for i: =1 to n do begin StringGrid3. Cells [0, i]: ='x'+IntToStr (i); StringGrid3. Cells [i,0]: ='x'+IntToStr (i); end; for i: =1 to n do for j: =1 to n do begin StringGrid3. Cells [i,j]: ='0'; end; for i: =1 to n do begin StringGrid1. Cells [0, i]: ='x'+IntToStr (i); StringGrid1. Cells [i,0]: ='x'+IntToStr (i); end; for i: =1 to n do for j: =1 to n do begin StringGrid1. Cells [i,j]: ='0'; end; end; end; procedure TForm1. Button3Click (Sender: TObject); var f: textfile; i,j,n: integer; s: string; Begin opendialog1. filter: ='текстовые файлы|*. txt|'; if opendialog1. execute and fileexists (opendialog1. filename) then begin assignfile (f,opendialog1. filename); reset (f); readln (f,n); for i: =1 to n do for j: =1 to n do begin readln (f,s); stringgrid3. cells [j-1, i-1]: =s; end; for i: =1 to n do for j: =1 to n do begin readln (f,s); stringgrid1. cells [j-1, i-1]: =s; end; for i: =1 to n do for j: =1 to n do begin readln (f,s); Capofedge. cells [j-1, i-1]: =s; end; for i: =1 to n do begin readln (f,s); stringgrid4. cells [i-1,0]: =s; end; for i: =1 to n do begin readln (f,s); stringgrid5. cells [i-1,0]: =s; end; readln (f,s); edit3. Text: =s; readln (f,s); edit4. Text: =s; readln (f,s); edit5. Text: =s; closefile (f); end; end; procedure TForm1. Button4Click (Sender: TObject); var f: textfile; i,j,n: integer; Begin savedialog1. filter: ='текстовые файлы|*. txt|'; n: =strtoint (VertexCount. text) +1; ll: =strtoint (Edit2. text); if savedialog1. execute then begin assignfile (f,savedialog1. filename); rewrite (f); writeln (f,n); for i: =1 to n do for j: =1 to n do writeln (f,stringgrid3. cells [j-1, i-1]); for i: =1 to n do for j: =1 to n do writeln (f,stringgrid1. cells [j-1, i-1]); for i: =1 to n do for j: =1 to n do writeln (f,Capofedge. cells [j-1, i-1]); for i: =1 to n do writeln (f,stringgrid4. cells [i-1,0]); for i: =1 to n do writeln (f,stringgrid5. cells [i-1,0]); writeln (f,edit3. text); writeln (f,edit4. text); writeln (f,edit5. text); closefile (f); end; end; procedure TForm1. Edit2Change (Sender: TObject); begin ll: =StrToInt (Edit2. Text); StringGrid4. ColCount: =StrToInt (Edit2. Text); StringGrid5. ColCount: =StrToInt (Edit2. Text); end; procedure TForm1. Button5Click (Sender: TObject); begin StringGrid3. Visible: =false; Label11. Visible: =false; GroupBox4. Visible: =false; for i: =1 to n do for j: =1 to n do if c1 [i,j] <0 then c2 [i,j]: =c [i,j] + (-1) *c1 [i,j] ; for i: =1 to n do for j: =1 to n do CapOfEdge. Cells [j, i]: =floattostr (c2 [i,j]); for i: =1 to n do for j: =1 to n do end;