Sei sulla pagina 1di 8

OUTPUT_TAB();

CALC_TAB();
ART_OBJ();
EXPORT SIMPLEX_v1_MrB()
BEGIN
LOCAL nv:=2,nc:=1,nl:=0,ng:=0,ne:=0,aof:=-1;
LOCAL r:=1,c:=1,pr:=1,pc:=1,tc:=1,sr:=1;
LOCAL tmp:=1,ptab:=1,mat:=1;
LOCAL tab1:="INITIAL TABLEAU",tr=1,tc:=1;
PRINT;
input({
{nv,[0],{65,15,0}},
{nl,[0],{65,15,1}},
{ng,[0],{65,15,2}},
{ne,[0],{65,15,3}},
{aof,{"MAX","MIN"},{65,15,4}}
},
"Enter Simplex Problem Info:",
{
"Number of variables? ",
"Number of LE constraints? ",
"Number of GE constraints? ",
"Number of EQ constraints? ",
"MAX or MIN objective? "
},
{
"Number of variables in problem?",
"Number of less than or equal to constraints?",
"Number of greater than or equal to constraints?",
"Number of equality constraints?",
"Choose to MAX or MIN objective function."
});
input({
{ptab,{"NO","YES"},{65,15,2}},
{mat,{"NO","YES"},{65,15,4}}
},
"Constraint Order: LE 1st, GE 2nd, EQ 3rd",
{
"Print all tableaus? ",
"Use data stored in M1?"
},
{
"Choose to print all tableaus.",
"Use data previously stored in matrix M1."
});
IF aof = 1 THEN aof:=-aof;
ELSE aof:=1;
END;
IF mat=1 THEN
IF ng>0 OR ne>0 THEN
M1:=MAKEMAT(0,nl+ng+ne+2,nv+nl+2*ng+ne+1);
ELSE
M1:=MAKEMAT(0,nl+1,nv+nl+1);
END;
IF nl>0 THEN
FOR r FROM 1 TO nl DO
FOR c FROM 1 TO nv DO
INPUT({
{M1(r,c),[0],{20,65,2}}},
"LE ROW "+r+" COEFFICIENT FOR X("+c+")",
{"X("+c+"): "},
{"Less than or equal to coefficient for X("+r+","+c+")."});
END;
tmp:=nv+nl+2*ng+ne+1;
INPUT({
{M1(r,tmp),[0],{30,65,2}}},
"LE RHS CONSTANT FOR ROW "+r,
{"RHS ROW "+r+": "},
{"LE right hand side constant for X("+r+","+tmp+")."});
M1(r,nv+r):=1;
END;
END;
IF ng>0 THEN
FOR r FROM nl+1 TO nl+ng DO
FOR c FROM 1 TO nv DO
INPUT({
{M1(r,c),[0],{20,65,2}}},
"GE ROW "+r+" COEFFICIENT FOR X("+c+")",
{"X("+c+"): "},
{"Greater than or equal to coefficient for X("+r+","+c+")."});
END;
tmp:=nv+nl+2*ng+ne+1;
INPUT({
{M1(r,tmp),[0],{30,65,2}}},
"GE RHS CONSTANT FOR ROW "+r,
{"RHS ROW "+r+": "},
{"GE right hand side constant for X("+r+","+tmp+")."});
M1(r,nv+r):=-1;
M1(r,nv+ng+r):=1;
END;
END;
IF ne>0 THEN
FOR r FROM nl+ng+1 TO nl+ng+ne DO
FOR c FROM 1 TO nv DO
INPUT({
{M1(r,c),[0],{20,65,2}}},
"EQ ROW "+r+" COEFFICIENT FOR X("+c+")",
{"X("+c+"): "},
{"Equality constraint coefficient for X("+r+","+c+")."});
END;
tmp:=nv+nl+2*ng+ne+1;
INPUT({
{M1(r,tmp),[0],{30,65,2}}},
"EQ RHS CONSTANT FOR ROW "+r,
{"RHS ROW "+r+": "},
{"EQ right hand side constant for X("+r+","+tmp+")."});
M1(r,nv+ng+r):=1;
END;
END;
FOR r FROM nl+ng+ne+1 TO nl+ng+ne+1 DO
FOR c FROM 1 TO nv DO
INPUT({
{M1(r,c),[0],{20,65,2}}},
"ENTER Z COEFFICIENT FOR X("+c+"):",
{"Z X("+c+"): "},
{"Objective function Z coefficient for X("+r+","+c+")."});
M1(r,c):=M1(r,c)*aof;
END;
END;
ART_OBJ(nv,nl,ng,ne);
END;
IF mat=2 THEN
IF rowDim(M1)<>nl+ng+ne+1 OR colDim(M1)<>nv+1 THEN
PRINT;
PRINT("CHECK MATRIX DIMENSIONS");
PRINT("");
PRINT("TRY AGAIN");
KILL;
END;
IF ng>0 OR ne>0 THEN
REDIM(M1, {nl+ng+ne+2,nv+nl+2*ng+ne+1});
SWAPCOL(M1,nv+1,nv+nl+2*ng+ne+1);
ELSE
REDIM(M1, {nl+ng+ne+1,nv+nl+2*ng+ne+1});
SWAPCOL(M1,nv+1,nv+nl+2*ng+ne+1);
END;
IF nl>0 THEN
FOR r FROM 1 TO nl DO
FOR c FROM 1 TO nv DO
M1(r,nv+r):=1;
END;
END;
END;
IF ng>0 THEN
FOR r FROM nl+1 TO nl+ng DO
FOR c FROM 1 TO nv DO
M1(r,nv+r):=-1;
M1(r,nv+ng+r):=1;
END;
END;
END;
IF ne>0 THEN
FOR r FROM nl+ng+1 TO nl+ng+ne DO
FOR c FROM 1 TO nv DO
M1(r,nv+ng+r):=1;
END;
END;
END;
FOR r FROM nl+ng+ne+1 TO nl+ng+ne+1 DO
FOR c FROM 1 TO nv DO
M1(r,c):=M1(r,c)*aof;
END;
END;
ART_OBJ(nv,nl,ng,ne);
END;
IF ng>0 OR ne>0 THEN
tab1:="PHASE 1 TABLEAU";
tab1:= CALC_TAB(nv,nl,ng,ne,tab1,ptab);
IF ABS(M1(rowDim(M1),colDim(M1))) > .00001 THEN
PRINT;
PRINT("PHASE I CAN NOT CONTINUE");
PRINT("PROBLEM IS INFEASIBLE");
KILL;
END;
END;
IF ng>0 OR ne>0 THEN
DELROW(M1,nl+ng+ne+2);
FOR c FROM 1 TO ng+ne DO
DELCOL(M1,nv+nl+ng+1);
END;
END;
tab1:="PHASE 2 TABLEAU";
tab1:= CALC_TAB(nv,nl,ng,ne,tab1,ptab);
IF ptab=2 THEN
OUTPUT_TAB(tab1);
END;
PRINT;
PRINT(tab1);
PRINT("");
FOR c FROM 1 to nv DO
tmp:=0;
pr:=0;
pc:=0;
FOR r FROM 1 to nl+ng+ne DO
IF M1(r,c)<>0
THEN
pr:=r;
pc:=c;
tmp:=tmp+1;
END;
END;
IF tmp = 1 THEN
PRINT("X("+pc+") = "+M1(pr,colDim(M1)));
ELSE
PRINT("X("+c+") = 0");
END;
END;
PRINT("");
aof:=-aof;
PRINT("Z= "+(aof*M1(rowDim(M1),colDim(M1))));
END;
OUTPUT_TAB(tab1)
BEGIN
LOCAL rd:=1,cd:=1,r:=0,c:=0,t:=0,k:=0;
rd:=rowDim(M1);
cd:=colDim(M1);
FOR c FROM 1 TO cd DO
FOR r FROM 1 TO rd DO
PRINT;
PRINT("COLUMN "+c+" "+tab1);
PRINT(" ");
IF rd - r > 10 THEN
FOR k FROM r TO 10 DO
PRINT("X("+k+","+c+")= "+M1(k,c));
END;
PRINT(" ");
PRINT("Hit a number key or ENTER key to continue.");
REPEAT
t:=ISKEYDOWN(GETKEY);
UNTIL t=1;
r:=r+k;
ELSE
FOR k FROM r TO rd DO
PRINT("X("+k+","+c+")= "+M1(k,c));
END;
PRINT(" ");
PRINT("Hit a key to continue.");
REPEAT
t:=ISKEYDOWN(GETKEY);
UNTIL t=1;
BREAK;
END;
r:=r-2;
PRINT;
END;
PRINT(" ");
END;
RETURN;
END;
CALC_TAB(nv,nl,ng,ne,tab1,ptab)
BEGIN
LOCAL rd:=1,cd:=1,r:=1,c:=1;
LOCAL pc:=1,pr:=1,old:=0,k:=0;
rd:=rowDim(M1);
cd:=colDim(M1);
REPEAT
IF ptab=2 THEN
OUTPUT_TAB(tab1);
END;
pc:=1;
FOR c FROM 1 TO nv+nl+ng DO
IF ABS(M1(rd,c))<.00000000001
THEN M1(rd,c):=0;
END;
IF M1(rd,c) < 0
AND M1(rd,c) < M1(rd,pc)
THEN pc:=c;
END;
END;
IF M1(rd,pc)>=0 THEN
tab1:=("SOLUTION");
RETURN tab1;
END;
pr:=0;
FOR r FROM 1 TO nl+ng+ne DO
IF M1(r,pc) > 0 THEN pr:=r;
END;
END;
IF pr=0 THEN
tab1:="NO OPTIMAL SOLUTION";
RETURN tab1;
END;
FOR r FROM 1 TO nl+ng+ne DO
IF M1(r,pc) > 0
AND M1(r,cd)/M1(r,pc) < M1(pr,cd)/M1(pr,pc)
THEN pr:=r;
END;
END;
SCALE(M1,1/M1(pr,pc),pr);
M1:=pivot(M1,pr,pc);
IF k=0 THEN old := M1(pr,pc);
k:=k+1;
CONTINUE;
END;
IF M1(pr,pc)=old THEN k:=k+1;
END;
IF k=11 THEN PRINT;
PRINT("Cycling Detected!");
PRINT("Try DUAL of problem.");
KILL;
END;
IF rowDim(M1)=nl+ng+ne+2 AND
M1(rowDim(M1),colDim(M1)) > -.00000000001 THEN
RETURN;
END;
UNTIL pr=0;
RETURN;
END;

ART_OBJ(nv,nl,ng,ne)
BEGIN
LOCAL r,c,tmp;
IF ng>0 THEN
FOR c FROM 1 TO nv+nl+ng DO
tmp:=0;
FOR r FROM nl+1 TO nl+ng DO
tmp:=tmp+M1(r,c);
END;
M1(nl+ng+ne+2,c):=(-1)*tmp;
END;
c:=nv+nl+2*ng+ne+1;
tmp:=0;
FOR r FROM nl+1 TO nl+ng DO
tmp:=tmp+M1(r,c);
END;
M1(nl+ng+ne+2,c):=(-1)*tmp;
END;
IF ne>0 THEN
FOR c FROM 1 TO nv+nl+ng DO
tmp:=0;
FOR r FROM nl+ng+1 TO nl+ng+ne DO
tmp:=tmp+M1(r,c);
END;
M1(nl+ng+ne+2,c):=M1(nl+ng+ne+2,c)+(-1)*tmp;
END;
c:=nv+nl+2*ng+ne+1;
tmp:=0;
FOR r FROM nl+ng+1 TO nl+ng+ne DO
tmp:=tmp+M1(r,c);
END;
M1(nl+ng+ne+2,c):=M1(nl+ng+ne+2,c)+(-1)*tmp;
END;
RETURN;
END;

Potrebbero piacerti anche