• Tidak ada hasil yang ditemukan

Listing Program formmain (Unit1.pas)

N/A
N/A
Protected

Academic year: 2021

Membagikan "Listing Program formmain (Unit1.pas)"

Copied!
36
0
0

Teks penuh

(1)

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);

(2)

{ 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

(3)

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;

(4)

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

(5)

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 tal_alokasi[i][j];

(6)

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

(7)

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

(8)

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 begin

(9)

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; end;

(10)

//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; terkecil[j].bobot:=insertion[x][i].bobot_terbesar;

(11)

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

(12)

//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;

(13)

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); end

(14)

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

(15)

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 begin

(16)

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

(17)

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; rg.Right := Image2.Width;

(18)

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

(19)

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)'; grand_total_alokasi:=0;

(20)

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[4]:=clMoneyGreen;

(21)

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; end;

(22)

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; begin

(23)

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);

(24)

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'; rdoSisiTidak.Checked:=True;

(25)

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

(26)

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 //kosongin tabel

(27)

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[1,byk_input]:=ADOQuery1.FieldByName('nama').AsString;

(28)

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; txtYPredict: TEdit;

(29)

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;

(30)

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); var

(31)

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)- (sigma_x_kecil*sigma_x_kecil)); //sigma_xy/sigma_x_kuadrat;

(32)

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[4,0]:='XY';

(33)

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'); //0

(34)

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;

(35)

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.

(36)

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;

Referensi

Dokumen terkait

Kasus kegagalan dalam penggunaan alat kontrasepsi IUD seperti yang dialami oleh Luluah, secara otomatis bidan sebagai pelaksana pemberian pelayanan terkait

Tujuan penelitian ini yaitu untuk mengetahui efektifitas ekstrak daun patikan kebo (E. hirta) untuk pengobatan ikan nila (O. niloticus) yang diinfeksi bakteri

Cara yang digunakan oleh guru untuk memotivasi siswa agar mereka mau mempelajari matematika tampaknya bergantung pada karakteristik guru yang diantaranya adalah hubungan

Secara umum bayi yang dilahirkan dengan berat badan rendah, mayoritas terjadi pada ibu berusia 20-38 tahun, status pekerjaan tidak bekerja, pendidikan terakhir

2 Keluarga Bapak Nurati merupakan salah satu dari sekian keluarga miskin atau rumah tangga miskin (RTM) yang berada di Desa Manduang. Ia tinggal bersama istri dan satu anak

pendapatan daerah sektor pertanian dan informal masih menyumbang pendapatan terbesar di Provinsi Jawa Tengah padahal dengan tingkat produktifitas sumberdaya manusia

Perkembangan futsal di Indonesia terbilang sangat maju, itu dibuktikan dengan prestasi-prestasi di tingkat Internasional. Namun ekspos terhadap olahraga yang satu ini masih