Kamis, 03 Maret 2011

Program Metode Simplex

Program METODE_SIMPLEX;

USES CRT;
TYPE
ARRAY_REAL = ARRAY [1..100] OF REAL;
ARRAY_INT = ARRAY [1..100] OF INTEGER;
VAR_REC = RECORD
Kolom : INTEGER;
Baris : INTEGER;
END;

VAR
Cj : ARRAY [1..100] OF REAL;
Var_Bas : ARRAY [1..100] OF ARRAY_REAL;
Zj : ARRAY [1..100] OF REAL;
Cj_Zj : ARRAY [1..100] OF REAL;
Temp : ARRAY [1..100] OF REAL;
Var_Koor : ARRAY [1..100] OF VAR_REC;
Keuntungan : ARRAY [1..100] OF REAL;
var_basic,var_nonbasic,fungsi_kendala : INTEGER;
brs,kol :INTEGER;
index_kuantitas : integer;
Index_var_koor : integer;
Z : REAL;
count_iterasi : INTEGER;

PROCEDURE BikinGaris(x,y,count:INTEGER;kar:CHAR);
VAR
i:integer;
BEGIN
FOR i:=0 TO count-1 DO
BEGIN
GOTOXY(x+i,y);
WRITE(kar);
END;
END;

PROCEDURE Cetak(ke:integer);
VAR i,j:INTEGER;
BEGIN
clrscr;
WRITELN('Iterasi Tabel Ke-',ke);
brs:=WHEREY;
BikinGaris(1,brs,79,'=');
GOTOXY(1,brs+1);WRITE('Cj');
FOR i:=1 TO var_basic DO
BEGIN
GOTOXY(8*i,brs+1);
WRITE(Cj[i]:1:2);
END;
GOTOXY(1,brs+2);WRITE('VarBsc');
kol:=0;
FOR i:=1 TO var_nonbasic DO
BEGIN
inc(kol,8);
GOTOXY(kol,brs+2);
WRITE('X',i);
END;
FOR i:=1 TO fungsi_kendala DO
BEGIN
inc(kol,8);
GOTOXY(kol,brs+2);
WRITE('S',i);
END;
inc(kol,8);
GOTOXY(kol,brs+2);WRITE('Kuantitas');
BikinGaris(1,brs+3,79,'-');

FOR i:=1 TO fungsi_kendala DO
BEGIN
GOTOXY(1,brs+i+3);WRITE('S',i);
kol:=0;
For j:=1 TO var_basic DO
BEGIN
inc(kol,8);
GOTOXY(kol,brs+i+3);WRITE(Var_Bas[i,j]:1:2);
END;
inc(kol,8);
GOTOXY(kol,brs+i+3);WRITE(Var_Bas[i,j+1]:1:2);
END;
brs:=brs+i+4;
BikinGaris(1,brs,79,'-');
GOTOXY(1,brs+1);WRITE('Zj');
GOTOXY(1,brs+2);WRITE('Cj-Zj');

FOR i:=1 TO var_basic DO
BEGIN
GOTOXY(8*i,brs+1);WRITE(Zj[i]:1:2);
GOTOXY(8*i,brs+2);WRITE(Cj_Zj[i]:1:2);
END;
BikinGaris(1,brs+3,79,'-');
GOTOXY(1,brs+4);WRITE('Z');
GOTOXY(8,brs+4);WRITE(Z:1:2);
BikinGaris(1,brs+5,79,'=');
WRITELN;WRITELN('Press Any keys to continues....!');
END;

FUNCTION FindMaxMinCj_Zj : INTEGER;
VAR
i,max:Integer;
temp:real;
BEGIN
i:=1;
temp:=0.0;
max:=0;
Repeat
if(Cj_Zj[i]>temp) then
Begin
temp:=Cj_Zj[i];
max:=i;
End;
inc(i);
Until i>=var_basic;
FindMaxMinCj_Zj:=max;
END;




FUNCTION FindMinBasic:INTEGER;
VAR
min,i:integer;
awal:real;
BEGIN
min:=1;
awal:=Temp[1];
FOR i:=2 TO fungsi_kendala DO
BEGIN
IF Temp[i]0) DO
BEGIN

FOR i:=1 TO fungsi_kendala DO
BEGIN
If Var_Bas[i,getKol]<>0 Then
Temp[i]:=Var_Bas[i,index_kuantitas]/Var_Bas[i,getKol]
else
Temp[i]:=1.7e38;
END;
getBrs:=FindMinBasic;
elemen:=Var_Bas[getBrs,getKol];

FOR i:=1 TO var_basic+1 DO
BEGIN
Var_Bas[getBrs,i]:=Var_Bas[getBrs,i]/elemen;
END;

FOR i:=1 TO fungsi_kendala DO
BEGIN
IF i=getBrs THEN Continue;
elemen:=Var_Bas[i,getKol];
FOR j:=1 TO var_basic+1 DO
Var_Bas[i,j]:=Var_Bas[i,j]-(elemen*Var_Bas[getBrs,j]);
END;
If getKol<>getKol_temp then INC(index_var_koor);
Var_Koor[index_var_koor].Kolom:=getKol;
Var_Koor[index_var_koor].Baris:=getBrs;
getKol_Temp:=getKol;
IsiKeuntunganVarBasic;

For i:=1 TO var_basic DO
BEGIN
Zj[i]:=0;
For j:=1 TO fungsi_kendala DO
Zj[i]:=Zj[i]+(Var_Bas[j,i]*Keuntungan[j]);
Cj_Zj[i]:=Cj[i]-Zj[i];
END;
Z:=0;

For i:=1 TO fungsi_kendala DO
Z:=Z+(Var_Bas[i,index_kuantitas]*Keuntungan[i]);
inc(count_iterasi);
Cetak(count_iterasi);
readln;
getKol:=FindMaxMinCj_Zj;
END;
WRITELN('Hasil Maksimasi Dari Iterasi Ini Adalah :');

For i:=1 To fungsi_kendala DO
Begin
For j:=1 to index_var_koor DO
begin
if i=Var_Koor[j].Baris Then
begin
WRITELN('HasilX',Var_Koor[j].Kolom,'=',Var_Bas[i,index_kuantitas]:1:2);
end;
End;
End;
WRITELN('Dengan Hasil Keuntungan Maksimal = ',Z:1:2);
WRITELN('Proses Maksimalisasi Selesai...................');
END;

PROCEDURE Input;
VAR
i,j:integer;
BEGIN
CLRSCR;
WRITELN;
WRITE('Masukan Jumlah Variabel Non Basic :');READLN(var_nonbasic);

FOR i:=1 TO var_nonbasic DO
BEGIN
WRITE('Input Nilai Variabel X',i,' = ');READLN(Cj[i]);
END;
WRITE('Masukan Jumlah Fungsi KENDALA : ');READLN(fungsi_kendala);
{Mengisi Cj dengan variabel non basic (S)}

FOR i:=1 TO fungsi_kendala DO
Cj[var_nonbasic+i]:=0;
var_basic:=fungsi_kendala+var_nonbasic;



FOR i:=1 TO fungsi_kendala DO
BEGIN
WRITELN('Mengisi Variabel S',i,':');
FOR j:=1 TO var_basic DO
BEGIN
WRITE('Input Nilai S',i,' kolom ke-',j,' = ');
READLN(Var_Bas[i,j]);
END;
WRITE('Input Nilai Kuantitasnya = ');READLN(Var_Bas[i,j+1]);
END;
index_kuantitas:=j+1;

FOR i:=1 To var_basic DO
BEGIN
Zj[i]:=0;
Cj_Zj[i]:=Cj[i];
END;
END;

var
tombol:char;
BEGIN
Repeat
index_var_koor:=0;
count_iterasi:=1;
INPUT;
Proses;
write('Anda ingin Input Lagi [Y/T] : ');
readln(tombol);
until tombol in ['T','t'];
End.




Lihat dari contoh soal no 1, untuk memasukkan variable, koefisien fungsi objektif, koefisien fungsi kendala. (Lihat tabel simpleks untuk pengisian)

Masukan Jumlah Variabel Non Basic : 3
Input Nilai Variabel X1 = 1
Input Nilai Variabel X2 = 9
Input Nilai Variabel X3 = 1
Masukan Jumlah Fungsi KENDALA : 2
Mengisi Variabel S1:
Input Nilai S1 kolom ke-1 = 1
Input Nilai S1 kolom ke-2 = 2
Input Nilai S1 kolom ke-3 = 3
Input Nilai S1 kolom ke-4 = 1
Input Nilai S1 kolom ke-5 = 0
Input Nilai Kuantitasnya = 9
Mengisi Variabel S2:
Input Nilai S2 kolom ke-1 = 3
Input Nilai S2 kolom ke-2 = 2
Input Nilai S2 kolom ke-3 = 2
Input Nilai S2 kolom ke-4 = 0
Input Nilai S2 kolom ke-5 = 1
Input Nilai Kuantitasnya = 15


Iterasi Tabel Ke-1
=============================================================
Cj 1.00 9.00 1.00 0.00 0.00
VarBsc X1 X2 X3 S1 S2 Kuantitas
-------------------------------------------------------------------------------
S1 1.00 2.00 3.00 1.00 0.00 9.00
S2 3.00 2.00 2.00 0.00 1.00 15.00
-------------------------------------------------------------------------------
Zj 0.00 0.00 0.00 0.00 0.00
Cj-Zj 1.00 9.00 1.00 0.00 0.00
-------------------------------------------------------------------------------
Z 0.00
=============================================================
Press Any keys to continues....!


Iterasi Tabel Ke-2
=============================================================
Cj 1.00 9.00 1.00 0.00 0.00
VarBsc X1 X2 X3 S1 S2 Kuantitas
------------------------------------------------------------------------
S1 0.50 1.00 1.50 0.50 0.00 4.50
S2 2.00 0.00 -1.00 -1.00 1.00 6.00
------------------------------------------------------------------------
Zj 4.50 9.00 13.50 4.50 0.00
Cj-Zj -3.50 0.00 -12.50 -4.50 0.00
------------------------------------------------------------------------
Z 40.50
=============================================================
Press Any keys to continues....!

Hasil Maksimasi Dari Iterasi Ini Adalah :
Hasil X2 = 4.50
Dengan Hasil Keuntungan Maksimal = 40.50
Proses Maksimalisasi Selesai...................
Anda ingin Input Lagi [Y/T] :


Download selengkapnya materi SIMPLEX

Tidak ada komentar:

Posting Komentar