Professional Documents
Culture Documents
Program Simplex
Program Simplex
subroutine Data(NV,NC,TS)
integer,
parameter
::
VMAX=10
real*8 TS(CMAX,VMAX)
real*8 R1,R2
character*1 R
CMAX=10,
end do
write(*,60,advance='no');
read
*,
TS(I+1,1)
end do
print *,' '
print *,'RESULTS:'
print *,' '
do J=1, NV
TS(0,J+1) = float(J)
end do
do I=NV+1, NV+NC
TS(I-NV+1,0) = float(I)
end do
return
10 format('
#',I1,' ? ')
20 format(' CONSTRAINT #',I1,' ? ')
30 format(' MAXIMIZE (Y/N) ? ')
40 format(' NUMBER OF VARIABLES OF
ECONOMIC FUNCTION ? ')
50 format(' NUMBER OF CONSTRAINTS
? ')
60 format('
Right hand side ? ')
end
Subroutine Simplex1(NV,NC,TS,XERR)
integer,
parameter
::
CMAX=10,
VMAX=10
real*8 TS(CMAX,VMAX)
integer P1,P2,XERR, NOPTIMAL
10 call Pivot(NV,NC,TS,P1,P2)
call Formula(NV,NC,TS,P1,P2)
call
Optimize(NV,NC,TS,NOPTIMAL,XERR)
if (NOPTIMAL.EQ.1) goto 10
return
end
Subroutine Pivot(NV,NC,TS,P1,P2)
integer,
parameter
::
CMAX=10,
VMAX=10
real*8 TS(CMAX,VMAX)
integer P1,P2
real*8 RAP,V,XMAX
XMAX = 0.d0
do J=2, NV+1
if (TS(1,J) > 0.d0.AND.TS(1,J) >
XMAX) then
XMAX = TS(1,J)
P2 = J
end if
end do
RAP = 999999.d0
do I=2, NC+1
if (TS(I,P2) >= 0.d0) goto 10
V = dabs(TS(I,1) / TS(I,P2))
if (V < RAP) then
RAP = V
P1 = I
end if
10 end do
V = TS(0,P2)
TS(0,P2) = TS(P1,0)
TS(P1,0) = V
return
end
Subroutine Formula(NV,NC,TS,P1,P2)
integer,
parameter
::
CMAX=10,
VMAX=10
real*8 TS(CMAX,VMAX)
integer P1,P2
do I=1, NC+1
if (I == P1) goto 70
do J=1, NV+1
if (J == P2) goto 60
TS(I,J) = TS(I,J) - TS(P1,J) * TS(I,P2) /
TS(P1,P2)
do J=2, NV+1
if (TS(1,J) > 0.d0) NOPTIMAL = 1
end do
return
end
Subroutine Results(NV,NC,TS,XERR)
integer,
parameter
::
CMAX=10,
VMAX=10
real*8 TS(CMAX,VMAX)
integer XERR
if (XERR == 0) goto 30
print *,' NO SOLUTION.'
goto 100
30 do I=1, NV
do J=2, NC+1
if (TS(J,0).NE.float(I)) goto 70
write(*,120) I, TS(J,1)
70 end do
end do
write(*,130) TS(1,1)
100 print *,' '
return
120 format('
VARIABLE #',I1,': ',F10.6)
60 end do
70 end do
TS(P1,P2) = 1.d0 / TS(P1,P2)
do J=1, NV+1
if (J == P2) goto 100
TS(P1,J) = TS(P1,J) * dabs(TS(P1,P2))
100 end do
do I=1, NC+1
if (I == P1) goto 110
TS(I,P2) = TS(I,P2) * TS(P1,P2)
110 end do
return
end
Subroutine
Optimize(NV,NC,TS,NOPTIMAL,XERR)
integer,
parameter
::
CMAX=10,
VMAX=10
real*8 TS(CMAX,VMAX)
integer XERR
do I=2, NC+1
if (TS(I,1) < 0.d0) XERR = 1
end do
NOPTIMAL = 0
if (XERR == 1) return
130 format('
',F10.6)
end
ECONOMIC FUNCTION: