(*Windows Free Pascal is developed by dr J.Szymanda under the GPL License*) (*************************************************************************) PROGRAM genetischer_algorithmus (output); (******************************************************************) (* Paul Koop M.A. genetischer Algorithmus *) (* Der Algorithmus optimiert die weider (froesche) *) (* Die Simulation wurde ursprunglich entwickelt, *) (* um die Verwendbarkeit von genetischen Algorithmen *) (* fuer die Algorithmisch Rekursive Sequanzanalyse *) (* zu ueberpruefen *) (* Modellcharakter hat allein der Quelltext. Eine Compilierung *) (* dient nur als Falsifikationsversuch *) (******************************************************************) USES dos,crt; (*----------------------- Const Definitionen ----------*) CONST Fn = 1; (* gen nahrung *) Fg = 2; (* gen gefahr *) Rn = 3; (* gen fressen *) Rg = 4; (* gen verteidigung *) Fk = 5; (* gen andere weider erkennen *) Rk = 6; (* gen mit anderen weidern kooperieren *) maxfit = 80; stoffwechsel = -1; (*----------------------- Type-Definitionen------------*) TYPE Tzahl = ^inhalt; inhalt = RECORD i:integer; v, n:Tzahl; END; Tfeld = array(.1..6.) of CHAR; TPgen = ^gen; gen = RECORD vor,nach:TPgen; g:Tfeld; END; TPzelle = ^zelle; Ttorus = array(.1..80,1..24.) of TPzelle; zelle = OBJECT constructor init; destructor done;virtual; function nnahrung(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual; function nrauber(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual; function nweider(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual; END; TPweider= ^weider; (* Froesche nur duie Froesche werden optimiert *) weider = OBJECT(zelle) vor,nach :TPweider; gen :TPgen; fit :integer; Fg, Fn, Rg, Rn, Fk, Rk, verteidigen, gefahr, futter, weidererkennen, kooperieren :boolean; constructor init; destructor done; virtual; Procedure leer; virtual; procedure Bgefahr (VAR x,y:Tzahl;VAR t:Ttorus); virtual; procedure Bfutter (VAR x,y:Tzahl;VAR t:Ttorus); virtual; procedure Rfressen (VAR x,y:Tzahl;VAR t:Ttorus); virtual; procedure Rverteidigung; virtual; procedure Rkooperieren; virtual; procedure Rfit (zahl:integer); virtual; function getfit :integer; virtual; function getgefahr :boolean; virtual; function getverteidigen :boolean; virtual; function getfressen :boolean; virtual; procedure Rweidererkennen (VAR x,y:Tzahl;VAR t:Ttorus); virtual; function getkooperatoren (VAR x,y:Tzahl; VAR t:Ttorus) :integer; virtual; function nloeschen (VAR x,y:Tzahl; VAR t:Ttorus) :boolean; virtual; END; TPrauber= ^rauber; (* Voegel Feinde der Froesche *) rauber = OBJECT(zelle) constructor init; destructor done;virtual; function rloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual; END; TPnahrung=^nahrung;(* INSEKTEN Nahrung der Froesche *) nahrung = OBJECT(zelle) constructor init; destructor done;virtual; function nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual; END; (*----------------------- Var-Definitionen -----------*) VAR n,x,y,xa,ya:Tzahl; Wzelle :TPzelle; Wweider, Aweider, Nweider :TPweider; Wnahrung :TPnahrung; Wrauber :TPrauber; Wgen, Agen, Ngen :TPgen; bilda, bildb :Ttorus; (*----------------------- Methoden -------------------*) CONSTRUCTOR zelle.init; BEGIN END; DESTRUCTOR zelle.done; BEGIN END; FUNCTION zelle.nnahrung(VAR x,y:Tzahl;VAR t:Ttorus):boolean; VAR z:integer; BEGIN Z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z + 1; If z > 0 THEN nnahrung:=true ELSE nnahrung:=false; END; FUNCTION zelle.nrauber(VAR x,y:Tzahl;VAR t:Ttorus):boolean; VAR Z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(rauber) THEN z := z + 1; IF z > 0 THEN nrauber :=true ELSE nrauber :=false; END; FUNCTION zelle.nweider(VAR x,y:Tzahl;VAR t:Ttorus):boolean; VAR Z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider) THEN z := z + 1; IF z > 0 THEN nweider :=true ELSE nweider :=false; END; CONSTRUCTOR weider.init; BEGIN END; PROCEDURE weider.leer; BEGIN Fg := false; Fn := false; Rg := false; Rn := false; Fk := false; Rk := false; verteidigen := false; gefahr := false; futter := false; weidererkennen := false; kooperieren := false; fit := maxfit; END; DESTRUCTOR weider.done; BEGIN END; PROCEDURE weider.Bgefahr(VAR x,y:Tzahl;VAR t:Ttorus); VAR z : integer; BEGIN Z := 0; IF Fg THEN BEGIN IF TypeOF(t(.x^.v^.v^.i,y^.v^.v^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.v^.i,y^.v^.i .)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.v^.i,y^.i .)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.v^.i,y^.n^.i .)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.v^.i,y^.n^.n^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.i ,y^.v^.v^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.i ,y^.n^.n^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.v^.v^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.n^.n^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.i ,y^.v^.v^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.i ,y^.n^.n^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.n^.i,y^.v^.v^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.n^.i,y^.v^.i .)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.n^.i,y^.i .)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.n^.i,y^.n^.i .)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.n^.n^.i,y^.n^.n^.i.)^)=TypeOf(rauber) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(rauber) THEN z := z+1; END; IF Z > 0 THEN gefahr := true ELSE gefahr := false; END; PROCEDURE weider.Bfutter(VAR x,y:Tzahl;VAR t:Ttorus); VAR z :integer; BEGIN z := 0; IF Fn THEN BEGIN IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(nahrung) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z + 1; END; IF Z > 0 THEN futter := true ELSE futter := false; END; function weider.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean; VAR z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider) THEN z := z+1; IF z> 3 THEN nloeschen := true ELSE nloeschen := false; END; procedure weider.Rweidererkennen(VAR x,y:Tzahl;VAR t:Ttorus); VAR Z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider) THEN z := z + 1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider) THEN z := z + 1; IF ((z > 0) AND Fk) THEN weidererkennen :=true ELSE weidererkennen :=false; END; function weider.getkooperatoren(VAR x,y:Tzahl;VAR t:Ttorus):integer; VAR z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.v^.i,y^.v^.i.)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.v^.i,y^.i .)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.v^.i,y^.n^.i.)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.i ,y^.v^.i.)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.i ,y^.n^.i.)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.n^.i,y^.v^.i.)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.n^.i,y^.i .)^; IF Aweider^.kooperieren THEN z:=z+1; END; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider) THEN BEGIN Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@t(.x^.n^.i,y^.n^.i.)^; IF Aweider^.kooperieren THEN z:=z+1; END; (*IF Z>0 THEN z:=1 ELSE z:=-1;*) getkooperatoren :=z; END; procedure weider.Rkooperieren; BEGIN IF(weidererkennen and Rk) THEN kooperieren:=true; END; PROCEDURE weider.Rfressen (VAR x,y:Tzahl;VAR t:Ttorus); BEGIN IF(futter and Rn) THEN BEGIN fit := fit + 1+weider.getkooperatoren(x,y,t); IF NOT(kooperieren) THEN fit := fit + 1; END; END; PROCEDURE weider.Rverteidigung; BEGIN IF (gefahr and Rg) THEN verteidigen := true ELSE verteidigen := false END; PROCEDURE weider.Rfit (zahl:integer); BEGIN fit := fit + zahl; END; FUNCTION weider.getfit:integer; BEGIN getfit := fit; END; FUNCTION weider.getgefahr:boolean; BEGIN getgefahr := gefahr; END; FUNCTION weider.getverteidigen:boolean; BEGIN getverteidigen := verteidigen; END; FUNCTION weider.getfressen:boolean; BEGIN getfressen := Rn; END; CONSTRUCTOR rauber.init; BEGIN END; DESTRUCTOR rauber.done; BEGIN END; function rauber.rloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean; VAR z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(rauber) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(rauber) THEN z := z+1; IF z > 3 THEN rloeschen := true ELSE rloeschen := false; END; CONSTRUCTOR nahrung.init; BEGIN END; DESTRUCTOR nahrung.done; BEGIN END; function nahrung.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean; VAR z:integer; BEGIN z := 0; IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(nahrung) THEN z := z+1; IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(nahrung) THEN z := z+1; IF z> 3 THEN nloeschen := true ELSE nloeschen := false; END; (*----------------------- Prozeduren -----------------*) FUNCTION test:CHAR; VAR Z:integer; BEGIN z := random(2); IF z = 0 THEN test := '0' ELSE test := '1' END; PROCEDURE aufbaugene; VAR z,z1 :integer; BEGIN NEW(Wgen); NEW(Agen); Wgen := Agen; FOR z1 := 1 TO 6 DO Agen^.g(.z1.) := test; NEW(Ngen); Ngen^.vor := Agen; Agen^.nach := Ngen; Agen := Ngen; FOR z := 1 TO 15 DO BEGIN FOR z1 := 1 TO 6 DO Agen^.g(.z1.) := test; NEW(Ngen); Ngen^.vor := Agen; Agen^.nach := Ngen; Agen := Ngen; END; Agen^.nach := Wgen; Wgen^.vor := Agen; END; PROCEDURE abbaugene(z:TPgen); BEGIN IF z <> Wgen THEN abbaugene(z^.nach); dispose(z) END; PROCEDURE crossing_over; VAR max1,max2, fit, co1,co2 :TPweider; g1,g2 :TPgen; ch :CHAR; z1,z2,z3,z4:Integer; BEGIN sound(440);delay(100);nosound; NEW(max1,init); NEW(max2,init); NEW(fit,init); NEW(co1,init); NEW(co2,init); NEW(g1); NEW(g2); max1 := Wweider; max2 := Wweider^.nach; fit^.fit := 0; fit^.gen := max1^.gen; REPEAT IF fit^.getfit < max1^.getfit THEN BEGIN fit^.fit := max1^.getfit; fit^.gen := max1^.gen; END; Max1 := max1^.nach; UNTIL max1 = Wweider; Wweider^.gen := fit^.gen; max1 := Wweider; fit^.fit := 0; fit^.gen := max2^.gen; REPEAT IF fit^.getfit < max2^.getfit THEN BEGIN fit^.fit := max2^.getfit; fit^.gen := max2^.gen; END; max2 := max2^.nach; UNTIL max2 = Wweider; Wweider^.nach^.gen := fit^.gen; max2 := Wweider^.nach; co1 := max2^.nach; co2 := co1^.nach; g1^.g := max1^.gen^.g; g2^.g := max2^.gen^.g; max1^.fit := maxfit; max2^.fit := maxfit; REPEAT z1 := random(6)+1; z2 := random(6)+1; Co1^.gen^.g := g1^.g; co1^.fit := maxfit; Co2^.gen^.g := g2^.g; co2^.fit := maxfit; ch:=co1^.gen^.g(.z1.); co1^.gen^.g(.z1.):=co2^.gen^.g(.z2.); co2^.gen^.g(.z2.):= ch; z1 := random(100); IF z1 = 0 THEN BEGIN sound(1000);delay(100);nosound; z1 := random(6)+1; z2 := random(6)+1; z3 :=random(2); z4 := random(2); IF z3 = 1 THEN co1^.gen^.g(.z1.):='1' ELSE co1^.gen^.g(.z1.):='0'; IF z4 = 1 THEN co2^.gen^.g(.z2.):='1' ELSE co2^.gen^.g(.z2.):='0'; END; co1 := co2^.nach; co2 := co2^.nach^.nach; UNTIL co1 = Wweider; Aweider := Wweider; REPEAT IF Aweider^.gen^.g(.Fn.) = '1' THEN Aweider^.Fn := true ELSE Aweider^.Fn := false; IF Aweider^.gen^.g(.Fg.) = '1' THEN Aweider^.Fg := true ELSE Aweider^.Fg := false; IF Aweider^.gen^.g(.Rn.) = '1' THEN Aweider^.Rn := true ELSE Aweider^.Rn := false; IF Aweider^.gen^.g(.Rg.) = '1' THEN Aweider^.Rg := true ELSE Aweider^.Rg := false; IF Aweider^.gen^.g(.Fk.) = '1' THEN Aweider^.Fk := true ELSE Aweider^.Fk := false; IF Aweider^.gen^.g(.Rk.) = '1' THEN Aweider^.Rk := true ELSE Aweider^.Rk := false; Aweider := Aweider^.nach; UNTIL Aweider = Wweider; END; PROCEDURE aufbauweider; VAR z :integer; BEGIN NEW(Wweider,init); NEW(Aweider,init); NEW(Nweider,init); NWEIDER^.leer; Nweider := Wweider; Aweider := Nweider; Agen := Wgen; Aweider^.fit := maxfit; Aweider^.gen := Agen; IF Aweider^.gen^.g(.Fn.) = '1' THEN Aweider^.Fn := true ELSE Aweider^.Fn := false; IF Aweider^.gen^.g(.Fg.) = '1' THEN Aweider^.Fg := true ELSE Aweider^.Fg := false; IF Aweider^.gen^.g(.Rn.) = '1' THEN Aweider^.Rn := true ELSE Aweider^.Rn := false; IF Aweider^.gen^.g(.Rg.) = '1' THEN Aweider^.Rg := true ELSE Aweider^.Rg := false; IF Aweider^.gen^.g(.Fk.) = '1' THEN Aweider^.Fk := true ELSE Aweider^.Fk := false; IF Aweider^.gen^.g(.Rk.) = '1' THEN Aweider^.Rk := true ELSE Aweider^.Rk := false; FOR z := 1 TO 15 DO BEGIN NEW(Nweider,init); Nweider^.leer; Aweider^.nach := Nweider; Nweider^.vor := Aweider; Aweider := Nweider; Agen := Agen^.nach; Aweider^.gen := Agen; IF Aweider^.gen^.g(.Fn.) = '1' THEN Aweider^.Fn := true ELSE Aweider^.Fn := false; IF Aweider^.gen^.g(.Fg.) = '1' THEN Aweider^.Fg := true ELSE Aweider^.Fg := false; IF Aweider^.gen^.g(.Rn.) = '1' THEN Aweider^.Rn := true ELSE Aweider^.Rn := false; IF Aweider^.gen^.g(.Rg.) = '1' THEN Aweider^.Rg := true ELSE Aweider^.Rg := false; IF Aweider^.gen^.g(.Fk.) = '1' THEN Aweider^.Fk := true ELSE Aweider^.Fk := false; IF Aweider^.gen^.g(.Rk.) = '1' THEN Aweider^.Rk := true ELSE Aweider^.Rk := false; END; Aweider^.nach := Wweider; Wweider^.vor := Aweider; END; PROCEDURE abbauweider(z:TPweider); BEGIN IF z <> Wweider THEN abbauweider(z^.nach); DISPOSE(z,done); END; PROCEDURE aufbaurauber; BEGIN NEW(Wrauber,init) END; PROCEDURE abbaurauber; BEGIN DISPOSE(Wrauber,done); END; PROCEDURE aufbaunahrung; BEGIN new(Wnahrung,init); END; PROCEDURE abbaunahrung; BEGIN DISPOSE(Wnahrung,done); END; PROCEDURE aufbauzelle; BEGIN NEW(Wzelle,init) END; PROCEDURE abbauzelle; BEGIN DISPOSE(Wzelle,done) END; PROCEDURE aufbau; VAR z:integer; BEGIN z := 1; new(n); xa := n; x := n; x^.i := z; REPEAT z := z +1; new(n); x^.n := n; n^.v := x; x := n; x^.i := z; UNTIL z = 69; x^.n := xa; xa^.v := x; z := 1; new(n); ya := n; y := n; y^.i := z; REPEAT z := z +1; new(n); y^.n := n; n^.v := y; y := n; y^.i := z; UNTIL z = 24; y^.n := ya; ya^.v := y; END; PROCEDURE abbaux(x:Tzahl); BEGIN IF x^.n <> xa THEN abbaux(x^.n); dispose(x); END; PROCEDURE abbauy(y:Tzahl); BEGIN IF y^.n <> ya THEN abbauy(y^.n); dispose(y); END; FUNCTION neu (VAR r:Ttorus; VAR x,y:Tzahl):TPzelle; VAR z:TPzelle; BEGIN z := r(.x^.i,y^.i.); IF TypeOF(z^) = TypeOf(rauber) THEN BEGIN IF Wrauber^.rloeschen(x,y,r) THEN neu := Wzelle ELSE neu := z; END ELSE BEGIN IF TypeOF(z^) = TypeOf(nahrung) THEN BEGIN IF Wnahrung^.nloeschen(x,y,r) THEN neu := Wzelle ELSE neu := z; END ELSE BEGIN IF TypeOF(z^) = TypeOf(weider) THEN BEGIN (*neu := z;*) Aweider := Wweider; REPEAT Aweider := Aweider^.nach UNTIL @Aweider^ =@z^; (*Aweider^.init; schon beim Aufbau Konsturktor aufgerufen*) IF Aweider^.nloeschen(x,y,r) THEN neu := Wzelle ELSE IF Aweider^.getfit = 0 THEN neu:= Wzelle ELSE BEGIN Aweider^.Rfit(stoffwechsel); Aweider^.Bgefahr(x,y,r); Aweider^.Rverteidigung; Aweider^.Rweidererkennen(x,y,r); Aweider^.Rkooperieren; IF ((Aweider^.getgefahr)AND NOT(Aweider^.getverteidigen)) THEN BEGIN Aweider^.Rfit(-1*(Aweider^.getfit)); neu := Wzelle; END ELSE BEGIN Aweider^.Bfutter(x,y,r); Aweider^.Rfressen(x,y,r); neu := @Aweider^; END END; END ELSE BEGIN IF TypeOF(z^) = TypeOf(zelle) THEN BEGIN IF z^.nnahrung(x,y,r) THEN neu:= Wnahrung ELSE BEGIN IF z^.nrauber(x,y,r) THEN neu:= Wrauber ELSE BEGIN IF z^.nweider(x,y,r) THEN neu:= Aweider ELSE neu := z END; END END END END END END; PROCEDURE status; BEGIN textbackground(red); textcolor(white); window(1,1,11,24); CLRSCR;gotoxy(1,1); WRITELN('ngfvwk fit'); Aweider := Wweider; REPEAT writeln(Aweider^.gen^.g,' ',Aweider^.fit); Aweider := Aweider^.nach; UNTIL Aweider^.nach = Wweider; END; PROCEDURE schreibe (z:TPzelle); BEGIN IF TYPEOF(z^) = TypeOf(rauber) THEN BEGIN textcolor(red); WRITE(char(4)) END ELSE BEGIN IF TypeOf(z^) = TypeOF(weider) THEN BEGIN textcolor(lightgreen); WRITE(char(2)) END ELSE BEGIN IF TypeOf(z^) = TYPEOF(nahrung) THEN BEGIN textcolor (yellow );Write(char(26)) END ELSE BEGIN textcolor(blue);WRITE(' ') END END; END END; PROCEDURE spiel(VAR von,nach :Ttorus); BEGIN x:=xa; y:=ya; textbackground(blue); window(12,1,80,25); GOTOxy(1,1); REPEAT REPEAT nach(.x^.i,y^.i.):= (* von(.x^.i,y^.i.) ;*)neu(von,x,y); schreibe(nach(.x^.i,y^.i.)); x := x^.n UNTIL x =xa; y := y^.n UNTIL y =ya; END; PROCEDURE zufall(VAR a:Ttorus); VAR z :integer; BEGIN Textbackground(blue); window(11,1,80,24); clrscr; GOTOxy(1,1); window(11,1,80,25); Aweider := Wweider; y :=ya; x :=xa; REPEAT REPEAT (*Zufallsbelegung*) z := random(100); CASE z OF 0: a(.x^.i,y^.i.) := Wnahrung; 1: a(.x^.i,y^.i.) := Wrauber; 2: a(.x^.i,y^.i.) := Wzelle; 3: BEGIN a(.x^.i,y^.i.):= Aweider; Aweider := Aweider^.nach; END ELSE a(.x^.i,y^.i.) := Wzelle; END; schreibe(a(.x^.i,y^.i.)); x := x^.n UNTIL x =xa; y := y^.n UNTIL y =ya; status; Aweider:= Wweider; END; PROCEDURE hauptprogramm; VAR z:integer; BEGIN Window(1,25,80,25); textcolor(white); textbackground(red); clrscr; write('n Nahrung g gefahr f fressen v verteidigen w Weider erkennen k kooperieren '); randomize; REPEAT zufall(bilda); Z := 0; REPEAT spiel(bilda,bildb); Status; spiel(bildb,bilda); Status; z := z + 1; Until keypressed or (z = 5); crossing_over; UNTIL KEYPRESSED END; (*----------------------- Hauptprogramm --------------*) BEGIN checkbreak := false; clrscr; aufbau; aufbaugene; aufbauweider; aufbaunahrung; aufbaurauber; aufbauzelle; hauptprogramm; x := xa; abbaux(x); Agen := Wgen; abbaugene(Agen); Aweider := Wweider; abbauweider(Aweider); abbaunahrung; abbaurauber; abbauzelle; y:=ya; abbauy(y); window(1,1,80,25); textbackground(black); textcolor(white); clrscr; checkbreak := true; END.