Nadesłany przez Tomasz Lubiński, 09 maja 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Algorytm Holt'a - Delphi/Algorytm_Holt.dpr:
//www.algorytm.org //Algorytm Holt'a - detekcja zakleszczenia //(c)2002 Tomasz Lubinski program Algorytm_Holt; uses Forms, SysUtils; {$R *.RES} {$Apptype console} var p,z,j,k,tmp: Integer; E : Array [0..1] of Array [1..100] of Array [1..100] of Integer; A : Array [1..100] of Array [1..100] of Integer; I,f : Array [1..100] of Integer; c : Array [0..100] of Integer; flaga: Boolean; begin writeln('Podaj liczbe procesow (max. 100)'); readln(p); writeln('Podaj liczbe zasobow (max. 100)'); readln(z); //pobranie danych for k:=1 to p do for j:=1 to z do begin writeln('Podaj ile zasobu '+IntToStr(j)+' posiada proces '+IntToStr(k)); readln(A[k,j]); end; for k:=1 to p do for j:=1 to z do begin writeln('Podaj ile zasobu '+IntToStr(j)+' moze jeszcze zazadac proces '+IntToStr(k)); readln(E[0,k,j]); E[1,k,j]:=k; end; for j:=1 to z do begin writeln('Podaj ile zasobu '+IntToStr(j)+' jest jeszcze wolne w systemie'); readln(f[j]); end; writeln; writeln; //algorytm Holt'a //posortowanie żądań procesów (bubble sort) for j:=1 to z do begin flaga:=true; while flaga do begin flaga:=false; for k:=1 to p-1 do if E[0,k,j]>E[0,k+1,j] then begin flaga:=true; tmp:=E[0,k,j]; E[0,k,j]:=E[0,k+1,j]; E[0,k+1,j]:=tmp; tmp:=E[1,k,j]; E[1,k,j]:=E[1,k+1,j]; E[1,k+1,j]:=tmp; end; end; end; for k:=1 to z do I[k]:=1; for k:=1 to p do c[k]:=z; c[0]:=p; //wlasciwa częsc algorytmu repeat flaga:=false; for j:=1 to z do while ((I[j]<=p) and (E[0,I[j],j]<=f[j])) do begin c[E[1,I[j],j]]:=c[E[1,I[j],j]]-1; if c[E[1,I[j],j]]=0 then begin c[0]:=c[0]-1; flaga:=true; for k:=1 to z do f[k]:=f[k]+A[E[1,I[j],j],k]; end; I[j]:=I[j]+1; end; until not((flaga)and(c[0]>0)); if flaga then writeln('Nie ma zakleszczenia') else writeln('Istnieje zakleszczenie'); write('Zbior zadan zakleszczonych: {'); for k:=1 to p do if c[k]<>0 then write(' '+IntToStr(k)); write(' }'); readln; end.