Flibs'NFarol
Model was written in NetLogo 6.4.0
•
Viewed 906 times
•
Downloaded 145 times
•
Run 0 times
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
Info tab cannot be displayed because of an encoding error
Comments and Questions
Please start the discussion about this model!
(You'll first need to log in.)
Click to Run Model
;; _________________________________________________________________________________________________________________ ;; ;; -------------------- FlibsN'Farol --------------------------------------------------------- FlibsN'Farol ;; FlibsN'Farol --------------------------------------------------------- FlibsN'Farol ----------------------- ;; _________________________________________________________________________________________________________________ breed [flibs flib] ;; FLiBs (finite living blobs) are the agents of the model: they are structured as ;; finite automata. They have "a finite number of states; an input signal ;; causes it to change automatically from one state to another. The kind of automaton ;; used in a flib also generates signals. Incoming and outgoing signals are represented ;; within the automaton by symbols. When a signal is received, the automaton changes ;; state and emits a second signal" (A. K. Dewdney, 1985) flibs-own [chromosome ;; every flib owns a chromosome, that is a string codifying its state transitions schema state ;; the current inner state of the flib choice ;; choice/prevision expressed by the flib regarding to go or not to go to the bar fitness ;; a measure of flibs' prevision ability to forestall if the bar will be crowded or not ] globals [tot_attend ;; total of attendances during one season to "El Farol" bar (i.e. 100 cycles tournement) sigma_attend ;; an accumulator for the previous variable crowded ;; a switch recording the state of the bar: 1 if overcrowded, 0 if not lorenz-points ;; list of the Lorenz curve ordinates gini-index-reserve;; counter functional to the calculation of the Gini index sigma-gini ;; an accumulator for the previous variable diversity ;; the number of the different chromosomes in the flibs population sigma_divers ;; an accumulator for the previous variable best ;; the best flibs fitness value worst ;; the worst flibs fitness value donor ;; one of best-performing flibs sharing part of its genes recipient ;; one flib acquiring genes from the donor flib a-split ;; the first cut in the recipient's chromosome b-split ;; the second cut in the recipient's chromosome locus ;; pointer/counter of chromosome loci ] ;; ---------- SETUP PROCEDURES ---------------------------------------------------------------------------------- ;; ------------------------------------------------------------------------------------------------------------------ to setup ;; initializing the model clear-all ;; create the bar area (yellow) and an elsewhere (blue) ask patches [set pcolor blue - 3] ask patches with [abs pxcor < 10 and abs pycor < 7] [set pcolor yellow] ask patches with [pxcor = 9 and pycor = 7] [set plabel ["El Farol Bar"]] ask patches with [pxcor = 21 and pycor = -21] [set plabel ["Elsewhere"]] ;; create the flibs and give them a random chromosome ask n-of num-flibs patches [sprout-flibs 1 [ set shape "flib" set color white set size 1.2 set chromosome "" ] ] set locus 0 ask flibs [chromosome-genesis] reset-ticks end ;; Chromosomes are strings randomly built through an iterative procedure. The content of even string positions ;; are 1 or 0: they are the flib's outgoing signals representing respectively the intention to go or not to go ;; to the bar. Odd string positions are occupied by the numerical code of one state. to chromosome-genesis set chromosome word chromosome (word (random 2) (random num-states)) set locus locus + 1 if locus < num-states * 2 [chromosome-genesis] set locus 0 end ;; ---------- RUNTIME PROCEDURES -------------------------------------------------------------------------------- ;; ------------------------------------------------------------------------------------------------------------------ to go set tot_attend 0 ask flibs [set fitness 0 set state 0] repeat 100 [el-farol] ;; a 100 cycles tournament could be seen as a season to "El Farol" bar (i.e. 100 evenings) if sum [fitness] of flibs = 0 [ ;; no fitness no progress show "fitness null for every flibs" stop ] analyse ;; some relevant "El Farol" seasonal results are picked and processed ask flibs [move] ;; the world displays a snapshot of the bar after the last evening of the season ;; after every season, one breeding and one mutational event occurs if best > worst [ if selective_reproduction = "by cloning" [cloning] if selective_reproduction = "by conjugation" [conjugation] ] ask one-of flibs [mutate] tick end ;; Operator 1: A SEASON TO EL FAROL BAR ;; ------------------------------------------------------------------------------------------------------------------- to el-farol let attendance 0 ;; the variable records the fraction of agents attending the bar during one evening flibs-behaviour ;; bar attendance is the sum of every flibs' choices set attendance sum [choice] of flibs / num-flibs ;; comparing the attendance and the threshold value, the (over)crowded state of the bar is determined if attendance >= threshold [set crowded 1 ;; if the bar is crowded, reward the flibs that are elsewhere ask flibs with [choice = 0] [set fitness fitness + 1] ] if attendance < threshold [set crowded 0 ;; if the bar is not crowded, reward the flibs that are attending ask flibs with [choice = 1] [set fitness fitness + 1] ] set tot_attend tot_attend + attendance ;; the results of every evening of a season is added up end to flibs-behaviour ask flibs [ ;; the flibs state is updated set state read-from-string item (4 * state + 2 * crowded + 1) chromosome ;; each flib processes its choice (to go or not to go) set choice read-from-string item (4 * state + 2 * crowded) chromosome ] end to analyse set best max [fitness] of flibs set worst min [fitness] of flibs ask flibs [set color scale-color red fitness 100 0] set sigma_attend sigma_attend + tot_attend / 100 update-lorenz-and-gini diversity-assessment set sigma_divers sigma_divers + diversity end to update-lorenz-and-gini ;; borrowed from Wilensky's model "Wealth Distribution" let sorted-comfort sort [fitness] of flibs let total-comfort sum sorted-comfort let comfort-sum-so-far 0 let index 0 set gini-index-reserve 0 set lorenz-points [] repeat num-flibs [ set comfort-sum-so-far (comfort-sum-so-far + item index sorted-comfort) set lorenz-points lput ((comfort-sum-so-far / total-comfort) * 100) lorenz-points set index (index + 1) set gini-index-reserve gini-index-reserve + (index / num-flibs) - (comfort-sum-so-far / total-comfort) ] set sigma-gini sigma-gini + ((gini-index-reserve / num-flibs) * 2) end to diversity-assessment ;; the value of genomic diversity inside the flibs population is evaluated as the number of different chromosomes let sort-chrom sort [chromosome] of flibs let index 1 set diversity 1 repeat num-flibs - 1 [ if item index sort-chrom != item (index - 1) sort-chrom [set diversity diversity + 1] set index (index + 1) ] end to move ifelse choice = 0 [move-to one-of patches with [pcolor = blue - 3]] [move-to one-of patches with [pcolor = yellow]] end ;; Operator 2: REPRODUCTION ;; ------------------------------------------------------------------------------------------------------------------- to conjugation ;; the conjugation process requires two flibs' chromosomes: the donor and the recipient: ;; just the second one will undergo to hybridization select-flibs ask flib recipient [ genetic-shuffling set fitness 0 ] end to cloning select-flibs ;; the conjugation process requires two flibs' chromosomes: the donor and the recipient ;; the genome of the first one will entirely replace the genome of the second one ask flib recipient [ set chromosome [chromosome] of flib donor set fitness 0 ] end to select-flibs set donor [who] of one-of flibs with [fitness = best] set recipient [who] of one-of flibs if donor = recipient [select-flibs] end to genetic-shuffling ;; a sequence included between two restriction sites (named a-split and b-split) is randomly chosen set a-split random (num-states * 4) set b-split random (num-states * 4) set locus 0 hybridization end to hybridization ;; the chromosome's sequence included between a-split and b-split restriction sites on a random ;; flib is replaced by the corresponding sequence on one of the most performing flibs; ;; chromosomes are treated as circular if a-split < b-split [ set chromosome replace-item (a-split + locus) chromosome (item (a-split + locus) [chromosome] of flib donor) set locus (locus + 1) if locus < b-split - a-split [hybridization] ] if a-split > b-split [ set chromosome replace-item ((a-split + locus) mod (num-states * 4)) chromosome (item ((a-split + locus) mod (num-states * 4)) [chromosome] of flib donor) set locus (locus + 1) if locus < (num-states * 4) - (a-split - b-split) [hybridization] ] set locus 0 end ;; Operator 3: MUTAGENESIS ;; ------------------------------------------------------------------------------------------------------------------- to mutate ;; mutations occur randomly at a given frequency on one locus only let dice random length chromosome let muton read-from-string item dice chromosome ifelse dice mod 2 = 0 [set chromosome replace-item dice chromosome word ((muton + 1) mod 2) ""] [set chromosome replace-item dice chromosome word ((muton + 1) mod num-states) ""] set fitness 0 end ; Copyright 2023 Cosimo Leuci. ; See Info tab for full copyright and license.
There are 25 versions of this model.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Flibs'NFarol.png | preview | preview image | about 1 year ago, by Cosimo Leuci | Download |
READ_ME.txt | data | attachment | about 1 year ago, by Cosimo Leuci | Download |