• Tidak ada hasil yang ditemukan

Listing Program formMain (Unit1.pas)

N/A
N/A
Protected

Academic year: 2019

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;

(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

(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

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

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

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

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

(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

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

(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

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

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

(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

(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

(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

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

(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';

(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

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

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

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

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

(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

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

(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

Alhamdulillahirabbil’alamin, segala puji syukur penulis panjatkan kehadirat Allah SWT tuhan seru sekalian alam yang telah melimpahkan rahmat dan karunia-Nya

Munculnya medan listrik radial ini sangat boleh jadi disebabkan tat kala pembawa-pembawa muatan (arus listrik) tertarik oleh gaya magnetik ke arah pusat konduktor

40 menit Demonstrasi Cart Parttitur Ped drum Rudimen Ludwig PENYAJIAN (INTI) Tatap muka 15 Memainkan lagu : - Daerah Nusantara - Populer 100 menit Ceramah Diskusi

Kerinci Penyediaan jasa komunikasi, sumber daya air

- Sedapat mungkin melakukan komunikasi aktif dengan Masyarakat Desa untuk bersama-sama melestarikan kawasan hutan alam bernilai konservasi tinggi. - Perlu diadakan rapat

Sanggahan t ert ulis dit ujukan kepada Panit ia Pengadaan Barang / jasa Badan Ket ahanan Pangan dan Pelaksana penyuluhan Kot a Bandar Lam pung paling lam bat Hari jum 'at Tanggal 17

Bacalah berbagai literatur lainnya tentang karakteristik peserta didik SD dan prinsip- prinsip pembelajaran yang mendidik dan tuliskan hal-hal yang sulit dipahami dan tidak dibahas

a) Hasil evaluasi yang mengindikasikan pekerjaan tidak dapat dilaksanakan dengan harga yang ditawarkan, karena penawar akan menderita kerugian yang lebih