📄 ga---binaryga.nlogo
字号:
globals [ target ;the target genome
step
census
fitlist ;the fitness list made from the agents
seed-genomes ;the genomes to be assigned to the next generation
fledgling ;genome product of recombination
chosen-size
best-fitness
match
best-genome
avg-fitness ]
turtles-own [genome
fitness ]
to setup
ca
clear-output
ask patch-at 0 0 [set pcolor blue] ;sets center 'target' patch
set seed-genomes []
set best-genome 0
set match 0
create-target
ask turtles [die]
crt population-size
ask turtles [ ;create genomes of appropriate size
set genome list (random 2) (random 2)
repeat target-size - 2 [
set genome lput (random 2) genome
]
]
end
to evolve
compare-genomes ;calculates distance from target genome
display
ask turtles [
jump fitness - target-size ;move distance from target
]
do-plots
no-display
wait 0.05
set fitlist sort fitlist ;puts fitnesses in order
set seed-genomes []
mate-recombine ;takes best animals and creates new genomes
ask turtles [die]
mutate ; adds mutations to new generation
rebirth ; gives genomes to new generation
end
to mate-recombine
locals [ fst ]
set fst 0
set best-fitness max fitlist
set avg-fitness mean values-from turtles [fitness]
while [ length seed-genomes < population-size / 2 ] [ ;takes best 1/2 of genomes
ask turtles [
if (fitness = max fitlist) ;finds best current genome
[ if (length seed-genomes > population-size / 2) [stop] ;when half of population is full, then cull remainder
ifelse (fst = 0 ) ; if your good, let'em know it
[ set seed-genomes lput genome seed-genomes
set best-genome genome
set fst 1] ; add genome to seed-genomes
[ set seed-genomes lput genome seed-genomes ]
die ] ]; die after adding genome, so it won't be chosen again
set fitlist but-last fitlist ] ; go deeper away from high fitness if half of population-seed is not filled
set chosen-size length seed-genomes ; will only allow mating between chosen ones of previous generation (not their offspring)
while [length seed-genomes < population-size] ;fill genome pool with recombined products of chosen matings
[
make-fledgling ;recombine genomes of those who mate
set seed-genomes lput fledgling seed-genomes ;add recombined genomes to pool
]
end
to make-fledgling
locals [husband
wife
choice
bit ]
set fledgling []
set husband item ( random chosen-size ) seed-genomes ;assigns random genome to husband
set wife husband ;sets wife to husband, to get into while statement below
ifelse (item 0 seed-genomes = item 1 seed-genomes) []
[
while [wife = husband ]
[
set wife item ( random length seed-genomes ) seed-genomes
] ;gives wife a new genome
]
set bit 0
repeat target-size [ ;randomly chooses each gene from parent's genomes
set choice random 2 ;choose wife/husband gene to add
ifelse (choice = 1)
[ set fledgling lput item bit wife fledgling ] ;add wife's gene
[ set fledgling lput item bit husband fledgling ] ;add husband's gene
set bit bit + 1
]
end
to mutate
locals [genome-m
bit-m
switch]
set genome-m 0
set bit-m 0
repeat length seed-genomes [ ; scan all genomes
set bit-m 0
repeat target-size [ ; scan all genes
if (random 1000 < mutation-rate * 1000 ) ; change bit if mutation rate threshold is met
[ set switch item bit-m item genome-m seed-genomes
ifelse (switch = 1)
[ set seed-genomes (replace-item genome-m seed-genomes
(replace-item bit-m (item genome-m seed-genomes) 0 )) ]
[ set seed-genomes (replace-item genome-m seed-genomes
(replace-item bit-m (item genome-m seed-genomes) 1 )) ]
]
set bit-m bit-m + 1 ;moves to next bit
]
set genome-m genome-m + 1 ; moves to next genome
]
end
to rebirth
cct population-size [
set genome item 0 seed-genomes
set seed-genomes butfirst seed-genomes
]
; locals [next-contestant]
;; set next-contestant 0
;crt population-size
; repeat population-size [
; ask turtle next-contestant [ ;assigns each new genome
; set genome item next-contestant seed-genomes
; ]
; set next-contestant next-contestant + 1
; ]
end
to compare-genomes
set census 0
repeat population-size [
ask turtle census [
set step 0
set fitness 0
repeat target-size [ ;goes through genome
if ( step < target-size + 1 ) [
if ( item step genome = item step target) ;compares genomes
[set fitness fitness + 1 ]
set step step + 1
]
]
]
set census census + 1
]
set fitlist values-from turtles [fitness] ;makes list of fitness values
set step 0
end
to create-target ;generates target genome
set target list (random 2) (random 2)
repeat target-size - 2 [
set target lput (random 2) target
]
end
to do-plots
set-current-plot "Best-Fitness"
plot best-fitness
set-current-plot "Average Fitness"
plot avg-fitness
end
@#$#@#$#@
GRAPHICS-WINDOW
365
10
769
414
50
50
4.0
1
10
0
0
CC-WINDOW
637
417
768
538
Command Center
BUTTON
6
126
105
174
NIL
setup
NIL
1
T
OBSERVER
BUTTON
109
126
214
174
NIL
evolve
T
1
T
OBSERVER
SLIDER
7
11
356
44
target-size
target-size
2
60
60
1
1
NIL
MONITOR
6
418
633
467
NIL
target
3
1
SLIDER
7
50
357
83
population-size
population-size
0
100
83
1
1
NIL
SLIDER
7
89
356
122
mutation-rate
mutation-rate
0
1
0.042
0.0010
1
NIL
MONITOR
217
126
287
175
NIL
best-fitness
0
1
MONITOR
6
479
632
528
best genome so far
best-genome
3
1
PLOT
5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -