70 lines
1.5 KiB
Plaintext
70 lines
1.5 KiB
Plaintext
STRING target := "METHINKS IT IS LIKE A WEASEL";
|
|
|
|
PROC fitness = (STRING tstrg)REAL:
|
|
(
|
|
INT sum := 0;
|
|
FOR i FROM LWB tstrg TO UPB tstrg DO
|
|
sum +:= ABS(ABS target[i] - ABS tstrg[i])
|
|
OD;
|
|
# fitness := # 100.0*exp(-sum/10.0)
|
|
);
|
|
|
|
PROC rand char = CHAR:
|
|
(
|
|
#STATIC# []CHAR ucchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
|
|
# rand char := # ucchars[ENTIER (random*UPB ucchars)+1]
|
|
);
|
|
|
|
PROC mutate = (REF STRING kid, parent, REAL mutate rate)VOID:
|
|
(
|
|
FOR i FROM LWB parent TO UPB parent DO
|
|
kid[i] := IF random < mutate rate THEN rand char ELSE parent[i] FI
|
|
OD
|
|
);
|
|
|
|
PROC kewe = ( STRING parent, INT iters, REAL fits, REAL mrate)VOID:
|
|
(
|
|
printf(($"#"4d" fitness: "g(-6,2)"% "g(-6,4)" '"g"'"l$, iters, fits, mrate, parent))
|
|
);
|
|
|
|
PROC evolve = VOID:
|
|
(
|
|
FLEX[UPB target]CHAR parent;
|
|
REAL fits;
|
|
[100]FLEX[UPB target]CHAR kid;
|
|
INT iters := 0;
|
|
kid[LWB kid] := LOC[UPB target]CHAR;
|
|
REAL mutate rate = 0.05;
|
|
|
|
# initialize #
|
|
FOR i FROM LWB parent TO UPB parent DO
|
|
parent[i] := rand char
|
|
OD;
|
|
|
|
fits := fitness(parent);
|
|
WHILE
|
|
INT j;
|
|
REAL kf;
|
|
FOR j FROM LWB kid TO UPB kid DO
|
|
mutate(kid[j], parent, mutate rate)
|
|
OD;
|
|
FOR j FROM LWB kid TO UPB kid DO
|
|
kf := fitness(kid[j]);
|
|
IF fits < kf THEN
|
|
fits := kf;
|
|
parent := kid[j]
|
|
FI
|
|
OD;
|
|
fits < 100.0
|
|
DO
|
|
kewe( parent, iters, fits, mutate rate );
|
|
iters+:=1
|
|
OD;
|
|
kewe( parent, iters, fits, mutate rate )
|
|
);
|
|
|
|
main:
|
|
(
|
|
evolve
|
|
)
|