program Project_SPD; uses crt; const MAX_SIZE = 30; INF = 999999; type Matrix = record Len:array[1..MAX_SIZE, 1..MAX_SIZE] of integer; Lab:array[1..MAX_SIZE] of integer; Path:array[1..MAX_SIZE, 1..MAX_SIZE] of string; Vis:array[1..MAX_SIZE, 1..MAX_SIZE] of boolean; end; var MatrixSize,i,j,_i,k,s,R,Route,BW,Intr,Outr,e1,e2:integer; sym,sym1,sym2,sym3,sym4,sym0:string; MM:Matrix; outfile:text; a1,b1:real; Le,a,b:byte; procedure Symmetr; {симметрирование массива стоимости звеньев MM.Len и задание начала возможных маршрутов MM.Path} var j_pr,i_pr: integer; begin for i_pr:=1 to MatrixSize do begin for j_pr:=1 to MatrixSize do if ((MM.Len[i_pr,j_pr]<>INF) and (MM.Len[i_pr,j_pr]<>0)) then begin MM.Len[j_pr,i_pr]:=MM.Len[i_pr,j_pr]; str(i_pr,MM.Path[i_pr,j_pr]); end; end; end; label g1,g2; BEGIN clrscr; MatrixSize:=30; {создание файла DATAFILE.CSV} Assign(outfile, 'C:\DATAFILE.CSV'); rewrite(outfile); write(outfile,'node;'); for i:=1 to MatrixSize do write(outfile,'P',i,';'); for i:=1 to MatrixSize do write(outfile,'L',i,';'); for i:=1 to MatrixSize do write(outfile,'D',i,';'); writeln(outfile); writeln('START store data to file c:\datafile.doc '); writeln; write('Size=',MatrixSize); writeln; {зануление всех элементов массивов MM.Len, MM.Path} for i:=1 to MatrixSize do begin for j:=1 to MatrixSize do begin MM.Len[i,j]:=INF; MM.Path[i,j]:=''; if i=j then begin MM.Len[i,j]:=0; str(i,MM.Path[i,j]); end; end; end; readln; {ввод начальной стоимости звеньев} MM.Len[1,4]:=1608; MM.Len[1,6]:= 488; MM.Len[1,18]:=1608; MM.Len[1,28]:=488; MM.Len[1,29]:=1608; MM.Len[2,7]:=488; MM.Len[2,19]:=1608; MM.Len[2,26]:= 488; MM.Len[3,7]:=6440; MM.Len[4,5]:=1608; MM.Len[4,10]:=6440; MM.Len[4,12]:=6440; MM.Len[5,16]:=1608; MM.Len[6,15]:=488; MM.Len[7,27]:=488; MM.Len[8,16]:=6440; MM.Len[8,26]:=6440; MM.Len[9,22]:=6440; MM.Len[10,28]:=1608; MM.Len[11,20]:=6440; MM.Len[11,23]:=6440; MM.Len[12,13]:=6440; MM.Len[13,14]:=6440; MM.Len[14,16]:=6440; MM.Len[15,16]:=488; MM.Len[16,26]:=6440; MM.Len[16,29]:=1608; MM.Len[17,19]:=6440; MM.Len[18,27]:=1608; MM.Len[21,22]:=1608; MM.Len[21,26]:=1608; MM.Len[23,24]:=6440; MM.Len[24,25]:=6440; MM.Len[25,28]:=6440; MM.Len[27,28]:=488; {симметрирование массива стоимости звеньев MM.Len и задание начала возможных маршрутов MM.Path} Symmetr; {вывод на экран стоимости звеньев для проверки} { for i:=1 to MatrixSize do begin for j:=1 to MatrixSize do begin write('D[',i,',',j,']=',MM.Len[i,j],' '); end; writeln; end; readln; } {начало прокладки R маршрутов} write('Enter number of route = '); readln(R); writeln; Route:=1; repeat g1: write(' ',Route,') Enter IN point for route - '); readln(Intr); write(' Enter OUT point for route - '); readln(Outr); writeln; if (Intr=Outr) or (Intr>MatrixSize) or (Outr>MatrixSize) then goto g1; g2: write(' Enter BW for route',Route,' = '); readln(BW); if (BW<=0) or (BW>INF) then goto g2; writeln; {зануление всех элементов массивов MM.Len, MM.Path} {зануление элементов i=j массивов MM.Path} for i:=1 to MatrixSize do begin for j:=1 to MatrixSize do begin MM.Path[i,j]:=''; if i=j then begin MM.Len[i,j]:=0; str(i,MM.Path[i,j]); end; end; end; {начало алгоритма Дейкстры для всех узлов} for s:=1 to MatrixSize do begin write(outfile,s,';'); for i:=1 to MatrixSize do begin for j:=1 to MatrixSize do MM.Vis[i,j]:=false; MM.Lab[i]:=INF; end; MM.Lab[s]:=0; {поиск по возростанию} for i:=s to MatrixSize do begin for j:=1 to MatrixSize do begin if MM.Vis[i,j]=false then if ((MM.Len[i,j]<>INF) and (MM.Len[i,j]<>0)) then begin if MM.Len[i,j]+MM.Lab[i]INF) and (MM.Len[i,j]<>0)) then begin if MM.Len[i,j]+MM.Lab[i]INF) and (MM.Len[i,j]<>0 and ) then} begin Le:=length(MM.Path[i,j]); if Le>1 then begin sym1:= copy(MM.Path[i,j],1,1); sym2:= copy(MM.Path[i,j],Le,1); sym0:= sym1 + sym2; if sym=sym0 then begin writeln(' Have been search route ',sym,' - ',MM.Path[i,j]); sym0:=MM.Path[i,j]; writeln(outfile,' Path=',sym0); writeln(outfile); k:=0; repeat k:=k+1; a:=0; b:=0; sym3:= copy(MM.Path[i,j],k,1); val(sym3,a1,e1); a:=round(a1); sym4:= copy(MM.Path[i,j],k+1,1); val(sym4,b1,e2);b:=round(b1); if BW>=MM.Len[a,b] then MM.Len[a,b]:=INF {else MM.Len[a,b]:=MM.Len[a,b]}; MM.Len[b,a]:=MM.Len[a,b]; writeln(' ',k,' calculation cost=',MM.Len[a,b],' bwn ',a,b); until k=(Le-1); writeln; writeln(' Routing ',Route,' flow !'); writeln; end; end {else begin writeln; writeln(' NOT Routing ',Route,' flow !!!'); writeln(outfile,' Path=999'); end}; end; end; readln; Route:=Route+1; until Route=(R+1); {конец прокладки маршрутов} writeln; writeln(' END!!! '); readln; writeln(outfile); close(outfile); END.