- •Глава 1. Обзор и анализ технических решений
- •1.1. Характеристика тпк
- •1.2. Обзор программных продуктов для управления предприятиями с дискретными технологическими процессами
- •1.3. Анализ методов моделирования
- •1.4. Сети Петри
- •Выводы по главе
- •Глава 2. Моделирование тпк.
- •2.1. Краткая характеристика объекта моделирования.
- •2.2. Перечень маркеров первичного и вторичного сырья, специалистов, построек, типов местности.
- •2.3. Карта местности и ее районирование
- •2.4. Схемы получения первичного и вторичного сырья.
- •2.5. Реакции получения сырья.
- •Выводы по главе
- •Глава 3. Алгоритмы и программная часть.
- •3.1. Дерево достижимости.
- •3.1.1.Общее описание.
- •3.1.2. Алгоритм построения дерева достижимости.
- •3.1.3. Блок-схема дерева достижимости.
- •3.1.4. Процедура построения дерева достижимости.
- •3.2. Процедуры инициализации и получения сырья.
- •Выводы по главе
- •Заключение
- •Список использованной литературы
3.1.4. Процедура построения дерева достижимости.
procedure TForm1.BuildTree(par_str:string;level:integer;mar:array of integer);
var
i,k,j:integer;
s,snew:string;
isdouble,isopen:boolean;
new_mar:array of integer;
minlev:integer;
ElemToExecute:integer;
index:integer;
begin
SetLength(new_mar,n);
for i:=1 to m do //i - номер перехода
begin
//проверяем открыт ли переход
isopen:=true;
for k:=1 to n do //k- номер позиции
begin
if (StrToInt(StringGrid.Cells[k,i])<=mar[k-1])and(mar[k-1]<=6)and(mar[k-1]>=0) then
new_mar[k-1]:=mar[k-1]-StrToInt(StringGrid.Cells[k,i])
else
begin
isopen:=false;
break;
end;
end;
if isopen=true then
begin
// добавляем фишки в соответствующии позиции
for k:=1 to n do //k- номер позиции
begin
new_mar[k-1]:=new_mar[k-1]+StrToInt(StringGrid1.Cells[k,i])
end;
//представляем новый массив маркировок в виде строки
snew:='';
for k:=0 to n-1 do
begin
snew:=snew+IntToStr(new_mar[k]);
end;
//проверка на дубль
isdouble:=false;
for k:=0 to tree.Items.Count-1 do
begin
if snew=tree.Items.Item[k].Text then
begin
isdouble:=true;
break;
end;
end;
if tree.Items.Count>1000 then exit;
index:=0;
while tree.Items.Item[index].text<>par_str do inc(index);
if isdouble=true then
tree.Items.AddChild(tree.Items.Item[index],snew+'(дубль)')
else
begin //добавляем в стек
//ищем свободное место
k:=0;
while (k<=StackLength)and(stack[k].level<>0)do inc(k);
if k>StackLength then
begin
//извещаем о переполнении стека
ShowMessage('Стек переполнен');
exit;
end
else
begin
//inert into tree
tree.Items.AddChild(tree.Items.Item[index],snew);
//вставляем в свободное место
stack[k].par_str:=snew;
stack[k].level:=level+1;
SetLength(stack[k].marking,n);
for j:=0 to n-1 do stack[k].marking[j]:=new_mar[j];
end;
end;
end;
end;
//выбираем из стека элемент с наименьшим уровнем
minlev:=1000;
for i:=0 to StackLength do
begin
if (stack[i].level>0)and(stack[i].level<minlev) then
begin
ElemToExecute:=i;
minlev:=Stack[i].level;
end;
end;
if minlev<1000 then
begin
stack[ElemToExecute].level:=0;
BuildTree(stack[ElemToExecute].par_str,minlev,stack[ElemToExecute].marking);
end;
end;