home *** CD-ROM | disk | FTP | other *** search
- program Simplex_Algorithmus;
-
- const m_max = 5;
- n_max = 6;
-
- type Schema = array [0..m_max, 0..n_max] of real;
-
- (* die eigentliche Matrix steht in
- [1..m_max-1, 1..n_max-2].
- Die anderen Indizes stehen fuer:
- - die Indizes i & k (0;0)
- - die b bzw. z (m_max;n_max-1)
- - die b/a (?;n_max)
- - Q steht in [m_max,n_max-1] *)
-
- var S, S_neu : Schema;
- m, n : byte;
-
- procedure Eingabe; (* Eingabe des Schemas S *)
- var i, j: byte;
- begin
- ClrScr;
- Write('Anzahl der Zeilen : '); ReadLn(m);
- Write('Anzahl der Spalten: '); ReadLn(n);
-
- for i := 1 to n do S[0,i] := i; (* Initialisierung der Indizes *)
- for i := 1 to m do S[i,0] := n+i;
-
- ClrScr;
- WriteLn('Eingabe der Matrix:'); WriteLn;
- for i := 1 to m do
- begin
- for j := 1 to n do
- begin
- Write(i,'. Zeile, ', j,'. Spalte: '); ReadLn(S[i,j])
- end;
- WriteLn
- end;
-
- ClrScr;
- WriteLn('Eingabe des Vektors b:'); WriteLn;
- for i := 1 to m do
- begin
- Write(i,'. Komponente: '); ReadLn(S[i,n+1])
- end;
-
- ClrScr;
- WriteLn('Eingabe der Komponenten der Zielfunktion z:'); WriteLn;
- for i := 1 to n do
- begin
- Write(i,'. Komponente: '); ReadLn(S[m+1,i])
- end;
-
- for i := 1 to m do S[i,n+2] := 0.0; (* Letzte Spalte zunaechst leer *)
-
- S[m+1,n+1] := 0.0 (* Zielfunktion Q zunaechst 0 *)
- end;
-
- procedure Ausgabe; (* gibt das Schema S aus *)
- var i, j: byte;
- begin
- WriteLn; WriteLn;
- Write(' ');
- for i := 1 to n do Write(S[0,i]:8:0);
- WriteLn;
- for i := 0 to n+2 do Write('---------');
- WriteLn;
- for i := 1 to m do
- begin
- Write(S[i,0]:3:0, ' |');
- for j := 1 to n do Write(S[i,j]:8:2);
- Write(' | ', S[i,n+1]:8:2, ' | ');
- if S[i,n+2] <> 0.0 then WriteLn(S[i,n+2]:8:2)
- else WriteLn('--':5)
- end;
- for i := 0 to n+2 do Write('---------');
- WriteLn;
- Write(' ');
- for i := 1 to n do Write(S[m+1,i]:8:2);
- WriteLn(' | ',S[m+1,n+1]:8:2)
- end;
-
- procedure Simplex;
- var i, k,
- pivot_zeile, pivot_spalte: byte;
- min, pivot : real;
- begin
- repeat
- pivot_spalte := 1; (* Ermittlung der Pivotspalte *)
- while (pivot_spalte <= n) and (S[m+1,pivot_spalte] <= 0.0) do
- pivot_spalte := Succ(pivot_spalte);
-
- if pivot_spalte <= n then
- begin
- min := 1e8; pivot_zeile := 0; (* Ermittlung der Pivotzeile *)
- for k := 1 to m do
- if S[k,pivot_spalte] > 0.0 then
- begin
- S[k,n+2] := S[k,n+1] / S[k,pivot_spalte]; (* Quotient b/a *)
- if S[k,n+2]<min then
- begin
- min := S[k,n+2]; pivot_zeile := k
- end
- end
- else S[k,n+2] := 0.0; (* Quotient nicht zu ermitteln *)
-
- if pivot_zeile > 0 then
- begin
- Ausgabe; WriteLn;
- WriteLn('Pivotzeile: ',pivot_zeile,' Pivotspalte: ',pivot_spalte);
- repeat until KeyPressed;
-
- S_neu := S; (* zur Uebernahme der Indizes *)
- S_neu[0,pivot_spalte] := S[pivot_zeile,0]; (* Index-Tausch *)
- S_neu[pivot_zeile,0] := S[0,pivot_spalte];
-
- pivot := S[pivot_zeile,pivot_spalte]; (* das Pivotelement *)
- S_neu[pivot_zeile,pivot_spalte] := 1/pivot;
-
- for i := 1 to n+1 do (* Elemente der Pivotzeile *)
- if i <> pivot_spalte then
- S_neu[pivot_zeile,i] := S[pivot_zeile,i] / pivot;
-
- for k := 1 to m+1 do (* Elemente der Pivotspalte *)
- if k <> pivot_zeile then
- S_neu[k,pivot_spalte] := -S[k,pivot_spalte] / pivot;
-
- for k := 1 to m+1 do (* die restlichen Elemente *)
- if k <> pivot_zeile then
- for i := 1 to n+1 do
- if i <> pivot_spalte then
- S_neu[k,i] := S[k,i] - S[pivot_zeile,i]*S[k,pivot_spalte]/pivot;
-
- S := S_neu
- end
- end
- until (pivot_spalte > n) or (pivot_zeile = 0);
-
- for k := 1 to m do S[k,n+2] := 0.0; (* Loeschen der letzten Spalte *)
- WriteLn; WriteLn; WriteLn('Loesung:',#7); Ausgabe
- end;
-
- begin
- Eingabe;
- ClrScr;
- Simplex
- end.
-