├── docs
├── img
│ ├── readme.md
│ └── headerbild.jpeg
├── readme.md
└── index.html
├── genalgPY.png
├── genalgess.ico
├── genalgscreen.png
├── README.md
├── genalgess.lpr
├── genalgess.lpi
├── genalg.lps
├── umain.pas
├── umain.lfm
├── genalgess.lps
└── unitgenalgess.pas
/docs/img/readme.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/docs/readme.md:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/genalgPY.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pkoopongithub/genalg/HEAD/genalgPY.png
--------------------------------------------------------------------------------
/genalgess.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pkoopongithub/genalg/HEAD/genalgess.ico
--------------------------------------------------------------------------------
/genalgscreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pkoopongithub/genalg/HEAD/genalgscreen.png
--------------------------------------------------------------------------------
/docs/img/headerbild.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pkoopongithub/genalg/HEAD/docs/img/headerbild.jpeg
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # genalg
2 | In sociobiology, genes keep culture on a leash. When simulating primate cultures, genes and memes keep each other on a leash. Based on a random distribution of cultures, cultures develop side by side and patterns stabilize.
3 |
4 | 
5 |
6 | 
7 |
8 |
--------------------------------------------------------------------------------
/genalgess.lpr:
--------------------------------------------------------------------------------
1 | program genalgess;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | uses
6 | {$IFDEF UNIX}{$IFDEF UseCThreads}
7 | cthreads,
8 | {$ENDIF}{$ENDIF}
9 | Interfaces, // this includes the LCL widgetset
10 | Forms, UMain, unitgenalgess
11 | { you can add units after this };
12 |
13 | {$R *.res}
14 |
15 | begin
16 | RequireDerivedFormResource:=True;
17 | Application.Initialize;
18 | Application.CreateForm(TfrmMain, frmMain);
19 | Application.Run;
20 | end.
21 |
22 |
--------------------------------------------------------------------------------
/genalgess.lpi:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/genalg.lps:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
--------------------------------------------------------------------------------
/umain.pas:
--------------------------------------------------------------------------------
1 | unit UMain;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
9 | Grids, StdCtrls, Unitgenalgess;
10 |
11 | type
12 | (* Datentyp fuer die virtuelle Welt*)
13 |
14 |
15 | { TfrmMain }
16 |
17 | TfrmMain = class(TForm)
18 | btnNext: TButton;
19 | btnStart: TButton;
20 | btnStopp: TButton;
21 | Shape1: TShape;
22 | Shape2: TShape;
23 | Shape3: TShape;
24 | Shape4: TShape;
25 | Spielfeld: TDrawGrid;
26 | pnlBottom: TPanel;
27 | StaticText1: TStaticText;
28 | StaticText10: TStaticText;
29 | StaticText11: TStaticText;
30 | StaticText12: TStaticText;
31 | StaticText2: TStaticText;
32 | StaticText3: TStaticText;
33 | StaticText4: TStaticText;
34 | StaticText5: TStaticText;
35 | StaticText6: TStaticText;
36 | StaticText7: TStaticText;
37 | StaticText8: TStaticText;
38 | StaticText9: TStaticText;
39 | StatusMonitor: TStringGrid;
40 | tmrAnimation: TTimer;
41 | procedure Auswerten(Sender: TObject);
42 | procedure btnStoppClick(Sender: TObject);
43 | procedure btnStartClick(Sender: TObject);
44 | procedure btnZufallClick(Sender: TObject);
45 | procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
46 | procedure FormCreate(Sender: TObject);
47 | procedure SpielfeldDrawCell(Sender: TObject; aCol, aRow: Integer;
48 | aRect: TRect; aState: TGridDrawState);
49 | private
50 | { private declarations }
51 |
52 | (* virtuelle Spielwelt *)
53 |
54 |
55 | public
56 | { public declarations }
57 | end;
58 |
59 | var
60 | frmMain: TfrmMain;
61 |
62 | implementation
63 |
64 | {$R *.lfm}
65 |
66 | { TfrmMain }
67 |
68 | procedure TfrmMain.FormCreate(Sender: TObject);
69 | begin
70 | aufbau;
71 | aufbaugene;
72 | aufbauweider;
73 | aufbaunahrung;
74 | aufbaurauber;
75 | aufbauzelle;
76 | randomize;
77 | zufall(bilda);
78 | end;
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 | procedure TfrmMain.SpielfeldDrawCell(Sender: TObject; aCol, aRow: Integer;
87 | aRect: TRect; aState: TGridDrawState);
88 | begin
89 |
90 | if TypeOf(bilda[aCol+1, aRow+1]^) = TypeOf(rauber) then
91 | Spielfeld.Canvas.Brush.Color := clRed
92 | else
93 | if TypeOf(bilda[aCol+1, aRow+1]^) = TypeOF(weider) then
94 | Spielfeld.Canvas.Brush.Color := clGreen
95 | else
96 | if TypeOf(bilda[aCol+1, aRow+1]^) = TYPEOF(nahrung) then
97 | Spielfeld.Canvas.Brush.Color := clYellow
98 | else
99 | Spielfeld.Canvas.Brush.Color := clWhite;
100 |
101 | Spielfeld.Canvas.FillRect(aRect);
102 | end;
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | procedure TfrmMain.Auswerten(Sender: TObject);
112 | var z,aRow:integer;
113 | begin
114 |
115 | zufall(bilda);
116 | Z := 0;
117 | REPEAT
118 | spiel(bilda,bildb);
119 | Spielfeld.Refresh;
120 | bilda:= bildb;
121 | z := z + 1;
122 | aRow:= 1;
123 | Aweider := Wweider;
124 |
125 | with StatusMonitor do
126 | repeat
127 | Cells[0, aRow] := Aweider^.gen^.g;
128 | Cells[2, aRow] := IntToStr(Aweider^.fit);
129 | aRow:=aRow+1;
130 | Aweider := Aweider^.nach;
131 | until aRow = rowCount;
132 | StatusMonitor.Refresh;
133 | Until (z = 10);
134 | crossing_over;
135 |
136 | end;
137 |
138 | procedure TfrmMain.btnStoppClick(Sender: TObject);
139 | begin
140 | tmrAnimation.Enabled := false;
141 | bilda:=bildb;
142 | Spielfeld.Refresh;
143 | end;
144 |
145 | procedure TfrmMain.btnStartClick(Sender: TObject);
146 | begin
147 | tmrAnimation.Enabled := true;
148 | end;
149 |
150 | procedure TfrmMain.btnZufallClick(Sender: TObject);
151 | begin
152 | abbaux(x);
153 | Agen := Wgen;
154 | abbaugene(Agen);
155 | Aweider := Wweider;
156 | abbauweider(Aweider);
157 | abbaunahrung;
158 | abbaurauber;
159 | abbauzelle;
160 | y:=ya;
161 | abbauy(y);
162 |
163 | aufbau;
164 | aufbaugene;
165 | aufbauweider;
166 | aufbaunahrung;
167 | aufbaurauber;
168 | aufbauzelle;
169 |
170 | zufall(bilda);
171 | Spielfeld.Repaint;
172 | end;
173 |
174 | procedure TfrmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
175 | begin
176 | tmrAnimation.Enabled := false;
177 | x := xa;
178 | abbaux(x);
179 | Agen := Wgen;
180 | abbaugene(Agen);
181 | Aweider := Wweider;
182 | abbauweider(Aweider);
183 | abbaunahrung;
184 | abbaurauber;
185 | abbauzelle;
186 | y:=ya;
187 | abbauy(y);
188 | end;
189 |
190 | end.
191 |
192 |
--------------------------------------------------------------------------------
/umain.lfm:
--------------------------------------------------------------------------------
1 | object frmMain: TfrmMain
2 | Left = 428
3 | Height = 621
4 | Top = 281
5 | Width = 1236
6 | BorderStyle = bsDialog
7 | Caption = 'GenAlgESS'
8 | ClientHeight = 621
9 | ClientWidth = 1236
10 | OnClose = FormClose
11 | OnCreate = FormCreate
12 | ParentFont = True
13 | LCLVersion = '1.6.4.0'
14 | object pnlBottom: TPanel
15 | Left = 0
16 | Height = 52
17 | Top = 569
18 | Width = 1236
19 | Align = alBottom
20 | ClientHeight = 52
21 | ClientWidth = 1236
22 | TabOrder = 0
23 | object btnNext: TButton
24 | Left = 8
25 | Height = 33
26 | Top = 6
27 | Width = 89
28 | Caption = '&Nächster Zeittakt'
29 | OnClick = Auswerten
30 | TabOrder = 0
31 | end
32 | object btnStart: TButton
33 | Left = 110
34 | Height = 33
35 | Top = 6
36 | Width = 89
37 | Caption = '&Start'
38 | OnClick = btnStartClick
39 | TabOrder = 1
40 | end
41 | object btnStopp: TButton
42 | Left = 206
43 | Height = 33
44 | Top = 5
45 | Width = 89
46 | Caption = 'Sto&pp'
47 | OnClick = btnStoppClick
48 | TabOrder = 2
49 | end
50 | end
51 | object Spielfeld: TDrawGrid
52 | Left = 0
53 | Height = 488
54 | Top = 0
55 | Width = 809
56 | ColCount = 80
57 | DefaultColWidth = 10
58 | DefaultDrawing = False
59 | DefaultRowHeight = 20
60 | ExtendedSelect = False
61 | FixedCols = 0
62 | FixedRows = 0
63 | Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine]
64 | RowCount = 24
65 | TabOrder = 1
66 | OnDrawCell = SpielfeldDrawCell
67 | end
68 | object StatusMonitor: TStringGrid
69 | Left = 848
70 | Height = 326
71 | Top = 10
72 | Width = 88
73 | ColCount = 3
74 | FixedCols = 0
75 | FixedRows = 0
76 | RowCount = 16
77 | TabOrder = 2
78 | ColWidths = (
79 | 48
80 | 8
81 | 27
82 | )
83 | Cells = (
84 | 2
85 | 0
86 | 0
87 | 'ngfvwk'
88 | 2
89 | 0
90 | 'fit'
91 | )
92 | end
93 | object StaticText1: TStaticText
94 | Left = 950
95 | Height = 17
96 | Top = 18
97 | Width = 65
98 | Caption = 'Gene:'
99 | TabOrder = 3
100 | end
101 | object StaticText2: TStaticText
102 | Left = 950
103 | Height = 17
104 | Top = 40
105 | Width = 65
106 | Caption = 'n: Nahrung wahrnehmen'
107 | TabOrder = 4
108 | end
109 | object StaticText3: TStaticText
110 | Left = 950
111 | Height = 17
112 | Top = 64
113 | Width = 65
114 | Caption = 'g: Gefahr wahrnehmen'
115 | TabOrder = 5
116 | end
117 | object StaticText4: TStaticText
118 | Left = 952
119 | Height = 17
120 | Top = 88
121 | Width = 65
122 | Caption = 'f: Verdauen können'
123 | TabOrder = 6
124 | end
125 | object StaticText5: TStaticText
126 | Left = 950
127 | Height = 17
128 | Top = 112
129 | Width = 65
130 | Caption = 'v: Verteidigen können'
131 | TabOrder = 7
132 | end
133 | object StaticText6: TStaticText
134 | Left = 950
135 | Height = 17
136 | Top = 136
137 | Width = 186
138 | Caption = 'w: andere Weider erkennen können'
139 | TabOrder = 8
140 | end
141 | object StaticText7: TStaticText
142 | Left = 950
143 | Height = 17
144 | Top = 160
145 | Width = 114
146 | Caption = 'k:kooperieren können'
147 | TabOrder = 9
148 | end
149 | object StaticText8: TStaticText
150 | Left = 950
151 | Height = 17
152 | Top = 192
153 | Width = 146
154 | Caption = 'optimiert werden die Weider'
155 | TabOrder = 10
156 | end
157 | object Shape1: TShape
158 | Left = 954
159 | Height = 26
160 | Top = 222
161 | Width = 12
162 | end
163 | object Shape2: TShape
164 | Left = 954
165 | Height = 26
166 | Top = 256
167 | Width = 12
168 | Brush.Color = clLime
169 | end
170 | object Shape3: TShape
171 | Left = 954
172 | Height = 26
173 | Top = 288
174 | Width = 12
175 | Brush.Color = clRed
176 | end
177 | object Shape4: TShape
178 | Left = 954
179 | Height = 26
180 | Top = 320
181 | Width = 12
182 | Brush.Color = clYellow
183 | end
184 | object StaticText9: TStaticText
185 | Left = 976
186 | Height = 17
187 | Top = 222
188 | Width = 65
189 | Caption = 'Lebensraum'
190 | TabOrder = 11
191 | end
192 | object StaticText10: TStaticText
193 | Left = 976
194 | Height = 17
195 | Top = 256
196 | Width = 65
197 | Caption = 'Weider'
198 | TabOrder = 12
199 | end
200 | object StaticText11: TStaticText
201 | Left = 976
202 | Height = 17
203 | Top = 288
204 | Width = 65
205 | Caption = 'Rauber'
206 | TabOrder = 13
207 | end
208 | object StaticText12: TStaticText
209 | Left = 976
210 | Height = 17
211 | Top = 320
212 | Width = 96
213 | Caption = 'WeiderNahrung'
214 | TabOrder = 14
215 | end
216 | object tmrAnimation: TTimer
217 | Interval = 40
218 | OnTimer = Auswerten
219 | left = 8
220 | top = 8
221 | end
222 | end
223 |
--------------------------------------------------------------------------------
/genalgess.lps:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
--------------------------------------------------------------------------------
/unitgenalgess.pas:
--------------------------------------------------------------------------------
1 | unit Unitgenalgess;
2 |
3 | {$mode objfpc}{$H+}
4 |
5 | interface
6 |
7 | uses
8 | Classes, SysUtils;
9 |
10 | (******************************************************************)
11 | (* Paul Koop M.A. Raeuber Beute System *)
12 | (* Die Simulation wurde ursprunglich entwickelt, *)
13 | (* um die Verwendbarkeit von Zellularautomaten *)
14 | (* fuer die Algorithmisch Rekursive Sequanzanalyse *)
15 | (* zu ueberpruefen *)
16 | (* Modellcharakter hat allein der Quelltext. Eine Compilierung *)
17 | (* dient nur als Falsifikationsversuch *)
18 | (******************************************************************)
19 |
20 | CONST
21 | Fn = 1; (* gen nahrung *)
22 | Fg = 2; (* gen gefahr *)
23 | Rn = 3; (* gen fressen *)
24 | Rg = 4; (* gen verteidigung *)
25 |
26 | Fk = 5; (* gen andere weider erkennen *)
27 | Rk = 6; (* gen mit anderen weidern kooperieren *)
28 | maxfit = 80;
29 | stoffwechsel = -1;
30 | (*----------------------- Type-Definitionen------------*)
31 |
32 | TYPE
33 | Tzahl = ^inhalt;
34 | inhalt = RECORD
35 | i:integer;
36 | v,
37 | n:Tzahl;
38 | END;
39 |
40 | Tfeld = array[1..6] of CHAR;
41 |
42 | TPgen = ^gen;
43 |
44 | gen = RECORD
45 | vor,nach:TPgen;
46 | g:Tfeld;
47 | END;
48 |
49 | TPzelle = ^zelle;
50 | Ttorus = array[1..80,1..24] of TPzelle;
51 | zelle = OBJECT
52 | constructor init;
53 | destructor done;virtual;
54 | function nnahrung(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual;
55 | function nrauber(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual;
56 | function nweider(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual;
57 |
58 | END;
59 |
60 | TPweider= ^weider; (* Froesche nur duie Froesche werden optimiert *)
61 | weider = OBJECT(zelle)
62 | vor,nach :TPweider;
63 | gen :TPgen;
64 | fit :integer;
65 | Fg,
66 | Fn,
67 | Rg,
68 | Rn,
69 | Fk,
70 | Rk,
71 | verteidigen,
72 | gefahr,
73 | futter,
74 | weidererkennen,
75 | kooperieren :boolean;
76 | constructor init;
77 | destructor done; virtual;
78 | Procedure leer; virtual;
79 | procedure Bgefahr
80 | (VAR x,y:Tzahl;VAR t:Ttorus);
81 | virtual;
82 | procedure Bfutter
83 | (VAR x,y:Tzahl;VAR t:Ttorus);
84 | virtual;
85 | procedure Rfressen
86 | (VAR x,y:Tzahl;VAR t:Ttorus);
87 | virtual;
88 | procedure Rverteidigung; virtual;
89 | procedure Rkooperieren; virtual;
90 | procedure Rfit
91 | (zahl:integer); virtual;
92 | function getfit :integer;
93 | virtual;
94 | function getgefahr :boolean;
95 | virtual;
96 | function getverteidigen :boolean;
97 | virtual;
98 | function getfressen :boolean;
99 | virtual;
100 | procedure Rweidererkennen
101 | (VAR x,y:Tzahl;VAR t:Ttorus);
102 | virtual;
103 | function getkooperatoren
104 | (VAR x,y:Tzahl;
105 | VAR t:Ttorus) :integer;
106 | virtual;
107 |
108 | function nloeschen
109 | (VAR x,y:Tzahl;
110 | VAR t:Ttorus) :boolean;
111 | virtual;
112 | END;
113 |
114 | TPrauber= ^rauber; (* Voegel Feinde der Froesche *)
115 | rauber = OBJECT(zelle)
116 | constructor init;
117 | destructor done;virtual;
118 | function rloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual;
119 | END;
120 |
121 | TPnahrung=^nahrung;(* INSEKTEN Nahrung der Froesche *)
122 | nahrung = OBJECT(zelle)
123 | constructor init;
124 | destructor done;virtual;
125 | function nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;virtual;
126 | END;
127 |
128 |
129 | (*----------------------- Var-Definitionen -----------*)
130 | VAR
131 | n,x,y,xa,ya:Tzahl;
132 | Wzelle :TPzelle;
133 | Wweider,
134 | Aweider,
135 | Nweider :TPweider;
136 | Wnahrung :TPnahrung;
137 | Wrauber :TPrauber;
138 | Wgen,
139 | Agen,
140 | Ngen :TPgen;
141 |
142 | bilda,
143 | bildb :Ttorus;
144 |
145 |
146 | (* Forward Begin *)
147 |
148 |
149 | (*CONSTRUCTOR zelle.init;
150 | DESTRUCTOR zelle.done;*)
151 | (* FUNCTION zelle.nnahrung(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
152 | FUNCTION zelle.nrauber(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
153 | FUNCTION zelle.nweider(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
154 | CONSTRUCTOR weider.init;
155 | PROCEDURE weider.leer;
156 | DESTRUCTOR weider.done;
157 | PROCEDURE weider.Bgefahr(VAR x,y:Tzahl;VAR t:Ttorus);
158 | PROCEDURE weider.Bfutter(VAR x,y:Tzahl;VAR t:Ttorus);
159 | function weider.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
160 | procedure weider.Rweidererkennen(VAR x,y:Tzahl;VAR t:Ttorus);
161 | function weider.getkooperatoren(VAR x,y:Tzahl;VAR t:Ttorus):integer;
162 | procedure weider.Rkooperieren;
163 | PROCEDURE weider.Rfressen (VAR x,y:Tzahl;VAR t:Ttorus);
164 | PROCEDURE weider.Rverteidigung;
165 | PROCEDURE weider.Rfit (zahl:integer);
166 | FUNCTION weider.getfit:integer;
167 | FUNCTION weider.getgefahr:boolean;
168 | FUNCTION weider.getverteidigen:boolean;
169 | FUNCTION weider.getfressen:boolean;
170 | CONSTRUCTOR rauber.init;
171 | DESTRUCTOR rauber.done;
172 | function rauber.rloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
173 | CONSTRUCTOR nahrung.init;
174 | DESTRUCTOR nahrung.done;
175 | function nahrung.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean; *)
176 | FUNCTION test:CHAR;
177 | PROCEDURE aufbaugene;
178 | PROCEDURE abbaugene(z:TPgen);
179 | PROCEDURE crossing_over;
180 | PROCEDURE aufbauweider;
181 | PROCEDURE abbauweider(z:TPweider);
182 | PROCEDURE aufbaurauber;
183 | PROCEDURE abbaurauber;
184 | PROCEDURE aufbaunahrung;
185 | PROCEDURE abbaunahrung;
186 | PROCEDURE aufbauzelle;
187 | PROCEDURE abbauzelle;
188 | PROCEDURE aufbau;
189 | PROCEDURE abbaux(x:Tzahl);
190 | PROCEDURE abbauy(y:Tzahl);
191 | FUNCTION neu (VAR r:Ttorus; VAR x,y:Tzahl):TPzelle;
192 | PROCEDURE spiel(VAR von,nach :Ttorus);
193 | PROCEDURE zufall(VAR a:Ttorus);
194 | (* Forward End *)
195 |
196 | implementation
197 |
198 |
199 | USES dos,crt;
200 |
201 | CONSTRUCTOR zelle.init;
202 | BEGIN
203 | END;
204 |
205 | DESTRUCTOR zelle.done;
206 | BEGIN
207 | END;
208 |
209 | FUNCTION zelle.nnahrung(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
210 | VAR z:integer;
211 | BEGIN
212 | Z := 0;
213 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(nahrung)
214 | THEN z := z + 1;
215 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(nahrung)
216 | THEN z := z + 1;
217 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(nahrung)
218 | THEN z := z + 1;
219 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(nahrung)
220 | THEN z := z + 1;
221 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(nahrung)
222 | THEN z := z + 1;
223 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(nahrung)
224 | THEN z := z + 1;
225 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(nahrung)
226 | THEN z := z + 1;
227 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(nahrung)
228 | THEN z := z + 1;
229 |
230 | If z > 0
231 | THEN nnahrung:=true ELSE nnahrung:=false;
232 | END;
233 |
234 | FUNCTION zelle.nrauber(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
235 | VAR Z:integer;
236 | BEGIN
237 | z := 0;
238 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(rauber)
239 | THEN z := z + 1;
240 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(rauber)
241 | THEN z := z + 1;
242 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(rauber)
243 | THEN z := z + 1;
244 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(rauber)
245 | THEN z := z + 1;
246 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(rauber)
247 | THEN z := z + 1;
248 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(rauber)
249 | THEN z := z + 1;
250 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(rauber)
251 | THEN z := z + 1;
252 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(rauber)
253 | THEN z := z + 1;
254 |
255 | IF z > 0
256 | THEN nrauber :=true ELSE nrauber :=false;
257 | END;
258 |
259 | FUNCTION zelle.nweider(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
260 | VAR Z:integer;
261 | BEGIN
262 | z := 0;
263 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider)
264 | THEN z := z + 1;
265 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider)
266 | THEN z := z + 1;
267 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider)
268 | THEN z := z + 1;
269 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider)
270 | THEN z := z + 1;
271 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider)
272 | THEN z := z + 1;
273 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider)
274 | THEN z := z + 1;
275 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider)
276 | THEN z := z + 1;
277 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider)
278 | THEN z := z + 1;
279 |
280 | IF z > 0
281 | THEN nweider :=true ELSE nweider :=false;
282 | END;
283 |
284 | CONSTRUCTOR weider.init;
285 | BEGIN
286 | END;
287 | PROCEDURE weider.leer;
288 | BEGIN
289 | Fg := false;
290 | Fn := false;
291 | Rg := false;
292 | Rn := false;
293 | Fk := false;
294 | Rk := false;
295 | verteidigen := false;
296 | gefahr := false;
297 | futter := false;
298 | weidererkennen := false;
299 | kooperieren := false;
300 | fit := maxfit;
301 | END;
302 |
303 | DESTRUCTOR weider.done;
304 | BEGIN
305 | END;
306 |
307 | PROCEDURE weider.Bgefahr(VAR x,y:Tzahl;VAR t:Ttorus);
308 | VAR z : integer;
309 | BEGIN
310 | Z := 0;
311 | IF Fg
312 | THEN
313 | BEGIN
314 | IF TypeOF(t(.x^.v^.v^.i,y^.v^.v^.i.)^)=TypeOf(rauber)
315 | THEN z := z + 1;
316 | IF TypeOF(t(.x^.v^.v^.i,y^.v^.i .)^)=TypeOf(rauber)
317 | THEN z := z + 1;
318 | IF TypeOF(t(.x^.v^.v^.i,y^.i .)^)=TypeOf(rauber)
319 | THEN z := z + 1;
320 | IF TypeOF(t(.x^.v^.v^.i,y^.n^.i .)^)=TypeOf(rauber)
321 | THEN z := z + 1;
322 | IF TypeOF(t(.x^.v^.v^.i,y^.n^.n^.i.)^)=TypeOf(rauber)
323 | THEN z := z + 1;
324 | IF TypeOF(t(.x^.v^.i ,y^.v^.v^.i.)^)=TypeOf(rauber)
325 | THEN z := z + 1;
326 | IF TypeOF(t(.x^.v^.i ,y^.n^.n^.i.)^)=TypeOf(rauber)
327 | THEN z := z + 1;
328 | IF TypeOF(t(.x^.i ,y^.v^.v^.i.)^)=TypeOf(rauber)
329 | THEN z := z + 1;
330 | IF TypeOF(t(.x^.i ,y^.n^.n^.i.)^)=TypeOf(rauber)
331 | THEN z := z + 1;
332 | IF TypeOF(t(.x^.n^.i ,y^.v^.v^.i.)^)=TypeOf(rauber)
333 | THEN z := z + 1;
334 | IF TypeOF(t(.x^.n^.i ,y^.n^.n^.i.)^)=TypeOf(rauber)
335 | THEN z := z + 1;
336 | IF TypeOF(t(.x^.n^.n^.i,y^.v^.v^.i.)^)=TypeOf(rauber)
337 | THEN z := z + 1;
338 | IF TypeOF(t(.x^.n^.n^.i,y^.v^.i .)^)=TypeOf(rauber)
339 | THEN z := z + 1;
340 | IF TypeOF(t(.x^.n^.n^.i,y^.i .)^)=TypeOf(rauber)
341 | THEN z := z + 1;
342 | IF TypeOF(t(.x^.n^.n^.i,y^.n^.i .)^)=TypeOf(rauber)
343 | THEN z := z + 1;
344 | IF TypeOF(t(.x^.n^.n^.i,y^.n^.n^.i.)^)=TypeOf(rauber)
345 | THEN z := z + 1;
346 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(rauber)
347 | THEN z := z+1;
348 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(rauber)
349 | THEN z := z+1;
350 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(rauber)
351 | THEN z := z+1;
352 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(rauber)
353 | THEN z := z+1;
354 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(rauber)
355 | THEN z := z+1;
356 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(rauber)
357 | THEN z := z+1;
358 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(rauber)
359 | THEN z := z+1;
360 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(rauber)
361 | THEN z := z+1;
362 |
363 | END;
364 |
365 | IF Z > 0
366 | THEN gefahr := true ELSE gefahr := false;
367 |
368 | END;
369 |
370 | PROCEDURE weider.Bfutter(VAR x,y:Tzahl;VAR t:Ttorus);
371 | VAR z :integer;
372 | BEGIN
373 |
374 | z := 0;
375 | IF Fn
376 | THEN
377 | BEGIN
378 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(nahrung)
379 | THEN z := z + 1;
380 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(nahrung)
381 | THEN z := z + 1;
382 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(nahrung)
383 | THEN z := z + 1;
384 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(nahrung)
385 | THEN z := z + 1;
386 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(nahrung)
387 | THEN z := z + 1;
388 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(nahrung)
389 | THEN z := z + 1;
390 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(nahrung)
391 | THEN z := z + 1;
392 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(nahrung)
393 | THEN z := z + 1;
394 | END;
395 |
396 | IF Z > 0
397 | THEN futter := true ELSE futter := false;
398 |
399 |
400 | END;
401 |
402 | function weider.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
403 | VAR z:integer;
404 | BEGIN
405 | z := 0;
406 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider)
407 | THEN z := z+1;
408 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider)
409 | THEN z := z+1;
410 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider)
411 | THEN z := z+1;
412 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider)
413 | THEN z := z+1;
414 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider)
415 | THEN z := z+1;
416 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider)
417 | THEN z := z+1;
418 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider)
419 | THEN z := z+1;
420 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider)
421 | THEN z := z+1;
422 | IF z> 3 THEN nloeschen := true
423 | ELSE nloeschen := false;
424 |
425 | END;
426 |
427 | procedure weider.Rweidererkennen(VAR x,y:Tzahl;VAR t:Ttorus);
428 | VAR Z:integer;
429 | BEGIN
430 | z := 0;
431 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider)
432 | THEN z := z + 1;
433 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider)
434 | THEN z := z + 1;
435 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider)
436 | THEN z := z + 1;
437 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider)
438 | THEN z := z + 1;
439 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider)
440 | THEN z := z + 1;
441 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider)
442 | THEN z := z + 1;
443 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider)
444 | THEN z := z + 1;
445 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider)
446 | THEN z := z + 1;
447 |
448 | IF ((z > 0) AND Fk)
449 | THEN weidererkennen :=true ELSE weidererkennen :=false;
450 | END;
451 |
452 | function weider.getkooperatoren(VAR x,y:Tzahl;VAR t:Ttorus):integer;
453 | VAR z:integer;
454 | BEGIN
455 | z := 0;
456 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(weider)
457 | THEN
458 | BEGIN
459 | Aweider := Wweider;
460 | REPEAT
461 | Aweider := Aweider^.nach
462 | UNTIL @Aweider^ =@t(.x^.v^.i,y^.v^.i.)^;
463 | IF Aweider^.kooperieren THEN z:=z+1;
464 | END;
465 |
466 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(weider)
467 | THEN
468 | BEGIN
469 | Aweider := Wweider;
470 | REPEAT
471 | Aweider := Aweider^.nach
472 | UNTIL @Aweider^ =@t(.x^.v^.i,y^.i .)^;
473 | IF Aweider^.kooperieren THEN z:=z+1;
474 | END;
475 |
476 |
477 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(weider)
478 | THEN
479 | BEGIN
480 | Aweider := Wweider;
481 | REPEAT
482 | Aweider := Aweider^.nach
483 | UNTIL @Aweider^ =@t(.x^.v^.i,y^.n^.i.)^;
484 | IF Aweider^.kooperieren THEN z:=z+1;
485 | END;
486 |
487 |
488 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(weider)
489 | THEN
490 | BEGIN
491 | Aweider := Wweider;
492 | REPEAT
493 | Aweider := Aweider^.nach
494 | UNTIL @Aweider^ =@t(.x^.i ,y^.v^.i.)^;
495 | IF Aweider^.kooperieren THEN z:=z+1;
496 | END;
497 |
498 |
499 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(weider)
500 | THEN
501 | BEGIN
502 | Aweider := Wweider;
503 | REPEAT
504 | Aweider := Aweider^.nach
505 | UNTIL @Aweider^ =@t(.x^.i ,y^.n^.i.)^;
506 | IF Aweider^.kooperieren THEN z:=z+1;
507 | END;
508 |
509 |
510 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(weider)
511 | THEN
512 | BEGIN
513 | Aweider := Wweider;
514 | REPEAT
515 | Aweider := Aweider^.nach
516 | UNTIL @Aweider^ =@t(.x^.n^.i,y^.v^.i.)^;
517 | IF Aweider^.kooperieren THEN z:=z+1;
518 | END;
519 |
520 |
521 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(weider)
522 | THEN
523 | BEGIN
524 | Aweider := Wweider;
525 | REPEAT
526 | Aweider := Aweider^.nach
527 | UNTIL @Aweider^ =@t(.x^.n^.i,y^.i .)^;
528 | IF Aweider^.kooperieren THEN z:=z+1;
529 | END;
530 |
531 |
532 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(weider)
533 | THEN
534 | BEGIN
535 | Aweider := Wweider;
536 | REPEAT
537 | Aweider := Aweider^.nach
538 | UNTIL @Aweider^ =@t(.x^.n^.i,y^.n^.i.)^;
539 | IF Aweider^.kooperieren THEN z:=z+1;
540 | END;
541 |
542 | (*IF Z>0 THEN z:=1 ELSE z:=-1;*)
543 | getkooperatoren :=z;
544 | END;
545 |
546 | procedure weider.Rkooperieren;
547 | BEGIN
548 | IF(weidererkennen and Rk)
549 | THEN kooperieren:=true;
550 | END;
551 |
552 | PROCEDURE weider.Rfressen (VAR x,y:Tzahl;VAR t:Ttorus);
553 | BEGIN
554 | IF(futter and Rn)
555 | THEN
556 | BEGIN
557 | fit := fit + 1+weider.getkooperatoren(x,y,t);
558 | IF NOT(kooperieren) THEN fit := fit + 1;
559 | END;
560 | END;
561 |
562 | PROCEDURE weider.Rverteidigung;
563 | BEGIN
564 | IF (gefahr and Rg)
565 | THEN verteidigen := true
566 | ELSE verteidigen := false
567 | END;
568 |
569 | PROCEDURE weider.Rfit (zahl:integer);
570 | BEGIN
571 | fit := fit + zahl;
572 | END;
573 |
574 | FUNCTION weider.getfit:integer;
575 | BEGIN
576 | getfit := fit;
577 | END;
578 |
579 | FUNCTION weider.getgefahr:boolean;
580 | BEGIN
581 | getgefahr := gefahr;
582 | END;
583 |
584 |
585 | FUNCTION weider.getverteidigen:boolean;
586 | BEGIN
587 | getverteidigen := verteidigen;
588 | END;
589 |
590 | FUNCTION weider.getfressen:boolean;
591 | BEGIN
592 | getfressen := Rn;
593 | END;
594 |
595 | CONSTRUCTOR rauber.init;
596 | BEGIN
597 | END;
598 |
599 | DESTRUCTOR rauber.done;
600 | BEGIN
601 | END;
602 |
603 | function rauber.rloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
604 | VAR z:integer;
605 | BEGIN
606 | z := 0;
607 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(rauber)
608 | THEN z := z+1;
609 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(rauber)
610 | THEN z := z+1;
611 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(rauber)
612 | THEN z := z+1;
613 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(rauber)
614 | THEN z := z+1;
615 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(rauber)
616 | THEN z := z+1;
617 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(rauber)
618 | THEN z := z+1;
619 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(rauber)
620 | THEN z := z+1;
621 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(rauber)
622 | THEN z := z+1;
623 | IF z > 3 THEN rloeschen := true
624 | ELSE rloeschen := false;
625 |
626 | END;
627 | CONSTRUCTOR nahrung.init;
628 | BEGIN
629 | END;
630 |
631 | DESTRUCTOR nahrung.done;
632 | BEGIN
633 | END;
634 |
635 | function nahrung.nloeschen(VAR x,y:Tzahl;VAR t:Ttorus):boolean;
636 | VAR z:integer;
637 | BEGIN
638 | z := 0;
639 | IF TypeOF(t(.x^.v^.i,y^.v^.i.)^)=TypeOF(nahrung)
640 | THEN z := z+1;
641 | IF TypeOF(t(.x^.v^.i,y^.i .)^)=TypeOF(nahrung)
642 | THEN z := z+1;
643 | IF TypeOF(t(.x^.v^.i,y^.n^.i.)^)=TypeOF(nahrung)
644 | THEN z := z+1;
645 | IF TypeOF(t(.x^.i ,y^.v^.i.)^)=TypeOF(nahrung)
646 | THEN z := z+1;
647 | IF TypeOF(t(.x^.i ,y^.n^.i.)^)=TypeOF(nahrung)
648 | THEN z := z+1;
649 | IF TypeOF(t(.x^.n^.i,y^.v^.i.)^)=TypeOF(nahrung)
650 | THEN z := z+1;
651 | IF TypeOF(t(.x^.n^.i,y^.i .)^)=TypeOF(nahrung)
652 | THEN z := z+1;
653 | IF TypeOF(t(.x^.n^.i,y^.n^.i.)^)=TypeOF(nahrung)
654 | THEN z := z+1;
655 | IF z> 3 THEN nloeschen := true
656 | ELSE nloeschen := false;
657 |
658 | END;
659 |
660 |
661 |
662 |
663 | (*----------------------- Prozeduren -----------------*)
664 | FUNCTION test:CHAR;
665 | VAR Z:integer;
666 | BEGIN
667 | z := random(2);
668 | IF z = 0
669 | THEN test := '0'
670 | ELSE test := '1'
671 | END;
672 | PROCEDURE aufbaugene;
673 | VAR z,z1 :integer;
674 | BEGIN
675 | NEW(Wgen);
676 | NEW(Agen);
677 | Wgen := Agen;
678 | FOR z1 := 1 TO 6 DO Agen^.g(.z1.) := test;
679 | NEW(Ngen);
680 | Ngen^.vor := Agen;
681 | Agen^.nach := Ngen;
682 | Agen := Ngen;
683 | FOR z := 1 TO 15
684 | DO
685 | BEGIN
686 | FOR z1 := 1 TO 6 DO Agen^.g(.z1.) := test;
687 | NEW(Ngen);
688 | Ngen^.vor := Agen;
689 | Agen^.nach := Ngen;
690 | Agen := Ngen;
691 | END;
692 | Agen^.nach := Wgen;
693 | Wgen^.vor := Agen;
694 | END;
695 | PROCEDURE abbaugene(z:TPgen);
696 | BEGIN
697 | IF z <> Wgen THEN abbaugene(z^.nach);
698 | dispose(z)
699 | END;
700 |
701 | PROCEDURE crossing_over;
702 | VAR
703 | max1,max2,
704 | fit,
705 | co1,co2 :TPweider;
706 | g1,g2 :TPgen;
707 | ch :CHAR;
708 | z1,z2,z3,z4:Integer;
709 | BEGIN
710 | sound(440);delay(100);nosound;
711 | NEW(max1,init);
712 | NEW(max2,init);
713 | NEW(fit,init);
714 | NEW(co1,init);
715 | NEW(co2,init);
716 | NEW(g1);
717 | NEW(g2);
718 | max1 := Wweider;
719 | max2 := Wweider^.nach;
720 | fit^.fit := 0;
721 | fit^.gen := max1^.gen;
722 | REPEAT
723 | IF fit^.getfit < max1^.getfit
724 | THEN BEGIN
725 | fit^.fit := max1^.getfit;
726 | fit^.gen := max1^.gen;
727 | END;
728 | Max1 := max1^.nach;
729 | UNTIL max1 = Wweider;
730 | Wweider^.gen := fit^.gen;
731 | max1 := Wweider;
732 | fit^.fit := 0;
733 | fit^.gen := max2^.gen;
734 | REPEAT
735 | IF fit^.getfit < max2^.getfit
736 | THEN BEGIN
737 | fit^.fit := max2^.getfit;
738 | fit^.gen := max2^.gen;
739 | END;
740 | max2 := max2^.nach;
741 | UNTIL max2 = Wweider;
742 | Wweider^.nach^.gen := fit^.gen;
743 | max2 := Wweider^.nach;
744 | co1 := max2^.nach;
745 | co2 := co1^.nach;
746 | g1^.g := max1^.gen^.g;
747 | g2^.g := max2^.gen^.g;
748 | max1^.fit := maxfit;
749 | max2^.fit := maxfit;
750 | REPEAT
751 | z1 := random(6)+1;
752 | z2 := random(6)+1;
753 | Co1^.gen^.g := g1^.g;
754 | co1^.fit := maxfit;
755 | Co2^.gen^.g := g2^.g;
756 | co2^.fit := maxfit;
757 | ch:=co1^.gen^.g(.z1.);
758 | co1^.gen^.g(.z1.):=co2^.gen^.g(.z2.);
759 | co2^.gen^.g(.z2.):= ch;
760 | z1 := random(3);
761 | IF z1 = 0
762 | THEN
763 | BEGIN
764 | sound(1000);delay(100);nosound;
765 | z1 := random(6)+1;
766 | z2 := random(6)+1;
767 | z3 :=random(2);
768 | z4 := random(2);
769 | IF z3 = 1
770 | THEN
771 | BEGIN
772 | IF co1^.gen^.g(.z1.)='1'
773 | THEN co1^.gen^.g(.z1.):='0'
774 | ELSE co1^.gen^.g(.z1.):='1';
775 | END;
776 |
777 | IF z4 = 1
778 | THEN
779 | BEGIN
780 | IF co1^.gen^.g(.z2.)='1'
781 | THEN co1^.gen^.g(.z2.):='0'
782 | ELSE co1^.gen^.g(.z2.):='1';
783 | END;
784 | END;
785 | co1 := co2^.nach;
786 | co2 := co2^.nach^.nach;
787 | UNTIL co1 = Wweider;
788 | Aweider := Wweider;
789 | REPEAT
790 | IF Aweider^.gen^.g(.Fn.) = '1' THEN Aweider^.Fn := true
791 | ELSE Aweider^.Fn := false;
792 | IF Aweider^.gen^.g(.Fg.) = '1' THEN Aweider^.Fg := true
793 | ELSE Aweider^.Fg := false;
794 | IF Aweider^.gen^.g(.Rn.) = '1' THEN Aweider^.Rn := true
795 | ELSE Aweider^.Rn := false;
796 | IF Aweider^.gen^.g(.Rg.) = '1' THEN Aweider^.Rg := true
797 | ELSE Aweider^.Rg := false;
798 | IF Aweider^.gen^.g(.Fk.) = '1' THEN Aweider^.Fk := true
799 | ELSE Aweider^.Fk := false;
800 | IF Aweider^.gen^.g(.Rk.) = '1' THEN Aweider^.Rk := true
801 | ELSE Aweider^.Rk := false;
802 | Aweider := Aweider^.nach;
803 | UNTIL Aweider = Wweider;
804 | END;
805 |
806 | PROCEDURE aufbauweider;
807 | VAR z :integer;
808 | BEGIN
809 | NEW(Wweider,init);
810 | NEW(Aweider,init);
811 | NEW(Nweider,init);
812 | NWEIDER^.leer;
813 | Nweider := Wweider;
814 | Aweider := Nweider;
815 | Agen := Wgen;
816 | Aweider^.fit := maxfit;
817 | Aweider^.gen := Agen;
818 | IF Aweider^.gen^.g(.Fn.) = '1' THEN Aweider^.Fn := true
819 | ELSE Aweider^.Fn := false;
820 | IF Aweider^.gen^.g(.Fg.) = '1' THEN Aweider^.Fg := true
821 | ELSE Aweider^.Fg := false;
822 | IF Aweider^.gen^.g(.Rn.) = '1' THEN Aweider^.Rn := true
823 | ELSE Aweider^.Rn := false;
824 | IF Aweider^.gen^.g(.Rg.) = '1' THEN Aweider^.Rg := true
825 | ELSE Aweider^.Rg := false;
826 | IF Aweider^.gen^.g(.Fk.) = '1' THEN Aweider^.Fk := true
827 | ELSE Aweider^.Fk := false;
828 | IF Aweider^.gen^.g(.Rk.) = '1' THEN Aweider^.Rk := true
829 | ELSE Aweider^.Rk := false;
830 | FOR z := 1 TO 15
831 | DO
832 | BEGIN
833 | NEW(Nweider,init);
834 | Nweider^.leer;
835 | Aweider^.nach := Nweider;
836 | Nweider^.vor := Aweider;
837 | Aweider := Nweider;
838 | Agen := Agen^.nach;
839 | Aweider^.gen := Agen;
840 | IF Aweider^.gen^.g(.Fn.) = '1' THEN Aweider^.Fn := true
841 | ELSE Aweider^.Fn := false;
842 | IF Aweider^.gen^.g(.Fg.) = '1' THEN Aweider^.Fg := true
843 | ELSE Aweider^.Fg := false;
844 | IF Aweider^.gen^.g(.Rn.) = '1' THEN Aweider^.Rn := true
845 | ELSE Aweider^.Rn := false;
846 | IF Aweider^.gen^.g(.Rg.) = '1' THEN Aweider^.Rg := true
847 | ELSE Aweider^.Rg := false;
848 | IF Aweider^.gen^.g(.Fk.) = '1' THEN Aweider^.Fk := true
849 | ELSE Aweider^.Fk := false;
850 | IF Aweider^.gen^.g(.Rk.) = '1' THEN Aweider^.Rk := true
851 | ELSE Aweider^.Rk := false;
852 |
853 | END;
854 | Aweider^.nach := Wweider;
855 | Wweider^.vor := Aweider;
856 | END;
857 | PROCEDURE abbauweider(z:TPweider);
858 | BEGIN
859 | IF z <> Wweider THEN abbauweider(z^.nach);
860 | DISPOSE(z,done);
861 | END;
862 | PROCEDURE aufbaurauber;
863 | BEGIN
864 | NEW(Wrauber,init)
865 | END;
866 | PROCEDURE abbaurauber;
867 | BEGIN
868 | DISPOSE(Wrauber,done);
869 | END;
870 | PROCEDURE aufbaunahrung;
871 | BEGIN
872 | new(Wnahrung,init);
873 | END;
874 | PROCEDURE abbaunahrung;
875 | BEGIN
876 | DISPOSE(Wnahrung,done);
877 | END;
878 | PROCEDURE aufbauzelle;
879 | BEGIN
880 | NEW(Wzelle,init)
881 | END;
882 | PROCEDURE abbauzelle;
883 | BEGIN
884 | DISPOSE(Wzelle,done)
885 | END;
886 | PROCEDURE aufbau;
887 | VAR z:integer;
888 | BEGIN
889 | z := 1;
890 | new(n);
891 | xa := n;
892 | x := n;
893 | x^.i := z;
894 | REPEAT
895 | z := z +1;
896 | new(n);
897 | x^.n := n;
898 | n^.v := x;
899 | x := n;
900 | x^.i := z;
901 | UNTIL z = 80;
902 | x^.n := xa;
903 | xa^.v := x;
904 |
905 | z := 1;
906 | new(n);
907 | ya := n;
908 | y := n;
909 | y^.i := z;
910 | REPEAT
911 | z := z +1;
912 | new(n);
913 | y^.n := n;
914 | n^.v := y;
915 | y := n;
916 | y^.i := z;
917 | UNTIL z = 24;
918 | y^.n := ya;
919 | ya^.v := y;
920 | END;
921 |
922 | PROCEDURE abbaux(x:Tzahl);
923 | BEGIN
924 | IF x^.n <> xa THEN abbaux(x^.n);
925 | dispose(x);
926 | END;
927 |
928 | PROCEDURE abbauy(y:Tzahl);
929 | BEGIN
930 | IF y^.n <> ya THEN abbauy(y^.n);
931 | dispose(y);
932 | END;
933 |
934 | FUNCTION neu (VAR r:Ttorus; VAR x,y:Tzahl):TPzelle;
935 | VAR z:TPzelle;
936 | BEGIN
937 | z := r(.x^.i,y^.i.);
938 | IF TypeOF(z^) = TypeOf(rauber)
939 | THEN
940 | BEGIN
941 | IF Wrauber^.rloeschen(x,y,r) THEN neu := Wzelle
942 | ELSE neu := z;
943 | END
944 | ELSE
945 | BEGIN
946 | IF TypeOF(z^) = TypeOf(nahrung)
947 | THEN
948 | BEGIN
949 | IF Wnahrung^.nloeschen(x,y,r) THEN neu := Wzelle
950 | ELSE neu := z;
951 | END
952 | ELSE
953 | BEGIN
954 | IF TypeOF(z^) = TypeOf(weider)
955 | THEN
956 | BEGIN
957 | (*neu := z;*)
958 | Aweider := Wweider;
959 | REPEAT
960 | Aweider := Aweider^.nach
961 | UNTIL @Aweider^ =@z^;
962 | (*Aweider^.init; schon beim Aufbau Konsturktor aufgerufen*)
963 | IF Aweider^.nloeschen(x,y,r)
964 | THEN neu := Wzelle
965 | ELSE
966 | IF Aweider^.getfit = 0
967 | THEN
968 | neu:= Wzelle
969 | ELSE
970 | BEGIN
971 | Aweider^.Rfit(stoffwechsel);
972 | Aweider^.Bgefahr(x,y,r);
973 | Aweider^.Rverteidigung;
974 | Aweider^.Rweidererkennen(x,y,r);
975 | Aweider^.Rkooperieren;
976 | IF ((Aweider^.getgefahr)AND NOT(Aweider^.getverteidigen))
977 | THEN
978 | BEGIN
979 | Aweider^.Rfit(-1*(Aweider^.getfit));
980 | neu := Wzelle;
981 | END
982 | ELSE
983 | BEGIN
984 | Aweider^.Bfutter(x,y,r);
985 | Aweider^.Rfressen(x,y,r);
986 | neu := @Aweider^;
987 | END
988 | END;
989 | END
990 | ELSE
991 | BEGIN
992 | IF TypeOF(z^) = TypeOf(zelle)
993 | THEN
994 | BEGIN
995 | IF z^.nnahrung(x,y,r)
996 | THEN neu:= Wnahrung
997 | ELSE
998 | BEGIN
999 | IF z^.nrauber(x,y,r)
1000 | THEN neu:= Wrauber
1001 | ELSE
1002 | BEGIN
1003 | IF z^.nweider(x,y,r)
1004 | THEN neu:= Aweider
1005 | ELSE neu := z
1006 | END;
1007 | END
1008 | END
1009 | END
1010 | END
1011 | END
1012 | END;
1013 |
1014 |
1015 | PROCEDURE spiel(VAR von,nach :Ttorus);
1016 | BEGIN
1017 | x:=xa;
1018 | y:=ya;
1019 | REPEAT
1020 | REPEAT
1021 | nach(.x^.i,y^.i.):= neu(von,x,y);
1022 | x := x^.n
1023 | UNTIL x =xa;
1024 | y := y^.n
1025 | UNTIL y =ya;
1026 | END;
1027 |
1028 | PROCEDURE zufall(VAR a:Ttorus);
1029 | VAR z :integer;
1030 | BEGIN
1031 |
1032 | Aweider := Wweider;
1033 | y :=ya;
1034 | x :=xa;
1035 | REPEAT
1036 | REPEAT
1037 | (*Zufallsbelegung*)
1038 | z := random(100);
1039 | CASE z OF
1040 | 0: a(.x^.i,y^.i.) := Wnahrung;
1041 | 1: a(.x^.i,y^.i.) := Wrauber;
1042 | 2: a(.x^.i,y^.i.) := Wzelle;
1043 | 3: BEGIN
1044 | a(.x^.i,y^.i.):= Aweider;
1045 | Aweider := Aweider^.nach;
1046 | END
1047 | ELSE a(.x^.i,y^.i.) := Wzelle;
1048 | END;
1049 | x := x^.n
1050 | UNTIL x =xa;
1051 | y := y^.n
1052 | UNTIL y =ya;
1053 | Aweider:= Wweider;
1054 | END;
1055 |
1056 |
1057 |
1058 |
1059 | end.
1060 |
1061 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Ökologische Simulation - Zellularautomat & Genetischer Algorithmus
7 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 | Home
394 | Düsk
395 | Ars
396 | Pompeji
397 | Pencil
398 | Primaten
399 | GenAlg
400 | Chessteg
401 |
402 |
403 |
404 |
Ökologische Simulation
405 |
Zellularautomat mit Genetischem Algorithmus - Räuber-Beute-System mit evolutionärer Anpassung
406 |
Cellular automaton with genetic algorithm - Predator-prey system with evolutionary adaptation
407 |
408 |
409 |
410 |
411 |
Ökologische Simulation
412 |
413 | Diese Simulation kombiniert Zellularautomaten mit genetischen Algorithmen zur Modellierung von Räuber-Beute-Beziehungen. Weider (Pflanzenfresser) entwickeln durch evolutionäre Prozesse Strategien zur Nahrungssuche, Gefahrenerkennung und Kooperation. Das System zeigt emergente Phänomene ökologischer Dynamiken.
414 |
415 |
416 | This simulation combines cellular automata with genetic algorithms to model predator-prey relationships. Grazers develop strategies for foraging, danger recognition, and cooperation through evolutionary processes. The system shows emergent phenomena of ecological dynamics.
417 |
418 |
421 |
422 |
423 |
424 |
425 |
426 |
Genetischer Algorithmus
427 |
428 | Sechs Gene steuern das Verhalten der Weider: Nahrungserkennung, Gefahrenwahrnehmung, Fressverhalten, Verteidigung, Artgenossenerkennung und Kooperation. Durch Selektion, Crossover und Mutation entstehen optimierte Überlebensstrategien über Generationen hinweg.
429 |
430 |
431 | Six genes control grazer behavior: food recognition, danger perception, feeding behavior, defense, conspecific recognition, and cooperation. Through selection, crossover and mutation, optimized survival strategies emerge across generations.
432 |
433 |
436 |
437 |
438 |
439 |
440 |
441 |
Zellularautomat
442 |
443 | Auf einem 80x24 Torus-Gitter interagieren Nahrung, Räuber und Weider nach lokalen Regeln. Das System zeigt komplexe Musterbildung, Populationszyklen und räumliche Selbstorganisation trotz einfacher Einzelregeln.
444 |
445 |
446 | On an 80x24 torus grid, food, predators and grazers interact according to local rules. The system shows complex pattern formation, population cycles and spatial self-organization despite simple individual rules.
447 |
448 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
Ökologische Simulation - Zellularautomat & Genetischer Algorithmus
459 |
460 |
461 |
▶ Start
462 |
⏸ Stopp
463 |
🔁 Zurücksetzen
464 |
465 |
Geschwindigkeit:
466 |
467 | Langsam
468 | Mittel
469 | Schnell
470 | Sehr schnell
471 |
472 |
473 |
474 |
Bereit zur Simulation
475 |
476 |
477 |
478 |
Generation: 1
479 |
Nahrung: 0
480 |
Räuber: 0
481 |
Weider: 0
482 |
Durchschnittliche Fitness: 80
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
0
493 |
Nahrung
494 |
495 |
496 |
0
497 |
Räuber
498 |
499 |
500 |
0
501 |
Weider
502 |
503 |
504 |
505 |
506 |
Leer
507 |
Nahrung
508 |
Räuber
509 |
Weider
510 |
511 |
512 |
513 |
514 |
515 |
516 |
Genetische Information
517 |
Generation: 1
518 |
Aktive Genome: 0
519 |
522 |
523 |
524 |
Simulationsparameter
525 |
526 | Mutationsrate:
527 |
528 | 10%
529 |
530 |
531 | Selektionsdruck:
532 |
533 | 25%
534 |
535 |
536 |
537 |
538 |
539 |
540 |
Genetische Codes - Generation 1
541 |
542 |
543 |
544 |
Fn: Nahrung erkennen
545 |
546 |
547 |
548 |
Fg: Gefahr erkennen
549 |
550 |
551 |
552 |
Rn: Fressen
553 |
554 |
555 |
556 |
Rg: Verteidigung
557 |
558 |
559 |
560 |
Fk: Weider erkennen
561 |
562 |
563 |
564 |
Rk: Kooperieren
565 |
566 |
567 |
568 |
569 |
570 | ID
571 | Gen-Code
572 | Fitness
573 | Aktiv
574 | Verteilung
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
595 |
596 |
1219 |
1220 |
1221 |
1222 |
1223 |
1224 |
1225 |
1226 |
--------------------------------------------------------------------------------