Vous êtes sur la page 1sur 10

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

{$R-}

Halaman1dari10

PROGRAM genetic_algorithm_demo_one_dimensional (input,output);


{ program to demonstrate the operation of a genetic algorithm. From randomly generated population of real numbers, attempts to find a number arbitrarily close to a goal real number.
Calling convention: gademo <k> <g> <e> <m> <c> <t> <i> OR gademo Calling k = g = e = without parameters, user will be prompted for values. carrying capacity, integer such that 1 <= k <= 1000 goal value, an arbitrary real number error level, integer value, the larger the number, the less error is tolerated m,c,t = real values between 0 and 1 which give the probability of the normal operation occurring, where m is the probability that mutation will not occur c is the probability that crossover will occur and not inversion t is the probability that transcription will not occur i is an integer iteration factor Copyright 1990 by Wesley R. Elsberry. USES dos, crt; CONST cr = ^M; lf = ^J; TYPE command_string_ = string[127]; param_array_ = array[1..9] of command_string_; param_rec_ = RECORD k : integer; g : real; e : integer; m : real; c : real; t : real; i : integer; END; VAR trr, tss tii, tjj tinch toutf paramstrings params All rights reserved. }

: : : : : :

real; {variables used in testing of the code} integer; {ditto} char; text; param_array_; param_rec_;

PROCEDURE wait;
BEGIN tinch := readkey; END;

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman2dari10

PROCEDURE demo;
CONST max_k = 999; mach_inf = 1E37; (* k = 49; goal = 3.141592653589793; error_level = 4096; mutation_threshold = 0.7; cross2invers = 0.7; transcribe = 0.7; debug : boolean = FALSE; TYPE byte_map_ population_ out_rec_

{carrying capacity - 1} {smaller carrying capacity = faster generations} {the value to strive for} {goal is arbitrary, change to whatever you like} {inverse of amount of error allowed in goal completion} {probability that chromosome will not undergo mutation} {probability that reproduction method will be crossover as opposed to inversion} {1 - probability that transcription occurs} *)

= array[0..5] of byte; = array[0..max_k] of real; = RECORD s : string[80]; END;

{structure to allow bit manipulation of real} {structure to hold the candidates}

VAR k goal error_level mutation_threshold cross2invers transcribe generation_number max_generations pop sel_dist how_far success, finish close_enough ii, jj how_close outf inch raoutf tstr1, tstr2 str1 fom

: : : : : : : : : : : : : : : : : : : : :

integer; real; integer; real; real; real; integer; real; population_; array[0..max_k] of real;

{count of generations} {frustration capacity} {current candidates} {probability of each candidate to reproduce one time} array[0..max_k] of real; {distance of candidate from goal} boolean; real; {range about goal that fulfills the requirements} integer; real; text; char; file of out_rec_; out_rec_; string[80]; real; {Figure Of Merit: Improvement over average random search}

PROCEDURE initialize;
VAR ii, jj : integer; rr, ss : real; BEGIN k goal error_level mutation_threshold cross2invers transcribe generation_number success close_enough

:= := := := := := := := :=

params.k - 1; {adjust for base zero} params.g; params.e; params.m; params.c; params.t; 1; false; goal / error_level;

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman3dari10

rr := error_level; FOR jj := 1 TO 9 DO rr := rr * 2; {have to match sign and exponent bits as well} max_generations := rr / (k+1) / 2.0; writeln('Maximum # of generations = ',max_generations:8:3); {k is base zero; average random search will find in n/2 experiments} randomize; END;

PROCEDURE generate_starting_population; {got to start somewhere}


VAR ii, jj, kk, ll : integer; rr, ss : real; BEGIN FOR jj := 0 TO k DO {for each candidate} BEGIN {value of candidate to be spread over several orders of magnitude} kk := random(37); rr := 1; FOR ii := 1 TO kk DO rr := rr * 10; ll := random(2); IF ll = 0 THEN ss := -1.0 ELSE ss := 1.0; pop[jj] := random * rr * ss; END; END;

FUNCTION distance (spot : integer): real;


VAR ii : integer; rr : real; BEGIN distance := abs(goal - pop[spot]);

END; FUNCTION min_distance : real;


VAR ii : integer; rr : real; BEGIN rr := mach_inf; FOR ii := 0 TO k DO BEGIN IF how_far[ii] < rr THEN rr := how_far[ii]; END; min_distance := rr; END;

FUNCTION done: boolean;


BEGIN success := false; done := false; how_close := min_distance; IF how_close <= close_enough THEN success := true; {success!} IF (generation_number >= max_generations) THEN done := true; {failure :( } IF success THEN done := true; END;

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman4dari10

PROCEDURE generate_selectionist_distribution;
VAR sum_distance : real; ii, jj : integer; dist : real; BEGIN sum_distance := 0.0; FOR ii := 0 TO k DO BEGIN dist := ln(distance(ii)); sel_dist[ii] := 1- (1 /(1+exp(- dist))); sum_distance := sum_distance + sel_dist[ii]; END; IF debug THEN writeln('Population: Selectionist Distribution: '); FOR ii := 0 TO k DO BEGIN sel_dist[ii] := sel_dist[ii] / sum_distance; IF debug THEN writeln(pop[ii]:12:6,' ',sel_dist[ii]:12:6); END; IF debug THEN writeln; END;

PROCEDURE evaluate_population;
VAR ii : integer; rr : real; BEGIN FOR ii := 0 TO k DO how_far[ii] := distance(ii);

END; PROCEDURE generate_new_population;


VAR new_pop ogive1, ogive2 ii, jj p1, p2 pr1, pr2 finished : : : : : : population_; real; integer; integer; real; boolean;

FUNCTION find_parent(prob : real) : integer;


VAR ii : integer; parent : integer; so_far : real; found : boolean; BEGIN so_far := 0.0; found := false; ii := 0; WHILE not found DO BEGIN so_far := so_far + sel_dist[ii]; IF (prob <= so_far) THEN BEGIN found := true; parent := ii; END; ii := ii + 1; END; find_parent := parent; END;

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman5dari10

FUNCTION generate_offspring(par1, par2 : real): real;


CONST bits : array[0..7] of byte = (1,2,4,8,16,32,64,128); bit7=128; bit6=64; bit5=32; bit4=16; bit3=8; bit2=4; bit1=2; bit0=1; TYPE allele_ = 0..1; {will have binary values} chromosome_ = array[0..47] of allele_; {48 bit positions total} VAR c1, c2, c3, cz : chromosome_; rr : real;

PROCEDURE print_genotype(gene : chromosome_);


VAR ii, jj : integer; BEGIN IF FALSE THEN BEGIN FOR ii := 0 TO 47 DO write(gene[ii]:1); writeln; END; END;

PROCEDURE phenotype_to_genotype( parent VAR gene


VAR ii, gptr : integer; b1 : byte_map_ absolute BEGIN gptr := 0; FOR ii := 0 TO 5 DO BEGIN IF ((b1[ii] and bit7) >= 1) IF ((b1[ii] and bit6) >= 1) IF ((b1[ii] and bit5) >= 1) IF ((b1[ii] and bit4) >= 1) IF ((b1[ii] and bit3) >= 1) IF ((b1[ii] and bit2) >= 1) IF ((b1[ii] and bit1) >= 1) IF ((b1[ii] and bit0) >= 1) gptr := gptr + 8; END; END; parent;

: real; : chromosome_);

THEN THEN THEN THEN THEN THEN THEN THEN

gene[gptr] gene[gptr+1] gene[gptr+2] gene[gptr+3] gene[gptr+4] gene[gptr+5] gene[gptr+6] gene[gptr+7]

:= := := := := := := :=

1 1 1 1 1 1 1 1

ELSE ELSE ELSE ELSE ELSE ELSE ELSE ELSE

gene[gptr] gene[gptr+1] gene[gptr+2] gene[gptr+3] gene[gptr+4] gene[gptr+5] gene[gptr+6] gene[gptr+7]

:= := := := := := := :=

0; 0; 0; 0; 0; 0; 0; 0;

PROCEDURE genotype_to_phenotype( VAR parent gene


VAR bptr, gptr : integer; br : real; b1 : byte_map_ absolute BEGIN gptr := 0; FOR bptr := 0 TO 5 DO BEGIN b1[bptr] := (gene[gptr] * bit7) (gene[gptr+2] * bit5) (gene[gptr+4] * bit3) (gene[gptr+6] * bit1) gptr := gptr + 8; END; parent := br; END;

: real; : chromosome_);

br;

+ + + +

(gene[gptr+1] (gene[gptr+3] (gene[gptr+5] (gene[gptr+7]

* * * *

bit6) + bit4) + bit2) + bit0);

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman6dari10

PROCEDURE crossover(

gene1, gene2 : chromosome_; VAR zygote : chromosome_; start, length : integer);

VAR ii, split, jj : integer; BEGIN zygote := gene1; FOR ii := start TO (start + length) DO BEGIN jj := ii mod 48; zygote [jj] := gene2 [jj]; END; END;

PROCEDURE inversion (

gene1, gene2 : chromosome_; VAR zygote : chromosome_; start, length : integer);

VAR ii, split, jj, kk : integer; BEGIN zygote := gene1; jj := length + 48; FOR ii := start TO (start + length) DO BEGIN zygote [jj mod 48] := gene2 [ii mod 48]; jj := jj - 1; END; END;

PROCEDURE mutation (
VAR ii : integer; BEGIN IF gene1[position] > 0 THEN gene1[position] := 0 ELSE gene1[position] := 1; END;

VAR gene1 position

: chromosome_; : integer);

PROCEDURE transcription( gene1, gene2 VAR zygote start, length


VAR ii, jj : integer; ctmp : chromosome_; BEGIN ii := random(48); FOR jj := start TO (start + length) DO BEGIN ctmp[jj mod 48] := gene2[ii mod 48]; ii := ii + 1; END; IF random <= cross2invers THEN crossover(gene1,ctmp,zygote,start,length) ELSE inversion(gene1,ctmp,zygote,start,length); END;

: chromosome_; : chromosome_; : integer);

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman7dari10

BEGIN {generate_offspring}
{have not yet included transcription} phenotype_to_genotype(par1,c1); phenotype_to_genotype(par2,c2); rr := random; IF (rr > mutation_threshold) THEN mutation(c1,random(48)); rr := random; IF (rr > mutation_threshold) THEN mutation(c2,random(48)); rr := random; IF (rr > transcribe) THEN BEGIN phenotype_to_genotype(pop[random(k+1)],c3); rr := random(2); IF (rr = 0) THEN transcription(c1,c3,c1,random(48),random(24)) ELSE transcription(c2,c3,c2,random(48),random(24)); END; rr := random; IF (rr > cross2invers) THEN inversion(c1, c2, cz, random(48), random(48)) ELSE crossover(c1, c2, cz, random(48), random(48)); print_genotype(c1); print_genotype(c2); print_genotype(cz); genotype_to_phenotype(rr, cz); generate_offspring := rr;

END; {generate_offspring}

BEGIN {generate_new_population}
{ writeln('New population made by: ');} FOR ii := 0 TO k DO BEGIN finished := false; jj := 0; p1 := find_parent(random); p2 := find_parent(random); pr1 := pop[p1]; pr2 := pop[p2]; IF debug THEN write(pr1:8:5,' x ',pr2:8:5); new_pop[ii] := generate_offspring(pr1,pr2); IF debug THEN writeln(' = ',new_pop[ii]:8:5); END; IF debug THEN writeln; pop := new_pop;

END; {generate_new_population}

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman8dari10

PROCEDURE report;
{give out lines that indicate population distribution} VAR ii, jj : integer; ss : real; fdist : array[-38..38] of integer;

FUNCTION order_of_magnitude(rr : real): integer;


CONST ln2log = 0.4342944819; VAR ii : integer; BEGIN IF (rr <= 0.0) THEN ii := 0 ELSE ii := round(ln2log * ln(rr)); IF ii < -38 THEN ii := -38; IF ii > 38 THEN ii := 38; order_of_magnitude := ii; END;

FUNCTION signum(rr : real): integer;


BEGIN IF (rr >= 0) THEN signum := 1 ELSE signum := -1; END;

BEGIN {report}
fillchar(fdist,sizeof(fdist),0); (* FOR ii := 0 TO k DO BEGIN jj := signum(pop[ii])*order_of_magnitude(abs(pop[ii])); writeln(jj); fdist[jj] := fdist[jj] + 1; END; *) { IF ((generation_number mod 10) = 0) THEN writeln('Generation ',generation_number);} FOR ii := -38 TO 38 DO BEGIN IF debug THEN BEGIN IF fdist[ii] < 1 THEN write('_') ELSE IF fdist[ii] > 9 THEN write('^') ELSE write(fdist[ii]:1); END; END; IF debug THEN BEGIN writeln; writeln('0 E1 writeln; END;

E38');

END; {report}
www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman9dari10

BEGIN {demo}
initialize; generate_starting_population; REPEAT evaluate_population; generate_selectionist_distribution; finish := done; IF not finish THEN BEGIN generate_new_population; report; writeln('Within ',(how_close/goal*100):8:5, '% of goal condition in generation ',generation_number); generation_number := generation_number + 1; END; UNTIL (finish); {$I-} assign(raoutf,'garesult.dat'); reset(raoutf); CASE IOResult OF $02 : BEGIN Assign(RaOutF,'GARESULT.DAT'); Rewrite(RaOutF); END; END; {$I+} seek(raoutf,filesize(raoutf)); {go to end of file} fillchar(tstr1,sizeof(tstr1),' '); fom := max_generations / generation_number; str((k+1),str1); tstr1.s := 'K:' + str1; str(goal:12:8,str1); tstr1.s := tstr1.s + ' G:' + str1; str(error_level,str1); tstr1.s := tstr1.s + ' E:' + str1; str(mutation_threshold:5:3,str1); tstr1.s := tstr1.s + ' M:' + str1; str(cross2invers:5:3,str1); tstr1.s := tstr1.s + ' CI:' + str1; str(transcribe:5:3,str1); tstr1.s := tstr1.s + ' T:' + str1; str(fom:8:3,str1); tstr1.s := tstr1.s + ' FOM:' + str1; tstr1.s[79] := CR; tstr1.s[80] := LF; write(raoutf,tstr1); writeln(tstr1.s); fillchar(tstr1,sizeof(tstr1),' '); IF success THEN BEGIN tstr1.s := 'Achieved goal in generation '; str(generation_number:6,str1); tstr1.s := tstr1.s + str1; tstr1.s[79] := CR; tstr1.s[80] := LF; write(raoutf,tstr1); writeln(tstr1.s); END ELSE BEGIN tstr1.s := 'No better than ave. random search '; str(max_generations:16:0,str1); tstr1.s := tstr1.s + str1; write(raoutf,tstr1); writeln(tstr1.s); END; close(raoutf);

END; {demo}
www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

ContohProgramAlgoritmaGenetikauntukMenebakSebuahBilanganReal

Halaman10dari10

BEGIN {main program}


IF paramcount > 0 THEN BEGIN WITH params DO BEGIN val(paramstr(1),k,tii); val(paramstr(2),g,tii); val(paramstr(3),e,tii); val(paramstr(4),m,tii); val(paramstr(5),c,tii); val(paramstr(6),t,tii); val(paramstr(7),i,tii); END; END ELSE BEGIN WITH params DO BEGIN writeln; REPEAT write('Enter carrying capacity (1 <= k <= 1000) : '); readln(k); UNTIL (k >= 1) and (k <= 1000); REPEAT write('Enter goal value (real number) : '); readln(g); UNTIL true; REPEAT write('Enter error level (larger = less error) : '); readln(e); UNTIL (e > 0) and (e <= 32501); REPEAT write('Enter mutation threshold : '); readln(m); UNTIL (m > 0.0) and (m <= 1.0); REPEAT write('Enter crossover/inversion ratio : '); readln(c); UNTIL (c > 0.0) and (c <= 1.0); REPEAT write('Enter transcription threshold : '); readln(t); UNTIL (t > 0.0) and (t <= 1.0); REPEAT write('Enter number of experiments : '); readln(i); UNTIL (i > 0) and (i < 101); END; END; FOR tjj := 1 TO params.i DO BEGIN demo; END;

END. {main program}

www.hansmichael.comMateriKuliah#8AlgoritmaGenetika(Edisi16Juli2007)I3Surabaya

Vous aimerez peut-être aussi