Курсовая работа: Линейное программирование
CPrnew[Kstr]:=FunctPr[Kell];
Cnew[Kstr]:=FX[Kell];
GOTO NACH;
END;
IF P1=0 THEN
SAVE(0,'Данное решение является целочисленым.',3);
SAVE(0,'При этом:',3);
IF MIN=1 THEN
BEGIN F0:=-F0;Fm:=MIN; END;
IF Fm=1 THEN
SAVE(0,'Fmax=',2)
ELSE
SAVE(0,'Fmin=',2);
SAVE(F0,'',1);
SAVE(0,'',0);
FOR I1:=1 TO
Kstr DO
BEGIN
SAVE(0,' ',2);
SAVE(0,BS[I1],2);SAVE(0,'=',2);
SAVE(H[I1],'',1);
SAVE(0,'',0);
END;
HALT;
END;
{ Нахождение ключевого
столбца }
KLst:=1;Mo:=0;
FOR J:=1 TO
Kell DO
IF Fm=1 THEN
IF
Fo[J]<Mo THEN Mo:=Fo[J];
FOR J:=1 TO
Kell DO
BEGIN
IF
Bvsp[J][1]<>'Y' THEN
IF Fm=1 THEN
BEGIN
IF Fo[J]<0
THEN
IF
Fo[J]>=Mo THEN
BEGIN
Mo:=Fo[J];
KLst:=J;
END;
END
ELSE
BEGIN
IF Fo[J]>0
THEN
IF
Fo[J]>=Mo THEN
BEGIN
Mo:=Fo[J];
KLst:=J;
END;
END;
END;
SAVE(0,'Ключевой столбец: ',2);SAVE(KLst,' ',1);
{ Нахождение ключевой строки }
P1:=0;K_st:=0;
FOR J:=1 TO
Kell DO
IF
ABS(Mo-Fo[J])<Epsilon THEN
BEGIN
K_st:=K_st+1;
FOR I:=1 TO
Kstr DO
IF
X[I,KLst]>0 THEN BEGIN B[i]:=H[i]/X[I,KLst]; P:=B[i];KLstr:=I; END
ELSE BEGIN
B[i]:=-1; P1:=P1+1; END;
END;
IF
P1=Kstr*K_st THEN
BEGIN
SAVE(0,'',0);
SAVE(0,'РЕШЕНИЙ НЕТ т.к.
невозможно определить ключевую строку',3);
HALT;
END;
P1:=0;
FOR J:=1 TO
Kell DO
IF
ABS(Mo-Fo[J])<Epsilon THEN
FOR I:=1 TO
Kstr DO
IF B[i]>=0
THEN BEGIN
IF B[i]<P
THEN IF Bvsp[KLst]<>BS[i] THEN BEGIN P:=B[i]; KLstr:=I; END;
IF
INT(10000*B[i])=INT(10000*P) THEN
IF
(BS[i][1]='Y') AND (BS[KLstr][1]='X') THEN
IF
Bvsp[KLst]<>BS[i] THEN BEGIN P:=B[i]; KLstr:=I; END;
END;
SAVE(0,'Ключевая строка: ',2);SAVE(KLstr,' ',1);
SAVE(0,'',0);
FOR I:=1 TO
Kstr DO
IF
Bvsp[KLst]=BS[i] THEN
BEGIN
SAVE(0,'РЕШЕНИЙ НЕТ т.к.
в базисном столбце уже есть ',3);
SAVE(0,'такая
переменная.',3);
HALT;
END;
{ Вызов процедуры
сокращения Y }
If
CPr[KLstr]=1 then SOKR;
{ Построение следующей
Симплекс-таблицы }
BS[KLstr]:=Bvsp[KLst];
Cnew[KLstr]:=FX[KLst];
CPrnew[KLstr]:=FunctPr[KLst];
FOR I:=1 TO
Kstr DO
BEGIN
IF I=KLstr
THEN Hnew[i]:=H[i]/X[KLstr,KLst]
ELSE
Hnew[i]:=H[i]-(H[KLstr]*X[I,KLst]/X[KLstr,KLst]);
FOR J:=1 TO
Kell DO
BEGIN
IF (I=KLstr)
AND (J=KLst) THEN Xnew[I,J]:=1;
IF (I=KLstr)
AND (J<>KLst) THEN Xnew[I,J]:=X[I,J]/X[KLstr,KLst];
IF
(I<>KLstr) AND (J=KLst) THEN Xnew[I,J]:=0;
IF
(I<>KLstr) AND (J<>KLst) THEN
Xnew[I,J]:=X[I,J]-(X[KLstr,J]*X[I,KLst]/X[KLstr,KLst]);
END;
END;
KLst:=0;KLstr:=0;
Kit:=Kit+1;
UNTIL (Kit=0);
END;
{ Основная программа }
BEGIN
CLRSCR;
Kit:=0;Dop_X:=0;
ASSIGN(F,'SIMPLEX.DAT');
REWRITE(F);
CLOSE(F);
ST:;
WRITE('Введите кол-во строк:');READLN(Kstr);
IF Kstr>10 THEN
BEGIN
WRITELN('Программа не
расчитана на введенное кол-во строк!');
GOTO ST;
END;
ELL:
WRITE('Введите кол-во элементов:');READLN(Kell);
IF Kell>10 THEN
BEGIN
WRITELN('Программа не
расчитана на введенное кол-во элементов!');
GOTO ELL;
END;
ZN:
WRITE('Исследуем на
МАКСИМУМ(1) или МИНИМУМ(2):');READLN(Fm);
IF (Fm<>1) AND (Fm<>2)
THEN
BEGIN
WRITELN('Введите снова');GOTO
ZN;
END;
WRITE('Целочисленное решение(Y/N): ');READLN(PrGomory);
IF
(PrGomory='Y') OR (PrGomory='y') THEN PrGomory:='Y' ELSE PrGomory:='N';
{ Вызов процедуры SIMPLEX}
SIMPLEX;
END.
Z = 10х1+8х2+6х3
C: B: N: (Bi) X1 X2 X3 Y1 Y2 Y3
+M Y1 120.0000
4.0000 8.0000 4.0000 1.0000 0.0000 0.0000
+M Y2 160.0000
6.0000 2.0000 3.0000 0.0000 1.0000 0.0000
+M Y3 400.0000
2.0000 2.0000 4.0000 0.0000 0.0000 1.0000
680.0000 12.0000
12.0000 11.0000 0.0000 0.0000 0.0000
Klu4evoy
stolbec: 2 Klu4evaya stroka: 1
C: B: N: X1 X2
X3 Y2 Y3
-8.0000 X2 15.0000
0.5000 1.0000 0.5000 0.1250 0.0000
+M Y2 130.0000
5.0000 0.0000 2.0000 -0.2500 1.0000
+M Y3 370.0000
1.0000 0.0000 3.0000 -0.2500 0.0000
500.0000 6.0000
0.0000 5.0000 0.0000 0.0000
Klu4evoy
stolbec: 1 Klu4evaya stroka: 2
C: B: N: X1 X2
X3 Y3
-8.0000 X2 2.0000
0.0000 1.0000 0.3000 0.1500
-10.0000 X1 26.0000
1.0000 0.0000 0.4000 -0.0500
+M Y3 344.0000
0.0000 0.0000 2.6000 -0.2000
344.0000 0.0000
0.0000 2.6000 0.0000
В 3 -y iteracii bilo polu4eno
optimalnoe reshenie
no t.k. iz
bazisa nevivedeni vse Y, to
mojno sdelat
vivod, chto resheniy NET
X1 = 26
X2 = 2
X3 = 0
Z = 10 * 26
+ 8 * 2 + 6 * 0 = 276
|