[REBOL] Re: Artificial Life in Rebol ?
From: greggirwin:mindspring at: 27-Dec-2002 14:48
Hi pat665,
p> Is Rebol used in Articial Life?
p> I don't remind seing even a simple "Game Of Life" programmed in Rebol.
p> I would be interesed if anyone know a "must have" book on that matter,
p> or can point me to a good place on internet to start with.
At the end of this message is a very simple, incomplete, first-whack
I did some time back at Conway's Game of Life. As far as books, I'm
not sure about "must have" titles, but I have a couple here I like:
'Creating Artificial Life' by Edward Rietman
'Artificial Life Lab' by Rudy Rucker
'Turtles, Termites, and Traffic Jams' by Mitchel Resnick
I have O'Reilly's 'Beginning Perl for Bioinformatics' by James
Tisdall, which I got with the intent of seeing how REBOL could be
applied, but haven't had any time to pursue it yet.
REBOL should be great for creating genetic algorithms because of its
dynamic nature and code/data duality. E.g. you could generate a
specification that included not only the executable code, but the
metadata that you could access reflectively for future mutation
generation, etc.
-- Gregg
REBOL [
Title: {Conway's Game of Life}
Author: "Gregg Irwin"
Email: [greggirwin--acm--org]
Version: 0.0.1
Date: 11-Mar-2002
Notes: {
Only side edges wrap. Top and bottom should as well.
It's very slow. I used images, rather than a separate
data structure, so there may be a lot of room to speed
things up. Larger images slow it down substantially.
Should add some standard patterns to load as seeds.
}
]
get-pix: func [img [image!] loc [pair!]] [
pick img 1 + ((loc/y - 1) * img/size/x) + ((loc/x - 1) // img/size/x)
]
set-pix: func [img [image!] loc [pair!] value [tuple!]] [
poke img 1 + ((loc/y - 1) * img/size/x) + ((loc/x - 1) // img/size/x) value
]
config: [
img-size 32x24 ; this is our data-set image
; (128x96 64x48 32x24 16x12)
view-size 256x192 ; how big is the viewer (256x192 512x384)
grid-size 0x0
]
config/grid-size: divide config/view-size config/img-size
neighbors: [-1x0 -1x-1 0x-1 1x-1 1x0 1x1 0x1 -1x1]
on-color: white
off-color: black
on-ct: 0
cell: 0x0
img: make image! config/img-size
alt-img: copy img
do-gen: func [img alt-img] [
repeat row img/size/y [
repeat col img/size/x [
cell: to-pair reduce [col row]
foreach offset neighbors [
if on-color = get-pix img cell + offset [on-ct: add on-ct 1]
]
either off-color = get-pix img cell [
set-pix alt-img cell either on-ct = 3 [on-color][off-color]
][
set-pix alt-img cell either any [on-ct = 2 on-ct = 3][on-color][off-color]
]
on-ct: 0
]
;world/effect: compose [
; fit grid (config/grid-size) emboss
; gradcol (random 255.255.255) (random 255.255.255) first random neighbors
; blur blur blur
;]
]
alt-img
]
view layout [
world: image img config/view-size effect compose/deep [fit grid (config/grid-size)] ;gradcol
(blue) (green)]
return
button "seed" [
random/seed now/precise
repeat i divide length? img 16 [
poke img random divide length? img 4 on-color
]
show world
]
button "go" [
forever [
world/image: do-gen img alt-img
tmp: img img: alt-img alt-img: tmp
show world
wait 0.05
;if equal? img alt-img [
; alert "Done!"
; break
;]
]
]
button "Quit" [quit]
]