←ïðåäûäóùàÿ ñëåäóþùàÿ→
1 2 3
PROGRAM SIMPLEX_METOD;
USES CRT;
LABEL ZN,ST,ELL,_END;
TYPE MAS=ARRAY[1..30] OF REAL;
MASB=ARRAY[1..30] OF STRING[3];
MASX=ARRAY[1..30,1..30] OF REAL;
VAR Fo,FunctPr,B,H,Hnew,C,Cnew,CPr,CPrnew,FX:MAS;
X,Xnew:MASX;
BS,Bvsp,ZNAC:MASB;
MIN,I1,I,J,Kx,Ky,Kit,NachKell,NachY,K_st:INTEGER;
PriznacY,KLstr,KLst,ErrCode,Dop_X:INTEGER;
P,P1,Mo,F0,Epsilon,Z:REAL;
VSP,S,PrGomory:STRING;
F:TEXT;
DPx,DPy,Fm,Kell,Kstr:INTEGER;
{ Ôóíêöèÿ ñîçäàíèÿ èíäåêñîâ }
FUNCTION SIMVB(V:INTEGER;S:CHAR):STRING;
VAR M,Z:STRING;
BEGIN
STR(V,M);
Z:=S+M;
SIMVB:=Z;
END;
{ Ïðîöåäóðà çàïèñè äàííûõ â ôàéë }
PROCEDURE SAVE(X1:REAL;K:STRING;Mstr:INTEGER);
VAR V:STRING;
BEGIN
ASSIGN(F,'SIMPLEX.DAT');
APPEND(F);
CASE Mstr OF
0:WRITELN(F,'');
1:BEGIN
IF K=' ' THEN STR(X1:1:0,V) ELSE STR(X1:10:4,V);
WRITE(F,V);
WRITE(F,' ');
END;
2:WRITE(F,K);
3:WRITELN(F,K);
END;
CLOSE(F);
END;
{ Îïðåäåëåíèå äîïîëíèòåëüíûõ ïåðåìåííûõ }
PROCEDURE DOP_PER;
BEGIN
IF ZNAC[I1]='=' THEN
BEGIN
Kell:=Kell+1;Bvsp[Kell]:=SIMVB(DPy,'Y');
DPy:=DPy+1;
Xnew[I1,Kell]:=1;
IF Fm=1 THEN FX[Kell]:=-1 ELSE FX[Kell]:=1;
FunctPr[Kell]:=1;
FOR I:=1 TO Kstr DO
IF I<>I1 THEN Xnew[I,Kell]:=0;
END;
IF ZNAC[I1]='>=' THEN
BEGIN
Kell:=Kell+1;Bvsp[Kell]:=SIMVB(DPx,'X');
DPx:=DPx+1;Dop_X:=Dop_X+1;
Xnew[I1,Kell]:=-1;FX[Kell]:=0;
FOR I:=1 TO Kstr DO
IF I<>I1 THEN Xnew[I,Kell]:=0;
Kell:=Kell+1;Bvsp[Kell]:=SIMVB(DPy,'Y');
DPy:=DPy+1;
Xnew[I1,Kell]:=1;
IF Fm=1 THEN FX[Kell]:=-1 ELSE FX[Kell]:=1;
FunctPr[Kell]:=1;
FOR I:=1 TO Kstr DO
IF I<>I1 THEN Xnew[I,Kell]:=0;
END;
IF ZNAC[I1]='<=' THEN
BEGIN
Kell:=Kell+1;Bvsp[Kell]:=SIMVB(DPx,'X');
DPx:=DPx+1;Dop_X:=Dop_X+1;
Xnew[I1,Kell]:=1;FX[Kell]:=0;
FOR I:=1 TO Kstr DO
IF I<>I1 THEN Xnew[I,Kell]:=0;
END;
END;
{ Ïðîöåäóðà ñîêðàùåíèÿ Y }
PROCEDURE SOKR;
VAR P:INTEGER;
BEGIN
Kell:=Kell-1;
FOR P:=NachKell+DOP_X TO Kell DO
IF Bvsp[P]=BS[KLstr] THEN BEGIN
FOR J:=P TO Kell DO
Bvsp[J]:=Bvsp[J+1];
FunctPr[J]:=FunctPr[J+1];
Fx[J]:=Fx[J+1];
FOR I:=1 TO Kstr DO
Xnew[I,J]:=Xnew[I,J+1]
END;
END;
{ Ïðîöåäóðà, âûïîëíÿþùàÿ ìåòîä Ãîìîðè }
PROCEDURE GOMORY;
VAR MAX,Z:REAL;
BEGIN
KLstr:=1;
MAX:=H[1]-INT(H[1]);
FOR I1:=2 TO Kstr DO
IF (H[I1]-INT(H[I1]))>=MAX THEN BEGIN MAX:=H[I1]; KLstr:=I1;END;
Kstr:=Kstr+1;
Hnew[Kstr]:=H[KLstr]-INT(H[KLstr]);
FOR I1:=1 TO Kell DO
BEGIN
Z:=INT(X[KLstr,I1]);
IF X[KLstr,I1]<0 THEN Z:=Z-1;
Xnew[Kstr,I1]:=X[KLstr,I1]-Z;
END;
ZNAC[Kstr]:='>=';
END;
{ Ïðîöåäóðà, âûïîëíÿþùàÿ Ñèìïëåêñ ìåòîä }
PROCEDURE SIMPLEX;
LABEL POVZNAC,NACH;
BEGIN
{ Ïîäãîòîâêà ê ââîäó äàííûõ }
NachKell:=Kell;
DPx:=Kell+1;DPy:=1;
Kx:=1;Ky:=4;
Epsilon:=0.00001;
CLRSCR;
WRITELN('Ââåäèòå ñèñòåìó óðàâíåíèé:');
WRITELN('(êîýôôèöèåíòû ïðè âñåõ Õ,çíàê è ñâîáîäíûå ÷ëåíû)');
{ Ââîä äàííûõ }
FOR I:=1 TO Kstr DO
BEGIN
POVZNAC:
WRITELN('Ââåäèòå ',I,'-å óðàâíåíèå:');
{ Ââîä êîýôôèöèåíòîâ ïðè X â I-òîì óðàâíåíèè }
FOR J:=1 TO Kell DO
BEGIN
GOTOXY(Kx,Ky);Kx:=Kx+6;
READLN(Xnew[I,J]);
END;
{ Ââîä çíàêà â I-òîì óðàâíåíèè }
Kx:=Kx+6;GOTOXY(Kx,Ky);READLN(ZNAC[I]);
{Ïðîâåðêà ââåäåííîãî çíàêà íà ïðàâèëüíîñòü}
IF (ZNAC[I]<>'>=') AND (ZNAC[I]<>'=') AND (ZNAC[I]<>'<=')
THEN BEGIN
WRITELN('Íåïðàâèëüíî çàäàí çíàê');
Ky:=Ky+3;Kx:=1;
GOTO POVZNAC;
END;
IF (ZNAC[I]='=') OR (ZNAC[I]='>=') THEN PriznacY:=1;
{ Ââîä ñâîáîäíîãî ÷ëåíà â I-òîì óðàâíåíèè }
Kx:=Kx+6;GOTOXY(Kx,Ky);READ(B[I]);
Kx:=1;
Ky:=Ky+2;
END;
WRITELN('Ââåäèòå êîýôôèöèåíòû ïðè Õ â öåëåâîé ôóíêöèè:');
{ Ââîä êîýôôèöèåíòîâ ïðè Õ â öåëåâîé ôóíêöèè }
FOR J:=1 TO Kell DO
BEGIN
GOTOXY(Kx,Ky);Kx:=Kx+6;
READ(FX[J]);
END;
{ Ïîäãîòîâêà èíäåêñàöèè X }
FOR J:=1 TO Kell DO
Bvsp[J]:=SIMVB(J,'X');
{ Îïðåäåëåíèå äîïîëíèòåëüíûõ ïåðåìåííûõ }
FOR I1:=1 TO Kstr DO
DOP_PER;
{ Çàìåíà îïòèìàëüíîé ôóíêöèè ñ MAX íà MIN ïðè íàëè÷èè
â áàçèñå Y-êîâ åñëè èäåò èññëåäîâàíèå íà ìèíèìóì }
MIN:=0;
IF (Fm=1) AND (PriznacY=1) THEN
BEGIN
MIN:=Fm;Fm:=2;
FOR J:=1 TO Kell DO
FX[J]:=-FX[J];
END;
{ Ñîðòèðîâêà äîïîëíèòåëüíûõ ïåðåìåííûõ ïî èíäåêñó }
FOR I1:=NachKell+1 TO Kell DO
FOR J:=I1+1 TO Kell DO
IF Bvsp[J]<Bvsp[I1] THEN
BEGIN
VSP:=Bvsp[J];Bvsp[J]:=Bvsp[I1];Bvsp[I1]:=VSP;
P:=FX[J];FX[J]:=FX[I1];FX[I1]:=P;
P:=FunctPr[J];FunctPr[J]:=FunctPr[I1];FunctPr[I1]:=P;
FOR I:=1 TO Kstr DO
BEGIN
P:=Xnew[I,I1];Xnew[I,I1]:=Xnew[I,J];Xnew[I,J]:=P;
END;
END;
Kit:=1;
CLRSCR;
{ Ïîäãîòîâêà ñòîëáöîâ C,B,H }
FOR I:=1 TO Kstr DO
BEGIN
Hnew[I]:=B[I];
FOR J:=NachKell+1 TO Kell DO
IF Xnew[I,J]=1 THEN
BEGIN
BS[I]:=Bvsp[J];
Cnew[I]:=FX[J];
CPrnew[I]:=FunctPr[J];
END;
END;
NACH:;
REPEAT
PriznacY:=0;
{ Ïåðåäà÷à äàííûõ â èñõîäíûå ïåðåìåííûå c îáíóëåíèåì ÷èñåë,
ïî ìîäóëþ ìåíüøèõ ÷åì 0.00001
←ïðåäûäóùàÿ ñëåäóþùàÿ→
1 2 3
|
|