Inhalt
Aktueller Ordner:
/unitgenalgess.pas
unit Unitgenalgess;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
(******************************************************************)
(* Paul Koop M.A. Raeuber Beute System *)
(* Die Simulation wurde ursprunglich entwickelt, *)
(* um die Verwendbarkeit von Zellularautomaten *)
(* fuer die Algorithmisch Rekursive Sequanzanalyse *)
(* zu ueberpruefen *)
(* Modellcharakter hat allein der Quelltext. Eine Compilierung *)
(* dient nur als Falsifikationsversuch *)
(******************************************************************)
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;
(* Forward Begin *)
(*CONSTRUCTOR zelle.init;
DESTRUCTOR zelle.done;*)
(* FUNCTION zelle.nnahrung(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
FUNCTION zelle.nrauber(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
FUNCTION zelle.nweider(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
CONSTRUCTOR weider.init;
PROCEDURE weider.leer;
DESTRUCTOR weider.done;
PROCEDURE weider.Bgefahr(VAR x,y:Tzahl;VAR t:Ttorus);
PROCEDURE weider.Bfutter(VAR x,y:Tzahl;VAR t:Ttorus);
function weider.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
procedure weider.Rweidererkennen(VAR x,y:Tzahl;VAR t:Ttorus);
function weider.getkooperatoren(VAR x,y:Tzahl;VAR t:Ttorus):integer;
procedure weider.Rkooperieren;
PROCEDURE weider.Rfressen (VAR x,y:Tzahl;VAR t:Ttorus);
PROCEDURE weider.Rverteidigung;
PROCEDURE weider.Rfit (zahl:integer);
FUNCTION weider.getfit:integer;
FUNCTION weider.getgefahr:boolean;
FUNCTION weider.getverteidigen:boolean;
FUNCTION weider.getfressen:boolean;
CONSTRUCTOR rauber.init;
DESTRUCTOR rauber.done;
function rauber.rloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
CONSTRUCTOR nahrung.init;
DESTRUCTOR nahrung.done;
function nahrung.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean; *)
FUNCTION test:CHAR;
PROCEDURE aufbaugene;
PROCEDURE abbaugene(z:TPgen);
PROCEDURE crossing_over;
PROCEDURE aufbauweider;
PROCEDURE abbauweider(z:TPweider);
PROCEDURE aufbaurauber;
PROCEDURE abbaurauber;
PROCEDURE aufbaunahrung;
PROCEDURE abbaunahrung;
PROCEDURE aufbauzelle;
PROCEDURE abbauzelle;
PROCEDURE aufbau;
PROCEDURE abbaux(x:Tzahl);
PROCEDURE abbauy(y:Tzahl);
FUNCTION neu (VAR r:Ttorus; VAR x,y:Tzahl):TPzelle;
PROCEDURE spiel(VAR von,nach :Ttorus);
PROCEDURE zufall(VAR a:Ttorus);
(* Forward End *)
implementation
USES dos,crt;
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(3);
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
BEGIN
IF co1^.gen^.g(.z1.)='1'
THEN co1^.gen^.g(.z1.):='0'
ELSE co1^.gen^.g(.z1.):='1';
END;
IF z4 = 1
THEN
BEGIN
IF co1^.gen^.g(.z2.)='1'
THEN co1^.gen^.g(.z2.):='0'
ELSE co1^.gen^.g(.z2.):='1';
END;
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 = 80;
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 spiel(VAR von,nach :Ttorus);
BEGIN
x:=xa;
y:=ya;
REPEAT
REPEAT
nach(.x^.i,y^.i.):= neu(von,x,y);
x := x^.n
UNTIL x =xa;
y := y^.n
UNTIL y =ya;
END;
PROCEDURE zufall(VAR a:Ttorus);
VAR z :integer;
BEGIN
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;
x := x^.n
UNTIL x =xa;
y := y^.n
UNTIL y =ya;
Aweider:= Wweider;
END;
end.