• 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

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

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

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

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

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