Listing Program formMain (Unit1.pas)

  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

  { 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; //menyimpan nilai hasil pertambahan bobot2 mesin 1,2,3,4 pd suatu
    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 swap[no_node][i].total_evaluasi:=swap[no_node][i].total_evaluasi+tmp_to
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 i:=1 to mesin[x][mesin_paling_berat].banyak_alokasi do

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; end;//for j:=1 to beam_width do end;//else if pertama_kali=false

  //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].no_alokasi[mesin[terkecil[i].no_node][j].banyak_alokasi

  • 1]:=insertion[terkecil[i].no_node][terkecil[i].no_kombinasi].dari_job;
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 for i:=1 to banyak_mesin do

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; StringGrid1.Cells[7,0]:='Waktu Proses (jam)'; 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 Image1.Canvas.Create; Image2.Canvas.Create; warna[1]:=clHighlight; warna[2]:=clInfoBk; warna[3]:=clSkyBlue;

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 formInput.ShowModal;

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 i:integer;

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); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormActivate(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; Label8: TLabel; txtXPredict: TEdit;

  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; procedure TfrmRegresi.Button2Click(Sender: TObject);

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; b:=((byk_variabel*sigma_xy)- (sigma_x_kecil*sigma_y_kecil))/((byk_variabel*sigma_x_kuadrat)-

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[0,0]:='x'; stringgrid1.Cells[1,0]:='y'; stringgrid1.Cells[2,0]:='X'; stringgrid1.Cells[3,0]:='Y';

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-3,25-15,'Y');

  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.

  Listing Program formAbout (Unit5.pas) 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; end.