5  REM LINPRO, HP 36068C, 6/74
10  REM D. E. RAMIREZ,MATH DEPT.,UVA
20  REM 3/27/74
30  REM ADAPTED FROM HP $LINPRO
35  REM CONVERSION:  JOHN H. BARLOW  (SEP.,1975)
40  PRINT "A PROGRAM TO SOLVE LINEAR PROGRAMS WITH CONSTRAINTS OF THE FORM"
50  PRINT "A*X<=B, A*X=B, AND A*X>=B WHERE B IS A NONNEGATIVE VECTOR."
60  DIM A[30,50]
70  DIM B[30,30]
80  LET Q=.01
90  D1=0
100  PRINT "DO YOU WISH TO SEE THE PIVOT STEPS (Y OR N)";
110  INPUT A$
120  PRINT "DO YOU WISH TO SEE THE SIMPLEX TABLEAUX (Y OR N)";
130  INPUT Y$
140  PRINT 
150  PRINT "IF MAX, TYPE '1'; IF MIN, TYPE '-1'";
160  INPUT Z
170  PRINT 
180  LET Z=-Z
190  PRINT "TYPE: NUMBER OF CONSTRAINTS, NUMBER OF VARIABLES";
200  INPUT M,N
210  PRINT "TYPE: NO. OF LESS THANS, NO. OF EQUALITIES, NO. OF GREATER THANS";
220  INPUT L,E,G
230  IF L+E+G=M THEN 260
240  PRINT " INPUT DATA NOT CONSISTENT."
250  GOTO 190
260  LET B=M+N+G+1
270  W1=M+1
280  LET W=M+1
290  PRINT "ENTER THE SIMPLEX TABLEAU IN THE ORDER: <= INEQUALITIES,"
300  PRINT "EQUALITIES, >= INEQUALITIES, OBJECTIVE FUNCTION."
310  MAT  INPUT B[W,N+1]
320  FOR I=1 TO W-1
330  IF B[I,N+1] >= 0 THEN 360
340  PRINT "THE VECTOR B MUST BE NONNEGATIVE"
350  GOTO 40
360  NEXT I
370  REM INITIALIZATION
380  LET B=B+1
390  LET H=1
400  FOR I=1 TO W+1
410  FOR J=2 TO B
420  LET A[I,J]=0
430  NEXT J
440  NEXT I
450  FOR I=1 TO M
460  FOR J=2 TO N+1
470  A[I,J]=B[I,J-1]
480  NEXT J
490  NEXT I
500  FOR I=1 TO M+1
510  A[I,B]=B[I,N+1]
520  NEXT I
530  FOR J=2 TO N+1
540  A[W,J]=B[W,J-1]
550  LET A[W,J]=Z*A[W,J]
560  NEXT J
570  REM SET UP TABLEAU, SLACKS, ETC.
580  FOR K=2 TO M+1
590  LET A[K-1,N+G+K]=1
600  LET A[K-1,1]=K+N+G-1
610  NEXT K
620  IF G <> 0 THEN 650
630  IF E=0 THEN 860
640  GOTO 680
650  FOR K=L+E+2 TO M+1
660  LET A[K-1,K+N-L-E]=-1
670  NEXT K
680  W=W+1
690  W1=W1+1
700  LET Q=0
710  FOR J=2 TO N+G+1
720  LET S=0
730  FOR I=M-G-E+1 TO M
740  LET S=S+A[I,J]
750  NEXT I
760  LET A[W,J]=-S
770  IF A[W,J]>Q THEN 800
780  LET Q=A[W,J]
790  LET C=J
800  NEXT J
810  LET S=0
820  FOR J=M-G-E+1 TO M
830  LET S=S+A[J,B]
840  NEXT J
850  LET A[W,B]=-S
860  PRINT 
870  PRINT 
880  PRINT "     YOUR VARIABLES"H"THROUGH"N
890  IF G=0 THEN 910
900  PRINT "     SURPLUS VARIABLES"N+1"THROUGH"N+G
910  IF L=0 THEN 930
920  PRINT "     SLACK VARIABLES"N+G+1"THROUGH"N+G+L
930  IF G+E=0 THEN 950
940  PRINT "     ARTIFICIAL VARIABLES"N+G+L+1"THROUGH"B-2
950  REM
960  REM TRANSFORM MATRIX
970  PRINT 
980  PRINT 
990  IF A$="Y" THEN 1010
1000  GOSUB 1950
1010  IF Q=.01 THEN 1390
1020  IF Q=0 THEN 1470
1030  GOTO 1710
1040  LET H=H+1
1050  LET Q=1.E+38
1060  LET R=0
1070  FOR I=1 TO M
1080  IF A[I,C] <= 0 THEN 1120
1090  IF A[I,B]/A[I,C]>Q THEN 1120
1100  LET Q=A[I,B]/A[I,C]
1110  LET R=I
1120  NEXT I
1130  IF R >= .5 THEN 1200
1140  PRINT " SOLUTION UNBOUNDED"
1150  PRINT 
1160  PRINT 
1170  IF A$="Y" THEN 1190
1180  GOSUB 1950
1190  STOP 
1200  LET P=A[R,C]
1210  LET A[R,1]=C-1
1220  C1=C-1
1230  FOR J=2 TO B
1240  LET A[R,J]=A[R,J]/P
1250  NEXT J
1260  FOR I=1 TO W
1270  IF I=R THEN 1340
1280  FOR J=2 TO B
1290  IF J=C THEN 1330
1300  LET A[I,J]=A[I,J]-A[R,J]*A[I,C]
1310  IF ABS(A[I,J])>.00001 THEN 1330
1320  LET A[I,J]=0
1330  NEXT J
1340  NEXT I
1350  FOR I=1 TO W
1360  LET A[I,C]=0
1370  NEXT I
1380  LET A[R,C]=1
1390  LET Q=0
1400  FOR J=2 TO N+G+L+1
1410  IF A[W,J]>Q THEN 1440
1420  LET Q=A[W,J]
1430  LET C=J
1440  NEXT J
1450  GOTO 1020
1460  REM CHANGE TO PHASE TWO
1470  IF W=M+1 THEN 1680
1480  LET W=W-1
1490  X1=0
1500  FOR X=N+G+L+1 TO B-2
1510  IF A[W+1,X+1]>.000001 THEN 1530
1520  X1=1
1530  NEXT X
1540  IF X1<.5 THEN 1610
1550  PRINT " NO FEASIBLE SOLUTION"
1560  PRINT 
1570  PRINT 
1580  IF A$="Y" THEN 1590
1590  GOSUB 1950
1600  STOP 
1610  FOR I=1 TO M
1620  IF A[I,1] <= N+G+L THEN 1660
1630  FOR J=2 TO B
1640  LET A[I,J]=0
1650  NEXT J
1660  NEXT I
1670  GOTO 1390
1680  D1=1
1690  GOSUB 1950
1700  PRINT "ANSWERS:"
1710  IF Q=0 THEN 1750
1720  IF A$="N" THEN 1800
1730  GOSUB 1950
1740  PRINT " BASIS BEFORE ITERATION"H
1750  PRINT " VARIABLE","VALUE"
1760  FOR I=1 TO M
1770  IF A[I,1]=0 THEN 1790
1780  PRINT A[I,1],A[I,B]
1790  NEXT I
1800  IF Q <> 0 THEN 1040
1810  PRINT "DUAL VARIABLES:"
1820  PRINT " COLUMN","VALUE"
1830  FOR J=N+1 TO B-G-2
1840  PRINT J,A[W,J+1]
1850  NEXT J
1860  PRINT "OBJECTIVE FUNCTION VALUE =";-Z*A[W,B]
1870  PRINT "IN"H-1"ITERATIONS"
1880  IF D1<.5 THEN 1900
1890  END 
1900  GOSUB 1950
1910  IF D1<.5 THEN 1900
1920  END 
1930  GOTO 2110
1940  REM SUBROUTINE TO PRINT THE ENTIRE TABLEAU
1950  IF H-1=0 THEN 1980
1960  IF A$="N" THEN 1980
1970  PRINT "PIVOT COORDINATE IS ("R","C1")"
1980  IF Y$="N" THEN 2100
1990  PRINT "TABLEAU AFTER "H-1" ITERATIONS"
2000  FOR I=1 TO W1
2010  FOR J=2 TO B
2020  IF B>6 THEN 2050
2030  PRINT A[I,J],
2040  GOTO 2060
2050  PRINT A[I,J];
2060  NEXT J
2070  PRINT 
2080  PRINT 
2090  NEXT I
2100  RETURN 
2110  END 
