1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GLP: LINEAR PROGRAMMING
4  REM
5  REM       36516 REV A
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
90  DIM U[30],V[30]
100  REM *****LINPRO****BUSINESS PROGRAM
110  REM LINPRO*********VERSION #1 (7/31/69) ***LINEAR PROGRAMMING
120  LET Q=.01
130  DIM A[30,50]
140  LET I=30
150  LET J=50
160  PRINT 
170  DIM I$[15]
180  PRINT "DO YOU WANT TO MAXIMIZE OR MINIMIZE";
190  INPUT I$
200  Z=-1
210  IF I$[2,2]="A" THEN 230
220  Z=+1
230  PRINT "NUMBER OF VARIABLES";
240  INPUT N
250  PRINT "NUMBER OF CONSTRAINTS";
260  INPUT M
265  FOR I=1 TO M
266  U[I]=I
267  NEXT I
270  IF M+1>30 THEN 810
280  MAT A=ZER
290  L=E=G=0
300  REM -- READ DATA ENTRY
310  IF TYP(0)=2 THEN 380
320  READ I9
330  IF I9=999 THEN 570
340  IF TYP(0)=2 THEN 430
350  READ J9
360  READ A[I9,J9+1]
370  GOTO 300
380  REM -- OBJECTIVE
390  READ I$,J9
400  READ A[M+1,J9+1]
410  A[M+1,J9+1]=Z*A[M+1,J9+1]
420  GOTO 300
430  REM -- RHS
440  READ I$
450  READ A[I9,50]
460  IF I$[1,1]=">" THEN 510
470  IF I$[1,1]="<" THEN 540
480  A[I9,1]=0
490  E=E+1
500  GOTO 300
510  A[I9,1]=+1
520  G=G+1
530  GOTO 300
540  A[I9,1]=-1
550  L=L+1
560  GOTO 300
570  REM -- REARRANGE ROWS
580  I9=0
590  FOR I8=2 TO M
600  IF A[I8,1] >= A[I8-1,1] THEN 700
610  I9=1
620  FOR J9=1 TO N+1
630  A9=A[I8,J9]
640  A[I8,J9]=A[I8-1,J9]
650  A[I8-1,J9]=A9
660  NEXT J9
670  A9=A[I8,50]
680  A[I8,50]=A[I8-1,50]
690  A[I8-1,50]=A9
692  A9=U[I8]
693  U[I8]=U[I8-1]
694  U[I8-1]=A9
700  NEXT I8
710  IF I9=1 THEN 580
720  B=M+N+G+1
730  W=M+1
740  B=B+1
750  H=1
760  FOR I=1 TO M
770  A[I,B]=A[I,50]
780  A[I,1]=0
790  NEXT I
800  IF B <= 50 THEN 821
810  PRINT "SORRY -- PROBLEM IS TOO LARGE"
820  STOP 
821  REM -- SET UP ID VECTOR
822  FOR I=1 TO G
823  V[I]=U[L+E+I]
824  NEXT I
825  FOR I=1 TO L
826  V[I+G]=U[I]
827  NEXT I
828  FOR I=1 TO E
829  V[G+L+I]=U[L+I]
830  NEXT I
840  FOR K=2 TO M+1
850  LET A[K-1,N+G+K]=1
860  LET A[K-1,1]=K+N+G-1
870  NEXT K
880  IF G <> 0 THEN 910
890  IF E=0 THEN 1110
900  GOTO 940
910  FOR K=L+E+2 TO M+1
920  LET A[K-1,K+N-L-E]=-1
930  NEXT K
940  LET W=W+1
950  LET Q=0
960  FOR J=2 TO N+G+1
970  LET S=0
980  FOR I=M-G-E+1 TO M
990  LET S=S+A[I,J]
1000  NEXT I
1010  LET A[W,J]=-S
1020  IF A[W,J]>Q THEN 1050
1030  LET Q=A[W,J]
1040  LET C=J
1050  NEXT J
1060  LET S=0
1070  FOR J=M-G-E+1 TO M
1080  LET S=S+A[J,B]
1090  NEXT J
1100  LET A[W,B]=-S
1110  PRINT 
1120  REM TRANSFORM MATRIX
1130  IF Q=.01 THEN 1460
1140  IF Q=0 THEN 1540
1150  PRINT "-";
1160  LET H=H+1
1170  LET Q=1.E+38
1180  LET R=0
1190  FOR I=1 TO M
1200  IF A[I,C] <= 0 THEN 1240
1210  IF A[I,B]/A[I,C]>Q THEN 1240
1220  LET Q=A[I,B]/A[I,C]
1230  LET R=I
1240  NEXT I
1250  IF R >= .5 THEN 1280
1260  PRINT " SOLUTION UNBOUNDED"
1270  STOP 
1280  LET P=A[R,C]
1290  LET A[R,1]=C-1
1300  FOR J=2 TO B
1310  LET A[R,J]=A[R,J]/P
1320  NEXT J
1330  FOR I=1 TO W
1340  IF I=R THEN 1410
1350  FOR J=2 TO B
1360  IF J=C THEN 1400
1370  LET A[I,J]=A[I,J]-A[R,J]*A[I,C]
1380  IF ABS(A[I,J])>.00001 THEN 1400
1390  LET A[I,J]=0
1400  NEXT J
1410  NEXT I
1420  FOR I=1 TO W
1430  LET A[I,C]=0
1440  NEXT I
1450  LET A[R,C]=1
1460  LET Q=0
1470  FOR J=2 TO N+G+L+1
1480  IF A[W,J]>Q THEN 1510
1490  LET Q=A[W,J]
1500  LET C=J
1510  NEXT J
1520  GOTO 1140
1530  REM CHANGE TO PHASE TWO
1540  IF W=M+1 THEN 1660
1550  LET W=W-1
1560  IF A[W+1,B]<.000001 THEN 1590
1570  PRINT " NO FEASIBLE SOLUTION"
1580  STOP 
1590  FOR I=1 TO M
1600  IF A[I,1] <= N+G+L THEN 1640
1610  FOR J=2 TO B
1620  LET A[I,J]=0
1630  NEXT J
1640  NEXT I
1650  GOTO 1460
1660  PRINT 
1670  IF Q=0 THEN 1690
1680  PRINT " BASIS BEFORE ITERATION"H
1690  REM -- PRINT ANSWER
1692  PRINT 
1693  PRINT "SOLUTION"
1694  PRINT "--------"
1695  PRINT 
1696  PRINT "VALUE OF THE OBJECTIVE =";-Z*A[W,B]
1697  PRINT 
1700  PRINT "   VARIABLES"
1701  PRINT "================="
1702  PRINT "VARIABLE    VALUE"
1703  PRINT "--------    -----"
1705  FOR I=1 TO M
1707  IF A[I,1]=0 THEN 1710
1708  IF A[I,1]>N THEN 1710
1709  PRINT A[I,1];TAB(10);A[I,B]
1710  NEXT I
1715  PRINT 
1716  PRINT "    BINDING CONSTRAINTS"
1717  PRINT "============================"
1720  PRINT "CONSTRAINT    SHADOW-PRICE"
1721  PRINT "----------    ------------"
1730  FOR J=N+1 TO B-G-2
1732  IF A[W,J+1]=0 THEN 1736
1734  PRINT V[J-N];TAB(12);A[W,J+1]
1736  NEXT J
1750  PRINT 
1751  PRINT "  SLACK CONSTRAINTS"
1752  PRINT "===================="
1753  PRINT "CONSTRAINT  SLACK"
1754  PRINT "----------  -----"
1760  FOR I=1 TO M
1762  IF A[I,1] <= N THEN 1770
1764  A9=A[I,1]-N
1766  PRINT V[A9];TAB(12);ABS(A[I,B])
1770  NEXT I
1810  STOP 
1820  REM SUBROUTINE TO PRINT THE ENTIRE TABLEAU
1830  PRINT "TABLEAU AFTER"H-1"ITERATIONS"
1840  FOR I=1 TO W
1850  FOR J=2 TO B
1860  IF B>6 THEN 1890
1870  PRINT A[I,J],
1880  GOTO 1900
1890  PRINT A[I,J];
1900  NEXT J
1910  PRINT 
1920  PRINT 
1930  NEXT I
1940  RETURN 
1950  REM -- DATA FORMAT
1951  REM -- CON#, VAR#, COEFFICIENT
1952  REM -- FOR OBJECTIVE COEFFICIENTS
1953  REM      "OBJ", VAR#, COEFFICIENT
1954  REM -- FOR RHS
1955  REM     CON#, "*", RHS VALUE
1956  REM     WHERE: * CAN BE "<", "<=", "=", ">=" OR ">"
1957  REM      FOR EXAMPLE: ">=" MEANS LHS >= RHS
1958  REM      >= AND > BOTH MEAN >= (DITTO <= AND <)
1959  REM -- START DATA AT 2000
9998  DATA 999
9999  END 
