Listing Program formMain (Unit1.pas)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math, ExtCtrls, Menus, Grids, DB, ADODB, Buttons;
type
TformMain = class(TForm) btnCompute: TButton; Image1: TImage; Image2: TImage; Button1: TButton; saveFile: TSaveDialog; MainMenu1: TMainMenu; Input1: TMenuItem;
UpdateInput1: TMenuItem; Exit1: TMenuItem;
Instruction1: TMenuItem; Instruction2: TMenuItem; About1: TMenuItem;
Peramalan1: TMenuItem; RegresiLinear1: TMenuItem; StringGrid1: TStringGrid;
ADOConnection1: TADOConnection; ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery; BitBtn1: TBitBtn; Label1: TLabel;
cboBeamWidth: TComboBox; Label2: TLabel;
cboFilterWidth: TComboBox;
procedure btnComputeClick(Sender: TObject); procedure initialState();
procedure beamSearch();
procedure evaluateInsertion(no_node: integer); procedure evaluateSwap(no_node: integer); procedure FormCreate(Sender: TObject); procedure gambarGrafik();
procedure Button1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Input2Click(Sender: TObject);
procedure UpdateInput1Click(Sender: TObject); procedure RegresiLinear1Click(Sender: TObject); procedure FormActivate(Sender: TObject);
procedure hitungBobot();
procedure Instruction2Click(Sender: TObject); procedure About1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure cboBeamWidthChange(Sender: TObject);
{ Private declarations } public
{ Public declarations } end;
machine = record
banyak_alokasi : integer; //banyak job yang ditaruh pada mesin tersebut
no_alokasi : array [1..10] of integer; //job nomor berapa saja yang dijadwalkan
alokasi_bobot : array [1..10] of real; //bobot dari job yg dijadwalkan yg sudah dikali kekuatan mesin
total_alokasi : real; //total waktu yang diperlukan untuk mesin tersebut
end;
combination = record
dari_job : integer; //no job yang mau dipindah dari_mesin : integer; //dari mesin nomer berapa
ke_job : integer; //ke job mana mau ditukar (khusus swap) ke_mesin :integer; //mau ditaruh ke mesin no berapa
bobot_terbesar : real; //waktu terbesar dari semua mesin total_evaluasi : real; //total waktu dari mesin1,2,3,4 end;
smallest = record
tipe : string; //insertion atau swap bobot : real;
jumlah_bobot : real;
no_node : integer; //diambil dari node keberapa no_kombinasi : integer; //no swap atau kombinasi keberapa end;
bobot_rec= record a : real;
b : real; end;
var
formMain: TformMain; banyak_job : integer; banyak_mesin : integer;
bobot_job : array[1..20] of real;
warna_job : array[1..20] of integer;//warna pilihannya 1,2,3 atau 4 warna
mesin_optimal : array[1..4] of machine; mesin : array[1..10,1..4] of machine;
mesin_cek_flipflop : array [1..3,1..4] of machine; beam_width : integer;
alpha : integer;
mesin_paling_berat : integer;
insertion : array[1..10,1..20] of combination; banyak_insertion : array[1..10] of integer; swap : array[1..10,1..40] of combination; banyak_swap : array[1..10] of integer; terkecil : array[1..10] of smallest; warna : array[1..20] of integer;
persamaan_mesin : array[1..4] of bobot_rec; bmp : TBitmap; //utk gabungin 2 image
uses Unit2, Unit3, Unit4, Unit5;
{$R *.dfm}
function bobot_mesin(no_mesin:integer; bobot:real; no_warnajob:integer):real;
begin
if no_mesin=1 then //SORMZ begin
if warna_job[no_warnajob]>2 then
bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot
else if warna_job[no_warnajob]<=2 then
bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot/2;
end
else if no_mesin=2 then //GTOZ52 begin
if warna_job[no_warnajob]>2 then
bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot
else if warna_job[no_warnajob]<=2 then
bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot/2;
end
else if no_mesin=3 then //GTO 46 begin
bobot_mesin:= persamaan_mesin[no_mesin].a +
persamaan_mesin[no_mesin].b*bobot*(warna_job[no_warnajob]/4); end
else if no_mesin=4 then //MITSUBISHI begin
bobot_mesin:= persamaan_mesin[no_mesin].a + persamaan_mesin[no_mesin].b*bobot;
end; end;
procedure TformMain.initialState(); var
i,j:integer; begin
for i:=1 to banyak_mesin do begin
mesin_optimal[i].banyak_alokasi:=0;//mulai dari index 1 end;
i:=1;
for j:=1 to banyak_job do begin
mesin_optimal[i].no_alokasi[mesin_optimal[i].banyak_alokasi+1]:=j;
mesin_optimal[i].alokasi_bobot[mesin_optimal[i].banyak_alokasi+1]:=bobo t_mesin(i,bobot_job[j],j);
mesin_optimal[i].banyak_alokasi:=mesin_optimal[i].banyak_alokasi+1; i:=i+1;
end;
for i:=1 to banyak_mesin do begin
mesin_optimal[i].total_alokasi:=0;
for j:=1 to mesin_optimal[i].banyak_alokasi do begin
mesin_optimal[i].total_alokasi:=mesin_optimal[i].total_alokasi+mesin_op timal[i].alokasi_bobot[j];
end; end;
for i:=1 to beam_width+alpha do begin
for j:=1 to banyak_mesin do begin
mesin[i][j]:=mesin_optimal[j]; end;
end; end;
procedure TformMain.evaluateInsertion(no_node:integer); var
i,j:integer;
tmp_total_alokasi:array [1..20,1..4] of real; begin
for i:=1 to banyak_insertion[no_node] do begin
for j:=1 to banyak_mesin do begin
if j=insertion[no_node][i].dari_mesin then tmp_total_alokasi[i][j]:=
mesin[no_node][insertion[no_node][i].dari_mesin].total_alokasi -
bobot_mesin(insertion[no_node][i].dari_mesin,bobot_job[insertion[no_nod e][i].dari_job],insertion[no_node][i].dari_job)
else if j=insertion[no_node][i].ke_mesin then tmp_total_alokasi[i][j]:=
mesin[no_node][insertion[no_node][i].ke_mesin].total_alokasi +
bobot_mesin(insertion[no_node][i].ke_mesin,bobot_job[insertion[no_node] [i].dari_job],insertion[no_node][i].dari_job)
else
tmp_total_alokasi[i][j]:=mesin[no_node][j].total_alokasi; end;
//menyimpan nilai bobot terbesar dari suatu insertion
insertion[no_node][i].bobot_terbesar:=tmp_total_alokasi[i][1]; for j:=1 to banyak_mesin do
begin
if insertion[no_node][i].bobot_terbesar < tmp_total_alokasi[i][j] then
begin
insertion[no_node][i].bobot_terbesar := tmp_total_alokasi[i][j]; end;
end;
insertion[no_node][i].total_evaluasi:=0; for j:=1 to banyak_mesin do
begin
insertion[no_node][i].total_evaluasi:=insertion[no_node][i].total_evalu asi+tmp_total_alokasi[i][j];
end; end; end;
procedure TformMain.evaluateSwap(no_node:integer); var
i,j:integer;
tmp_total_alokasi:array [1..40,1..4] of real; begin
for i:=1 to banyak_swap[no_node] do begin
for j:=1 to banyak_mesin do begin
if j=swap[no_node][i].dari_mesin then tmp_total_alokasi[i][j]:=
mesin[no_node][swap[no_node][i].dari_mesin].total_alokasi -
bobot_mesin(swap[no_node][i].dari_mesin,bobot_job[swap[no_node][i].dari _job],swap[no_node][i].dari_job)
+
bobot_mesin(swap[no_node][i].dari_mesin,bobot_job[swap[no_node][i].ke_j ob],swap[no_node][i].ke_job)
else if j=swap[no_node][i].ke_mesin then tmp_total_alokasi[i][j]:=
mesin[no_node][swap[no_node][i].ke_mesin].total_alokasi +
bobot_mesin(swap[no_node][i].ke_mesin,bobot_job[swap[no_node][i].dari_j ob],swap[no_node][i].dari_job)
-
bobot_mesin(swap[no_node][i].ke_mesin,bobot_job[swap[no_node][i].ke_job ],swap[no_node][i].ke_job)
else
tmp_total_alokasi[i][j]:=mesin[no_node][j].total_alokasi; end;
//menyimpan nilai bobot terbesar dari suatu insertion swap[no_node][i].bobot_terbesar:=tmp_total_alokasi[i][1]; for j:=1 to banyak_mesin do
begin
if swap[no_node][i].bobot_terbesar < tmp_total_alokasi[i][j] then begin
swap[no_node][i].bobot_terbesar := tmp_total_alokasi[i][j]; end;
end;
//menyimpan nilai hasil pertambahan bobot2 mesin 1,2,3,4 pd suatu swap
swap[no_node][i].total_evaluasi:=0; for j:=1 to banyak_mesin do
begin
end; end;
end;
function
validSmallest(byk_nil_terkecil:integer;tipe:string;no_node:integer;no_k ombinasi:integer):boolean;
var
i:integer;
if1,if2,if3:boolean; label finish;
begin
for i:=1 to byk_nil_terkecil-1 do begin
if1:=terkecil[i].tipe=tipe;
if2:=terkecil[i].no_node=no_node;
if3:=terkecil[i].no_kombinasi=no_kombinasi;
if if1 and if2 and if3 then begin
validSmallest:=False; goto finish;
end; end;
validSmallest:=True; finish:
end;
function
validNotSame(byk_nil_terkecil:integer;bobot_check:real;jumlah_bobot_che ck:real):boolean;
var
i:integer;
if1,if2:boolean; label finish; begin
if byk_nil_terkecil >= 2 then begin
for i:=1 to byk_nil_terkecil-1 do begin
if1:=terkecil[i].bobot=bobot_check;
if2:=terkecil[i].jumlah_bobot=jumlah_bobot_check; if if1 and if2 then
begin
validNotSame:=False; goto finish;
end; end; end;
validNotSame:=True; finish:
end;
function isFlipFlop():boolean; var
ctr_mesin,ctr_job:integer; label finishz;
begin
for i:=1 to 3 do begin
ctr_mesin:=0;
for j:=1 to banyak_mesin do begin
if
mesin_cek_flipflop[i][j].banyak_alokasi=mesin[1][j].banyak_alokasi then begin
ctr_job:=0;
for k:=1 to mesin[1][j].banyak_alokasi do begin
if
mesin_cek_flipflop[i][j].no_alokasi[k]=mesin[1][j].no_alokasi[k] then begin
ctr_job:=ctr_job+1; end;
end;
if ctr_job=mesin[1][j].banyak_alokasi then begin
ctr_mesin:=ctr_mesin+1; end;
end; end;
if ctr_mesin=banyak_mesin then begin
isFlipFlop:=True; goto finishz; end;
end;
isFlipFlop:=false; finishz:
end;
procedure TformMain.beamSearch(); var
i,j,k,x:integer;
tmp_if,tmp_if2:boolean; jumlah_bobot_terkecil:real; counter:integer;
tmp_total_bobot:real;
tmp_mesin : array[1..10,1..4] of machine; tmp_byk_alokasi:integer;
pertama_kali:boolean; byk_perulangan:integer; flipflop:boolean;
pos_cek_flipflop:integer; label skip,skip2,skip3; begin
counter:=1;
pertama_kali:=True; pos_cek_flipflop:=1;
//init
begin
for j:=1 to banyak_mesin do begin
tmp_mesin[i][j]:=mesin[i][j]; end;
end;
flipflop:=false; //end init
repeat
if pertama_kali=True then byk_perulangan:=beam_width+alpha else byk_perulangan:=beam_width;
if flipflop=True and pertama_kali=false then begin
flipflop:=false;
byk_perulangan:=beam_width+alpha; end
else byk_perulangan:=beam_width;
for x:=1 to byk_perulangan do begin
//kerja mesin yg paling berat mesin_paling_berat:=1;
for i:=1 to banyak_mesin do begin
if mesin[x][i].total_alokasi >
mesin[x][mesin_paling_berat].total_alokasi then begin
mesin_paling_berat:=i; end;
end;
//kombinasi insertion banyak_insertion[x]:=0;
for i:=1 to mesin[x][mesin_paling_berat].banyak_alokasi do begin
for j:=1 to banyak_mesin do begin
//untuk mesin itu sendiri di skip
if j=mesin_paling_berat then goto skip;
insertion[x][banyak_insertion[x]+1].dari_job:=mesin[x][mesin_paling_ber at].no_alokasi[i];
insertion[x][banyak_insertion[x]+1].dari_mesin:=mesin_paling_berat; insertion[x][banyak_insertion[x]+1].ke_mesin:=j;
banyak_insertion[x]:=banyak_insertion[x]+1;
skip: end; end;
evaluateInsertion(x);
//kombinasi swap banyak_swap[x]:=0;
for j:=1 to banyak_mesin do begin
//untuk mesin itu sendiri di skip
if j=mesin_paling_berat then goto skip2;
for k:=1 to mesin[x][j].banyak_alokasi do begin
swap[x][banyak_swap[x]+1].dari_job:=mesin[x][mesin_paling_berat].no_alo kasi[i];
swap[x][banyak_swap[x]+1].ke_job:=mesin[x][j].no_alokasi[k]; swap[x][banyak_swap[x]+1].dari_mesin:=mesin_paling_berat; swap[x][banyak_swap[x]+1].ke_mesin:=j;
banyak_swap[x]:=banyak_swap[x]+1; end;
skip2: end; end;
evaluateSwap(x);
end;//end x:=1 to beam_width
//cari nilai paling kecil if pertama_kali=True then begin
pertama_kali:=False;
//for utk cari terkecil 1,2,3 dst.. for j:=1 to beam_width+alpha do begin
terkecil[j].bobot:=MaxExtended;//di set menjadi nilai terbesar terkecil[j].jumlah_bobot:=MaxExtended;
for i:=1 to banyak_insertion[1] do begin
tmp_if:=terkecil[j].bobot>insertion[1][i].bobot_terbesar; if tmp_if and validSmallest(j,'insertion',1,i) and
validNotSame(j,insertion[1][i].bobot_terbesar,insertion[1][i].total_eva luasi) then
begin
//terkecil[j].tipe:='insertion'; //terkecil[j].no_node:=1;
terkecil[j].bobot:=insertion[1][i].bobot_terbesar; end;
end;
for i:=1 to banyak_swap[1] do begin
tmp_if:=terkecil[j].bobot>swap[1][i].bobot_terbesar; if tmp_if and validSmallest(j,'swap',1,i) and
validNotSame(j,swap[1][i].bobot_terbesar,swap[1][i].total_evaluasi) then
begin
//terkecil[j].tipe:='swap'; //terkecil[j].no_node:=1;
terkecil[j].bobot:=swap[1][i].bobot_terbesar; end;
//dari nilai paling kecil cari total dari mesin1,2,3,4 terkecil for i:=1 to banyak_insertion[1] do
begin
tmp_if:=terkecil[j].jumlah_bobot>insertion[1][i].total_evaluasi; tmp_if2:=insertion[1][i].bobot_terbesar=terkecil[j].bobot;
if tmp_if and validSmallest(j,'insertion',1,i) and tmp_if2 then
begin if
validNotSame(j,terkecil[j].bobot,insertion[1][i].total_evaluasi) then begin
terkecil[j].tipe:='insertion'; terkecil[j].no_node:=1;
terkecil[j].jumlah_bobot:=insertion[1][i].total_evaluasi; terkecil[j].no_kombinasi:=i;
end; end; end;
for i:=1 to banyak_swap[1] do begin
tmp_if:=terkecil[j].jumlah_bobot>swap[1][i].total_evaluasi; tmp_if2:=swap[1][i].bobot_terbesar=terkecil[j].bobot;
if tmp_if and validSmallest(j,'swap',1,i) and tmp_if2 then begin
if validNotSame(j,terkecil[j].bobot,swap[1][i].total_evaluasi) then
begin
terkecil[j].tipe:='swap'; terkecil[j].no_node:=1;
terkecil[j].jumlah_bobot:=swap[1][i].total_evaluasi; terkecil[j].no_kombinasi:=i;
end; end; end;
end;//for j:=1 to beam_width+alpha do end //end dari if pertama_kali=True else//bukan pertama_kali
begin
//for utk cari terkecil 1,2,3 dst.. for j:=1 to byk_perulangan do
begin
terkecil[j].bobot:=MaxExtended;//di set menjadi nilai terbesar terkecil[j].jumlah_bobot:=MaxExtended;
for x:=1 to byk_perulangan do begin
for i:=1 to banyak_insertion[x] do begin
tmp_if:=terkecil[j].bobot>insertion[x][i].bobot_terbesar; if tmp_if and validSmallest(j,'insertion',x,i) and
validNotSame(j,insertion[x][i].bobot_terbesar,insertion[x][i].total_eva luasi) then
begin
//terkecil[j].tipe:='insertion'; //terkecil[j].no_node:=x;
end; end;
for i:=1 to banyak_swap[x] do begin
tmp_if:=terkecil[j].bobot>swap[x][i].bobot_terbesar; if tmp_if and validSmallest(j,'swap',x,i) and
validNotSame(j,swap[x][i].bobot_terbesar,swap[x][i].total_evaluasi) then
begin
//terkecil[j].tipe:='swap'; //terkecil[j].no_node:=x;
terkecil[j].bobot:=swap[x][i].bobot_terbesar; end;
end; end;
//dari nilai paling kecil cari total dari mesin1,2,3,4 terkecil for x:=1 to byk_perulangan do
begin
for i:=1 to banyak_insertion[x] do begin
tmp_if:=terkecil[j].jumlah_bobot>insertion[x][i].total_evaluasi; tmp_if2:=insertion[x][i].bobot_terbesar=terkecil[j].bobot; if tmp_if and validSmallest(j,'insertion',x,i) and tmp_if2 then
begin if
validNotSame(j,terkecil[j].bobot,insertion[x][i].total_evaluasi) then begin
terkecil[j].tipe:='insertion'; terkecil[j].no_node:=x;
terkecil[j].jumlah_bobot:=insertion[x][i].total_evaluasi; terkecil[j].no_kombinasi:=i;
end; end; end;
for i:=1 to banyak_swap[x] do begin
tmp_if:=terkecil[j].jumlah_bobot>swap[x][i].total_evaluasi; tmp_if2:=swap[x][i].bobot_terbesar=terkecil[j].bobot;
if tmp_if and validSmallest(j,'swap',x,i) and tmp_if2 then begin
if
validNotSame(j,terkecil[j].bobot,swap[x][i].total_evaluasi) then begin
terkecil[j].tipe:='swap'; terkecil[j].no_node:=x;
terkecil[j].jumlah_bobot:=swap[x][i].total_evaluasi; terkecil[j].no_kombinasi:=i;
end; end; end; end;
//update mesin nilai2 node lama menjadi nilai2 node baru dengan bobot terkecil
for i:=1 to byk_perulangan do begin
if terkecil[i].tipe='insertion' then begin
for j:=1 to banyak_mesin do begin
if
j=insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_mesin then
begin
//atur alokasi job dan bobot job tmp_byk_alokasi:=0;
tmp_mesin[i][j].total_alokasi:=0;
for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin
if mesin[terkecil[i].no_node][j].no_alokasi[x] <>
insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_job then begin
tmp_byk_alokasi:=tmp_byk_alokasi+1;
tmp_mesin[i][j].no_alokasi[tmp_byk_alokasi]:=mesin[terkecil[i].no_node] [j].no_alokasi[x];
tmp_mesin[i][j].alokasi_bobot[tmp_byk_alokasi]:=mesin[terkecil[i].no_no de][j].alokasi_bobot[x];
tmp_mesin[i][j].total_alokasi:=tmp_mesin[i][j].total_alokasi+tmp_mesin[ i][j].alokasi_bobot[tmp_byk_alokasi];
end; end;
tmp_mesin[i][j].banyak_alokasi:=tmp_byk_alokasi; end
else if
j=insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].ke_mesin then
begin
//copy yg lama
for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin
tmp_mesin[i][j].no_alokasi[x]:=mesin[terkecil[i].no_node][j].no_alokasi [x];
tmp_mesin[i][j].alokasi_bobot[x]:=mesin[terkecil[i].no_node][j].alokasi _bobot[x];
end;
tmp_mesin[i][j].total_alokasi:=mesin[terkecil[i].no_node][j].total_alok asi;
//tambah yg insertion-nya
tmp_mesin[i][j].alokasi_bobot[mesin[terkecil[i].no_node][j].banyak_alok asi+1]:=bobot_mesin(j,bobot_job[insertion[terkecil[i].no_node][terkecil [i].no_kombinasi].dari_job],insertion[terkecil[i].no_node][terkecil[i]. no_kombinasi].dari_job);
tmp_mesin[i][j].banyak_alokasi:=mesin[terkecil[i].no_node][j].banyak_al okasi+1;
tmp_mesin[i][j].total_alokasi:=tmp_mesin[i][j].total_alokasi+tmp_mesin[ i][j].alokasi_bobot[mesin[terkecil[i].no_node][j].banyak_alokasi+1]; end
else begin
//copy aja langsung
for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin
tmp_mesin[i][j].no_alokasi[x]:=mesin[terkecil[i].no_node][j].no_alokasi [x];
tmp_mesin[i][j].alokasi_bobot[x]:=mesin[terkecil[i].no_node][j].alokasi _bobot[x];
end;
tmp_mesin[i][j].banyak_alokasi:=mesin[terkecil[i].no_node][j].banyak_al okasi;
tmp_mesin[i][j].total_alokasi:=mesin[terkecil[i].no_node][j].total_alok asi;
end;
end;//for j:=1 to banyak_mesin do
end //if terkecil[i].tipe='insertion' then else if terkecil[i].tipe='swap' then
begin
for j:=1 to banyak_mesin do begin
tmp_mesin[i][j].total_alokasi:=0; if
j=swap[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_mesin then begin
for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin
if
mesin[terkecil[i].no_node][j].no_alokasi[x]=swap[terkecil[i].no_node][t erkecil[i].no_kombinasi].dari_job then
begin
tmp_mesin[i][j].no_alokasi[x]:=swap[terkecil[i].no_node][terkecil[i].no _kombinasi].ke_job;
tmp_mesin[i][j].alokasi_bobot[x]:=bobot_mesin(j,bobot_job[swap[terkecil [i].no_node][terkecil[i].no_kombinasi].ke_job],swap[terkecil[i].no_node ][terkecil[i].no_kombinasi].ke_job);
else begin
tmp_mesin[i][j].no_alokasi[x]:=mesin[terkecil[i].no_node][j].no_alokasi [x];
tmp_mesin[i][j].alokasi_bobot[x]:=mesin[terkecil[i].no_node][j].alokasi _bobot[x];
end;
tmp_mesin[i][j].total_alokasi:=tmp_mesin[i][j].total_alokasi+tmp_mesin[ i][j].alokasi_bobot[x];
end;
tmp_mesin[i][j].banyak_alokasi:=mesin[terkecil[i].no_node][j].banyak_al okasi;
end
else if
j=swap[terkecil[i].no_node][terkecil[i].no_kombinasi].ke_mesin then begin
for x:=1 to mesin[terkecil[i].no_node][j].banyak_alokasi do begin
if
mesin[terkecil[i].no_node][j].no_alokasi[x]=swap[terkecil[i].no_node][t erkecil[i].no_kombinasi].ke_job then
begin
tmp_mesin[i][j].no_alokasi[x]:=swap[terkecil[i].no_node][terkecil[i].no _kombinasi].dari_job;
tmp_mesin[i][j].alokasi_bobot[x]:=bobot_mesin(j,bobot_job[swap[terkecil [i].no_node][terkecil[i].no_kombinasi].dari_job],swap[terkecil[i].no_no de][terkecil[i].no_kombinasi].dari_job);
end else begin
tmp_mesin[i][j].no_alokasi[x]:=mesin[terkecil[i].no_node][j].no_alokasi [x];
tmp_mesin[i][j].alokasi_bobot[x]:=mesin[terkecil[i].no_node][j].alokasi _bobot[x];
end;
tmp_mesin[i][j].total_alokasi:=tmp_mesin[i][j].total_alokasi+tmp_mesin[ i][j].alokasi_bobot[x];
end;
tmp_mesin[i][j].banyak_alokasi:=mesin[terkecil[i].no_node][j].banyak_al okasi;
end
else begin
//copy aja langsung
begin
tmp_mesin[i][j].no_alokasi[x]:=mesin[terkecil[i].no_node][j].no_alokasi [x];
tmp_mesin[i][j].alokasi_bobot[x]:=mesin[terkecil[i].no_node][j].alokasi _bobot[x];
end;
tmp_mesin[i][j].banyak_alokasi:=mesin[terkecil[i].no_node][j].banyak_al okasi;
tmp_mesin[i][j].total_alokasi:=mesin[terkecil[i].no_node][j].total_alok asi;
end;
end;//for j:=1 to banyak_mesin do end; //else if terkecil[i].tipe='swap' end;
//setelah di taruh di tmp_mesin, pindahin ke mesin for i:=1 to byk_perulangan do
begin
for j:=1 to banyak_mesin do begin
mesin[i][j]:=tmp_mesin[i][j]; end;
end;
//cek apakah hasil terbaru lebih baik daripada hasil lama //hitung total alokasi dari mesin2 yg dianggap optimal tmp_total_bobot:=0;
for i:=1 to banyak_mesin do begin
tmp_total_bobot:=tmp_total_bobot+mesin_optimal[i].total_alokasi; end;
//cari bobot paling besar dari mesin2 yg dianggap optimal mesin_paling_berat:=1;
for i:=1 to banyak_mesin do begin
if mesin_optimal[i].total_alokasi >
mesin_optimal[mesin_paling_berat].total_alokasi then begin
mesin_paling_berat:=i; end;
end;
//cek dari terkecil 1,2 mana yang lebih baik, yg terbaik di ambil sbg solusi optimal sementara
for x:=1 to beam_width do begin
tmp_if:=terkecil[x].bobot <
mesin_optimal[mesin_paling_berat].total_alokasi;
tmp_if2:=terkecil[x].jumlah_bobot < tmp_total_bobot; if tmp_if and tmp_if2 then
begin
mesin_optimal[i]:=tmp_mesin[x][i]; end;
goto skip3; end
else begin
counter:=counter+1; end;
end; skip3:
if counter>5 then begin
flipflop:=isFlipFlop;
//update mesin_cek_flipflop for i:=1 to banyak_mesin do begin
mesin_cek_flipflop[pos_cek_flipflop][i]:=mesin[1][i]; end;
pos_cek_flipflop:=pos_cek_flipflop+1;
if pos_cek_flipflop=4 then pos_cek_flipflop:=1; end;
if flipflop=true then begin
for i:=1 to alpha do begin
for j:=1 to banyak_mesin do begin
mesin[i][j]:=mesin[i+beam_width][j]; end;
end; end;
until counter>(banyak_job*beam_width*30); end;
procedure TformMain.hitungBobot(); var
i:integer; begin
//ambil persamaan regresi dari database utk mesin1,2,3,4 ADOQuery2.Active:=True;
ADOQuery2.Active:=false; ADOQuery2.Active:=true; i:=1;
while ADOQuery2.Eof=False do begin
persamaan_mesin[i].a:=ADOQuery2.FieldByName('a').AsFloat; persamaan_mesin[i].b:=ADOQuery2.FieldByName('b').AsFloat; ADOQuery2.Next;
i:=i+1; end;
//hitung bobot masing2 job, dilihat dr jumlah, ukuran, byk warna, byk sisi
for i:=1 to StringGrid1.RowCount-2 do begin
bobot_job[i]:=strtoint(StringGrid1.Cells[2,i]); //ukuran kertas
if StringGrid1.Cells[3,i]='1/4 A4' then bobot_job[i]:=bobot_job[i]/8
else if StringGrid1.Cells[3,i]='1/2 A4' then bobot_job[i]:=bobot_job[i]/4
else if StringGrid1.Cells[3,i]='A4' then bobot_job[i]:=bobot_job[i]/2
else if StringGrid1.Cells[3,i]='A3' then bobot_job[i]:=bobot_job[i];
//sisi
if StringGrid1.Cells[5,i]='Ya' then bobot_job[i]:=bobot_job[i]*2;
//tampung banyak warna yg dipakai
warna_job[i]:=StrToInt(StringGrid1.Cells[4,i]); end;
end;
procedure TformMain.btnComputeClick(Sender: TObject); begin
//set initialization -BEGIN
banyak_job:=StringGrid1.RowCount-2; banyak_mesin:=4;
beam_width:=strtoint(cbobeamwidth.Text); alpha:=strtoint(cbofilterwidth.Text); //set initialization -END
hitungBobot; initialState; beamSearch; gambarGrafik; end;
procedure TformMain.gambarGrafik(); var
i,j,ctr:integer; pos:TPoint; rg:TRect; lebar:integer; ctr_warna:integer; persatuan:real;
nm_mesin:array [1..4] of string; mesin_paling_berat:integer; grand_total_alokasi:real; begin
//clear image1 rg.Top := 0;
rg.Bottom := Image1.Height; rg.Left := 0;
rg.Right := Image1.Width;
Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.FillRect(rg);
//clear image2 rg.Top := 0;
rg.Bottom := Image2.Height; rg.Left := 0;
Image2.Canvas.Brush.Color := clWhite; Image2.Canvas.FillRect(rg);
//grafik alokasi job rg.Left:=20;
rg.Top:=5; rg.Right:=90; rg.Bottom:=30;
Image1.Canvas.TextOut(rg.Right+20,rg.Top,'Grafik Alokasi Job');
ctr_warna:=1;
//titik jam paling akhir
Image1.Canvas.TextOut(75-58,Image1.Height-25,'Waktu (jam)');
Image1.Canvas.TextOut(Image1.Width-25-3,Image1.Height-25-2,chr(39)); mesin_paling_berat:=1;
for i:=1 to banyak_mesin do begin
if mesin_optimal[i].total_alokasi >
mesin_optimal[mesin_paling_berat].total_alokasi then begin
mesin_paling_berat:=i; end;
end;
Image1.Canvas.TextOut(Image1.Width-25-12,Image1.Height-25+3,format('%4.2f',[mesin_optimal[mesin_paling_berat].total_alokasi])); //titik2 jam dari 1 sampai jam paling akhir
lebar:=Image1.Width-25-3-75;
persatuan:=lebar/Floor(mesin_optimal[mesin_paling_berat].total_alokasi); for i:=1 to Floor(mesin_optimal[mesin_paling_berat].total_alokasi)-1 do
begin
Image1.Canvas.TextOut(75+i*Floor(persatuan),Image1.Height-25-2,chr(39));
Image1.Canvas.TextOut(75+i*Floor(persatuan)-2,Image1.Height-25+3,inttostr(i));
end; //garis X pos.X:=75;
pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos;
Image1.Canvas.LineTo(Image1.Width-25,Image1.Height-25); //garis Y
pos.X:=75;
pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(75,25);
Image1.Canvas.TextOut(75-20,25-15,'Mesin'); //nilai-nilai Y dan nama mesin
nm_mesin[1]:='SORMZ'; nm_mesin[2]:='GTOZ52'; nm_mesin[3]:='GTO46'; nm_mesin[4]:='MIT 1-F4'; for i:=1 to banyak_mesin do begin
Image1.Canvas.TextOut(75-3,Image1.Height-25-i*37,'-');
Image1.Canvas.TextOut(75-70,Image1.Height-25-i*37,nm_mesin[i]); end;
//gambar kotak2
lebar:=Image1.Width-75-30;//lebar yg mungkin mesin_paling_berat:=1;
for i:=1 to banyak_mesin do begin
if mesin_optimal[i].total_alokasi >
mesin_optimal[mesin_paling_berat].total_alokasi then begin
mesin_paling_berat:=i; end;
end;
persatuan:=lebar/mesin_optimal[mesin_paling_berat].total_alokasi;
for i:=1 to banyak_mesin do begin
rg.Left:=75+1;
for j:=1 to mesin_optimal[i].banyak_alokasi do begin
rg.Right:=rg.Left+Floor(mesin_optimal[i].alokasi_bobot[j]*persatuan); rg.Bottom:=Image1.Height-25-18-(i-1)*37;
rg.Top:=Image1.Height-25-42-(i-1)*37;
Image1.Canvas.Brush.Color:=warna[ctr_warna]; ctr_warna:=ctr_warna+1;
Image1.Canvas.Rectangle(rg);
rg.Left:=rg.Left+Floor(mesin_optimal[i].alokasi_bobot[j]*persatuan); end;
end;
//label keterangan rg.Left:=15;
rg.Top:=3; rg.Right:=30; rg.Bottom:=30;
Image2.Canvas.Brush.Color:=clWhite;
Image2.Canvas.TextOut(rg.Right+35,rg.Top,'Keterangan');
//Gambar legend rg.Left:=20; rg.Top:=20; rg.Right:=60; rg.Bottom:=30; ctr:=1;
//set tabel
StringGrid1.ColCount:=8;
StringGrid1.Cells[6,0]:='No Mesin'; StringGrid1.ColWidths[7]:=110;
for i:=1 to banyak_mesin do begin
for j:=1 to mesin_optimal[i].banyak_alokasi do begin
Image2.Canvas.Brush.Color:=warna[ctr]; Image2.Canvas.FillRect(rg);
Image2.Canvas.Brush.Color:=clWhite;
Image2.Canvas.TextOut(rg.Right+20,rg.Top,'Job '+IntToStr(mesin_optimal[i].no_alokasi[j]));
Image2.Canvas.TextOut(rg.Right+55,rg.Top,StringGrid1.Cells[0,mesin_opti mal[i].no_alokasi[j]]);
rg.Top:=rg.Bottom+5; rg.Bottom:=rg.Top+10; ctr:=ctr+1;
//masukin di stringgrid / tabel informasinya
StringGrid1.Cells[6,mesin_optimal[i].no_alokasi[j]]:=inttostr(i);
grand_total_alokasi:=grand_total_alokasi+mesin_optimal[i].alokasi_bobot [j];
StringGrid1.Cells[7,mesin_optimal[i].no_alokasi[j]]:=floattostr(mesin_o ptimal[i].alokasi_bobot[j]);
end; end;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:='Jumlah';
StringGrid1.Cells[7,StringGrid1.RowCount-1]:=floattostr(grand_total_alokasi); //gabung 2 image
bmp:=TBitmap.Create; bmp.Canvas.Create;
bmp.Width:=Image1.Width+Image2.Width; bmp.Height:=Image2.Height;
for i:=0 to Image1.Width-1 do begin
for j:=0 to Image1.Height-1 do begin
bmp.Canvas.Pixels[i,j]:=Image1.Canvas.Pixels[i,j]; end;
end;
for i:=0 to Image2.Width-1 do begin
for j:=0 to Image2.Height-1 do begin
bmp.Canvas.Pixels[i+Image1.Width,j]:=Image2.Canvas.Pixels[i,j]; end;
end; end;
procedure TformMain.FormCreate(Sender: TObject); begin
warna[5]:=clAqua; warna[6]:=clFuchsia; warna[7]:=clBlue; warna[8]:=clYellow; warna[9]:=clLime; warna[10]:=clRed; warna[11]:=clSilver; warna[12]:=clMaroon; warna[13]:=clGreen; warna[14]:=clOlive; warna[15]:=clNavy; warna[16]:=clPurple; warna[17]:=clTeal;
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Pass word="";Data Source='+GetCurrentDir+'\database.mdb;Persist Security Info=True';
stringgrid1.Cells[0,0]:='Kode Job'; stringgrid1.Cells[1,0]:='Nama Pesanan'; stringgrid1.Cells[2,0]:='Jumlah';
stringgrid1.Cells[3,0]:='Ukuran'; stringgrid1.Cells[4,0]:='Warna'; stringgrid1.Cells[5,0]:='Dua sisi'; end;
procedure TformMain.Button1Click(Sender: TObject); var
fileName : String; fileConfirm : Boolean; begin
formMain.saveFile.InitialDir := GetCurrentDir; formMain.saveFile.Filter := 'Bitmap Image|*.bmp|'; fileConfirm := formMain.saveFile.Execute();
if fileConfirm = true then begin
fileName := formMain.saveFile.FileName; bmp.SaveToFile(fileName);
MessageDlg('Grafik sudah disimpan di ' + fileName, mtInformation, [mbOk] ,0);
end; end;
procedure TformMain.Exit1Click(Sender: TObject); begin
Application.Terminate; end;
procedure TformMain.Input2Click(Sender: TObject); begin
formInput.showModal; end;
procedure TformMain.UpdateInput1Click(Sender: TObject); begin
procedure TformMain.RegresiLinear1Click(Sender: TObject); begin
frmRegresi.ShowModal; end;
procedure TformMain.FormActivate(Sender: TObject); begin
ADOQuery1.Active:=false; ADOQuery1.Active:=true; ADOQuery1.First;
banyak_job:=0; baris_pilihan:=-1;
while ADOQuery1.Eof=False do begin
banyak_job:=banyak_job+1;
stringgrid1.Cells[0,banyak_job]:=ADOQuery1.FieldByName('kode').AsString;
stringgrid1.Cells[1,banyak_job]:=ADOQuery1.FieldByName('nama').AsString;
stringgrid1.Cells[2,banyak_job]:=ADOQuery1.FieldByName('jumlah').AsStri ng;
stringgrid1.Cells[3,banyak_job]:=ADOQuery1.FieldByName('ukuran').AsStri ng;
stringgrid1.Cells[4,banyak_job]:=ADOQuery1.FieldByName('warna').AsStrin g;
stringgrid1.Cells[5,banyak_job]:=ADOQuery1.FieldByName('dua_sisi').AsSt ring;
StringGrid1.RowCount:=banyak_job+2; ADOQuery1.Next;
end; end;
procedure TformMain.Instruction2Click(Sender: TObject); begin
frmInstruction.Show; end;
procedure TformMain.About1Click(Sender: TObject); begin
frmAbout.Show; end;
procedure TformMain.BitBtn1Click(Sender: TObject); begin
Application.Terminate; end;
procedure TformMain.cboBeamWidthChange(Sender: TObject); var
cbofilterwidth.Items.Clear;
for i:=1 to strtoint(cbobeamwidth.Text) do begin
cbofilterwidth.Items.Add(inttostr(i)); end;
end;
end.
Listing Program formInput (Unit2.pas)
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ADODB, DB;
type
TformInput = class(TForm) StringGrid1: TStringGrid; GroupBox1: TGroupBox; Label1: TLabel;
txtKode: TEdit; Label2: TLabel; txtNama: TEdit; Label3: TLabel; txtJumlah: TEdit; Label4: TLabel;
cboUkuran: TComboBox; Label5: TLabel;
Label6: TLabel;
rdoSisiYa: TRadioButton; rdoSisiTidak: TRadioButton; cmdAdd: TButton;
cmdUpdate: TButton; cboWarna: TComboBox; cmdEdit: TButton; cmdInsert: TButton; cmdDelete: TButton;
ADOConnection1: TADOConnection; ADOQuery1: TADOQuery;
procedure FormCreate(Sender: TObject); procedure cmdAddClick(Sender: TObject);
procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure cmdInsertClick(Sender: TObject); procedure cmdEditClick(Sender: TObject); procedure cmdDeleteClick(Sender: TObject); procedure cmdUpdateClick(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
formInput: TformInput; byk_input: integer; baris_pilihan:integer; implementation
uses Unit1;
{$R *.dfm}
procedure TformInput.FormCreate(Sender: TObject); begin
stringgrid1.Cells[0,0]:='Kode Job'; stringgrid1.Cells[1,0]:='Nama Pesanan'; stringgrid1.Cells[2,0]:='Jumlah';
stringgrid1.Cells[3,0]:='Ukuran'; stringgrid1.Cells[4,0]:='Warna'; stringgrid1.Cells[5,0]:='Dua sisi'; byk_input:=0;
cmdAdd.Enabled:=false; cmdUpdate.Enabled:=false; cmdEdit.Enabled:=false; cmdDelete.Enabled:=false; baris_pilihan:=-1;
//set koneksi ke database
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Pass word="";Data Source='+GetCurrentDir+'\database.mdb;Persist Security Info=True';
end;
procedure TformInput.cmdAddClick(Sender: TObject); begin
byk_input:=byk_input+1;
stringgrid1.Cells[0,byk_input]:=txtKode.Text; stringgrid1.Cells[1,byk_input]:=txtNama.Text; stringgrid1.Cells[2,byk_input]:=txtJumlah.Text; stringgrid1.Cells[3,byk_input]:=cboUkuran.Text; stringgrid1.Cells[4,byk_input]:=cboWarna.Text; if rdoSisiYa.Checked then
stringgrid1.Cells[5,byk_input]:=rdoSisiYa.Caption else
stringgrid1.Cells[5,byk_input]:=rdoSisiTidak.Caption;
txtKode.Text:=''; txtNama.Text:=''; txtJumlah.Text:='';
cboUkuran.Text:='1/4 A4'; cboWarna.Text:='1';
StringGrid1.RowCount:=byk_input+2;
end;
procedure TformInput.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
baris_pilihan:=ARow; cmdEdit.Enabled:=true; cmdDelete.Enabled:=true; end;
procedure TformInput.cmdInsertClick(Sender: TObject); begin
cmdAdd.Enabled:=true; cmdUpdate.Enabled:=false; end;
procedure TformInput.cmdEditClick(Sender: TObject); begin
if baris_pilihan<>-1 then begin
cmdAdd.Enabled:=false; cmdUpdate.Enabled:=true;
txtKode.Text:=StringGrid1.Cells[0,baris_pilihan]; txtNama.Text:=StringGrid1.Cells[1,baris_pilihan]; txtJumlah.Text:=StringGrid1.Cells[2,baris_pilihan]; cboUkuran.Text:=StringGrid1.Cells[3,baris_pilihan]; cboWarna.Text:=StringGrid1.Cells[4,baris_pilihan]; if StringGrid1.Cells[5,baris_pilihan]='Ya' then rdoSisiYa.Checked:=True
else
rdoSisiTidak.Checked:=True; end
else
MessageDlg('Silahkan pilih baris yang hendak diedit',mtWarning,[mbOK],0);
end;
procedure TformInput.cmdDeleteClick(Sender: TObject); var
i:integer; label
skipthis; begin
if baris_pilihan=StringGrid1.RowCount-1 then begin
MessageDlg('Silahkan pilih baris yang hendak didelete',mtWarning,[mbOK],0);
goto skipthis; end;
if (baris_pilihan<>-1) and (byk_input>0) then begin
for i:=baris_pilihan to StringGrid1.RowCount-1 do begin
StringGrid1.Cells[1,i]:=StringGrid1.Cells[1,i+1]; StringGrid1.Cells[2,i]:=StringGrid1.Cells[2,i+1]; StringGrid1.Cells[3,i]:=StringGrid1.Cells[3,i+1]; StringGrid1.Cells[4,i]:=StringGrid1.Cells[4,i+1]; StringGrid1.Cells[5,i]:=StringGrid1.Cells[5,i+1]; end;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[1,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[2,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[3,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[4,StringGrid1.RowCount-1]:=''; StringGrid1.Cells[5,StringGrid1.RowCount-1]:=''; StringGrid1.RowCount:=StringGrid1.RowCount-1; byk_input:=byk_input-1;
end else
MessageDlg('Silahkan pilih baris yang hendak didelete',mtWarning,[mbOK],0);
baris_pilihan:=-1;
cmdDelete.Enabled:=false; cmdEdit.Enabled:=false; skipthis:
end;
procedure TformInput.cmdUpdateClick(Sender: TObject); begin
stringgrid1.Cells[0,baris_pilihan]:=txtKode.Text; stringgrid1.Cells[1,baris_pilihan]:=txtNama.Text; stringgrid1.Cells[2,baris_pilihan]:=txtJumlah.Text; stringgrid1.Cells[3,baris_pilihan]:=cboUkuran.Text; stringgrid1.Cells[4,baris_pilihan]:=cboWarna.Text; if rdoSisiYa.Checked then
stringgrid1.Cells[5,baris_pilihan]:=rdoSisiYa.Caption else
stringgrid1.Cells[5,baris_pilihan]:=rdoSisiTidak.Caption;
txtKode.Text:=''; txtNama.Text:=''; txtJumlah.Text:='';
cboUkuran.Text:='1/4 A4'; cboWarna.Text:='1';
rdoSisiTidak.Checked:=true;
baris_pilihan:=-1; cmdEdit.Enabled:=false; cmdUpdate.Enabled:=false; cmdDelete.Enabled:=false; end;
procedure TformInput.FormClose(Sender: TObject; var Action: TCloseAction);
var
i:integer;
ya_tidak:String; begin
ADOConnection1.Execute('DELETE FROM jobs WHERE true;'); for i:=1 to byk_input do
begin
if StringGrid1.Cells[5,i]='Ya' then ya_tidak:='Ya'
else
ya_tidak:='Tidak';
ADOConnection1.Execute('INSERT INTO jobs'+ '(kode,nama,jumlah,ukuran,warna,dua_sisi)'+ ' values("'+StringGrid1.Cells[0,i]+'",'+ '"'+StringGrid1.Cells[1,i]+'",'+
StringGrid1.Cells[2,i]+','+ '"'+StringGrid1.Cells[3,i]+'",'+ StringGrid1.Cells[4,i]+','+ '"'+ya_tidak+'");');
end;
formMain.StringGrid1.ColCount:=6;
for i:=1 to formMain.StringGrid1.RowCount do begin
formMain.StringGrid1.Cells[0,i]:=''; formMain.stringgrid1.Cells[1,i]:=''; formMain.stringgrid1.Cells[2,i]:=''; formMain.stringgrid1.Cells[3,i]:=''; formMain.stringgrid1.Cells[4,i]:=''; formMain.stringgrid1.Cells[5,i]:=''; end;
for i:=1 to byk_input do begin
formMain.StringGrid1.Cells[0,i]:=StringGrid1.Cells[0,i]; formMain.stringgrid1.Cells[1,i]:=StringGrid1.Cells[1,i]; formMain.stringgrid1.Cells[2,i]:=StringGrid1.Cells[2,i]; formMain.stringgrid1.Cells[3,i]:=StringGrid1.Cells[3,i]; formMain.stringgrid1.Cells[4,i]:=StringGrid1.Cells[4,i]; formMain.stringgrid1.Cells[5,i]:=StringGrid1.Cells[5,i]; end;
formMain.stringgrid1.RowCount:=StringGrid1.RowCount; end;
procedure TformInput.FormActivate(Sender: TObject); begin
ADOQuery1.Active:=false; ADOQuery1.Active:=true; ADOQuery1.First;
byk_input:=0; baris_pilihan:=-1;
while ADOQuery1.Eof=False do begin
byk_input:=byk_input+1;
stringgrid1.Cells[0,byk_input]:=ADOQuery1.FieldByName('kode').AsString;
stringgrid1.Cells[2,byk_input]:=ADOQuery1.FieldByName('jumlah').AsStrin g;
stringgrid1.Cells[3,byk_input]:=ADOQuery1.FieldByName('ukuran').AsStrin g;
stringgrid1.Cells[4,byk_input]:=ADOQuery1.FieldByName('warna').AsString;
stringgrid1.Cells[5,byk_input]:=ADOQuery1.FieldByName('dua_sisi').AsStr ing;
StringGrid1.RowCount:=byk_input+2;
ADOQuery1.Next; end;
end;
end.
Listing Program frmRegresi (Unit3.pas)
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls, Math, DB, ADODB;
type
TfrmRegresi = class(TForm) Label1: TLabel;
Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Image1: TImage; Button1: TButton; Button2: TButton;
StringGrid1: TStringGrid; txtX: TEdit;
txtY: TEdit; Button3: TButton; txtKorelasi: TEdit; txtRegresi: TEdit; txtKP: TEdit; Button4: TButton; Button5: TButton; Label6: TLabel; cboMesin: TComboBox; Button6: TButton;
ADOConnection1: TADOConnection; Label7: TLabel;
Button7: TButton;
procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure tampilan();
procedure drawGraph(a:real;b:real); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
frmRegresi: TfrmRegresi; var byk_variabel: integer;
var x_besar:array[1..20] of real; var y_besar:array[1..20] of real; var x_kecil:array[1..20] of real; var y_kecil:array[1..20] of real; var x_bar:real;
var y_bar:real;
var x_kuadrat:array[1..20] of real; var y_kuadrat:array[1..20] of real; var xy:array[1..20] of real;
var sigma_x_kecil:real; var sigma_y_kecil:real; var sigma_x_kuadrat:real; var sigma_y_kuadrat:real; var sigma_xy:real;
var r:real; var KP:real; var a,b:real;
var warna:array[1..20] of integer; implementation
uses Types, Unit1;
{$R *.dfm}
procedure TfrmRegresi.Button1Click(Sender: TObject); var
i:integer; tmp:real; begin
tmp:=0;
for i:=1 to byk_variabel do begin
tmp:=tmp+x_besar[i]; end;
tmp:=0;
for i:=1 to byk_variabel do begin
tmp:=tmp+y_besar[i]; end;
y_bar:=tmp/byk_variabel;
sigma_x_kecil:=0;
for i:=1 to byk_variabel do begin
x_kecil[i]:=x_besar[i]-x_bar;
sigma_x_kecil:=sigma_x_kecil+x_kecil[i]; end;
sigma_y_kecil:=0;
for i:=1 to byk_variabel do begin
y_kecil[i]:=y_besar[i]-y_bar;
sigma_y_kecil:=sigma_y_kecil+y_kecil[i]; end;
sigma_x_kuadrat:=0;
for i:=1 to byk_variabel do begin
x_kuadrat[i]:=x_kecil[i]*x_kecil[i];
sigma_x_kuadrat:=sigma_x_kuadrat+x_kuadrat[i]; end;
sigma_y_kuadrat:=0;
for i:=1 to byk_variabel do begin
y_kuadrat[i]:=y_kecil[i]*y_kecil[i];
sigma_y_kuadrat:=sigma_y_kuadrat+y_kuadrat[i]; end;
sigma_xy:=0;
for i:=1 to byk_variabel do begin
xy[i]:=x_kecil[i]*y_kecil[i]; sigma_xy:=sigma_xy+xy[i]; end;
tampilan;
r:=sigma_xy/( Sqrt(sigma_x_kuadrat)*Sqrt(sigma_y_kuadrat) ); //koefisien penentu
KP:=r*r;
txtKorelasi.Text:=format('%7.5f',[r]);//floattostr(r); txtKP.Text:=format('%7.5f',[KP]);//floattostr(KP); end;
i:integer; tmp:real; begin
tmp:=0;
for i:=1 to byk_variabel do begin
tmp:=tmp+x_besar[i]; end;
x_bar:=tmp/byk_variabel;
tmp:=0;
for i:=1 to byk_variabel do begin
tmp:=tmp+y_besar[i]; end;
y_bar:=tmp/byk_variabel;
sigma_x_kecil:=0;
for i:=1 to byk_variabel do begin
x_kecil[i]:=x_besar[i]-x_bar;
sigma_x_kecil:=sigma_x_kecil+x_kecil[i]; end;
sigma_y_kecil:=0;
for i:=1 to byk_variabel do begin
y_kecil[i]:=y_besar[i]-y_bar;
sigma_y_kecil:=sigma_y_kecil+y_kecil[i]; end;
sigma_x_kuadrat:=0;
for i:=1 to byk_variabel do begin
x_kuadrat[i]:=x_kecil[i]*x_kecil[i];
sigma_x_kuadrat:=sigma_x_kuadrat+x_kuadrat[i]; end;
sigma_y_kuadrat:=0;
for i:=1 to byk_variabel do begin
y_kuadrat[i]:=y_kecil[i]*y_kecil[i];
sigma_y_kuadrat:=sigma_y_kuadrat+y_kuadrat[i]; end;
sigma_xy:=0;
for i:=1 to byk_variabel do begin
xy[i]:=x_kecil[i]*y_kecil[i]; sigma_xy:=sigma_xy+xy[i]; end;
tampilan;
a:=y_bar - b*x_bar;
a:=strtofloat(format('%7.5f',[a])); b:=strtofloat(format('%7.5f',[b])); if a>=0 then
txtRegresi.text:= floattostr(a) + ' + ' + floattostr(b) + 'X' else
txtRegresi.text:= floattostr(b) + 'X' + floattostr(a);
//gambar grafik drawGraph(a,b);
button7.Enabled:=true;
end;
procedure TfrmRegresi.Button3Click(Sender: TObject); begin
byk_variabel:=byk_variabel+1;
stringgrid1.Cells[0,byk_variabel]:=txtX.Text; stringgrid1.Cells[1,byk_variabel]:=txtY.Text; x_besar[byk_variabel]:=strtofloat(txtX.Text); y_besar[byk_variabel]:=strtofloat(txtY.Text); txtX.Text:='';
txtY.Text:=''; txtX.SetFocus;
stringgrid1.RowCount:=byk_variabel+2; end;
procedure TfrmRegresi.Button7Click(Sender: TObject); begin
txtypredict.Text:=format('%7.2f',[(a+b*strtofloat(txtxpredict.Text))]); end;
procedure TfrmRegresi.tampilan(); var
i:integer; begin
for i:=1 to byk_variabel do begin
stringgrid1.cells[2,i]:=floattostr(x_kecil[i]); stringgrid1.cells[3,i]:=floattostr(y_kecil[i]); stringgrid1.cells[4,i]:=floattostr(xy[i]);
stringgrid1.cells[5,i]:=floattostr(x_kuadrat[i]); stringgrid1.cells[6,i]:=floattostr(y_kuadrat[i]); end;
end;
procedure TfrmRegresi.FormCreate(Sender: TObject); begin
stringgrid1.Cells[5,0]:='X?; stringgrid1.Cells[6,0]:='Y?; byk_variabel:=0;
//inisialisasi canvas Image1.Canvas.Create;
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Pass word="";Data Source='+GetCurrentDir+'\database.mdb;Persist Security Info=True';
end;
procedure TfrmRegresi.Button4Click(Sender: TObject); var
i:integer; rg : TRect; begin
StringGrid1.RowCount:=2;
for i:=1 to byk_variabel do begin
stringgrid1.Cells[0,i]:=''; stringgrid1.Cells[1,i]:=''; stringgrid1.Cells[2,i]:=''; stringgrid1.Cells[3,i]:=''; stringgrid1.Cells[4,i]:=''; stringgrid1.Cells[5,i]:=''; stringgrid1.Cells[6,i]:=''; end;
byk_variabel:=0; txtKorelasi.Text:=''; txtKP.Text:='';
txtRegresi.Text:=''; //grafik
rg.Top := 0;
rg.Bottom := Image1.Height; rg.Left := 0;
rg.Right := Image1.Width;
Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.FillRect(rg);
end;
procedure TfrmRegresi.drawGraph(a:real;b:real); var
i:integer; pos:TPoint; x,y:integer; begin
Image1.Canvas.TextOut(60,5,'Grafik Persamaan Linear'); //garis Y
pos.X:=25;
pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos; Image1.Canvas.LineTo(25,25);
Image1.Canvas.TextOut(25-8,Image1.Height-25-5,'0'); //nilai-nilai Y
for i:=1 to 10 do begin
Image1.Canvas.TextOut(25-18,Image1.Height-25-i*25,IntToStr(i)); Image1.Canvas.TextOut(25-3,Image1.Height-25-i*25,'-');
end;
//nilai-nilai X for i:=1 to 5 do begin
Image1.Canvas.TextOut(25+i*33,Image1.Height-25-1,chr(39));
Image1.Canvas.TextOut(25+i*33-11,Image1.Height-25+5,IntToStr(i*2000)); end;
//garis X pos.X:=25;
pos.Y:=Image1.Height-25; Image1.Canvas.PenPos:=pos;
Image1.Canvas.LineTo(Image1.Width-25,Image1.Height-25);
Image1.Canvas.TextOut(Image1.Width-25+4,Image1.Height-25-6,'X');
//gambar garis linear fungsinya,titik 0,0 sampai 10.000 pos.X:=25;
pos.Y:=Image1.Height-25-Ceil(a*25); Image1.Canvas.PenPos:=pos;
Image1.Canvas.LineTo(25+5*33,Image1.Height-21-Ceil((a+b*10000)*25)); //titik2
Image1.Canvas.Brush.Color:=clSkyBlue; for i:=1 to byk_variabel do
begin
x:=Round(25+x_besar[i]/2000*33); //OK y:=Image1.Height-20-Ceil(y_besar[i]*25); Image1.Canvas.Ellipse(x-4,y-4,x,y); end;
Image1.Canvas.Brush.Color:=clWhite; end;
procedure TfrmRegresi.Button5Click(Sender: TObject); var
fileConfirm:boolean; fileName:string; begin
formMain.saveFile.InitialDir := GetCurrentDir; formMain.saveFile.Filter := 'Bitmap Image|*.bmp|'; fileConfirm := formMain.saveFile.Execute();
if fileConfirm = true then begin
fileName := formMain.saveFile.FileName; Image1.Picture.SaveToFile(fileName);
MessageDlg('Grafik sudah disimpan di ' + fileName, mtInformation, [mbOk] ,0);
end; end;
begin
if a>=0 then
ADOConnection1.Execute('UPDATE bobot_mesin set
a="'+floatToStr(a)+'", b="'+floatToStr(b)+'",plus_minus="+" where no_mesin="'+cboMesin.Text+'";')
else
ADOConnection1.Execute('UPDATE bobot_mesin set
a="'+floatToStr(a)+'", b="'+floatToStr(b)+'",plus_minus="-" where no_mesin="'+cboMesin.Text+'";');
end;
end.
Listing Program formInstruction (Unit4.pas)
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TfrmInstruction = class(TForm) Memo1: TMemo;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
frmInstruction: TfrmInstruction;
implementation
{$R *.dfm}
procedure TfrmInstruction.BitBtn1Click(Sender: TObject); begin
Close; end;
procedure TfrmInstruction.FormCreate(Sender: TObject); begin
end;
end.
unit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TfrmAbout = class(TForm) Memo1: TMemo;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
frmAbout: TfrmAbout;
implementation
{$R *.dfm}
procedure TfrmAbout.BitBtn1Click(Sender: TObject); begin
Close; end;
procedure TfrmAbout.FormCreate(Sender: TObject); begin
end;