├── 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 | ![](./genalgscreen.png) 5 | 6 | ![](./genalgPY.png) 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 | <ResourceType Value="res"/> 11 | <UseXPManifest Value="True"/> 12 | <Icon Value="0"/> 13 | </General> 14 | <i18n> 15 | <EnableI18N LFM="False"/> 16 | </i18n> 17 | <VersionInfo> 18 | <StringTable ProductVersion=""/> 19 | </VersionInfo> 20 | <BuildModes Count="1"> 21 | <Item1 Name="Default" Default="True"/> 22 | </BuildModes> 23 | <PublishOptions> 24 | <Version Value="2"/> 25 | </PublishOptions> 26 | <RunParams> 27 | <local> 28 | <FormatVersion Value="1"/> 29 | </local> 30 | </RunParams> 31 | <RequiredPackages Count="1"> 32 | <Item1> 33 | <PackageName Value="LCL"/> 34 | </Item1> 35 | </RequiredPackages> 36 | <Units Count="3"> 37 | <Unit0> 38 | <Filename Value="genalgess.lpr"/> 39 | <IsPartOfProject Value="True"/> 40 | </Unit0> 41 | <Unit1> 42 | <Filename Value="umain.pas"/> 43 | <IsPartOfProject Value="True"/> 44 | <ComponentName Value="frmMain"/> 45 | <HasResources Value="True"/> 46 | <ResourceBaseClass Value="Form"/> 47 | <UnitName Value="UMain"/> 48 | </Unit1> 49 | <Unit2> 50 | <Filename Value="unitgenalgess.pas"/> 51 | <IsPartOfProject Value="True"/> 52 | <UnitName Value="Unitgenalgess"/> 53 | </Unit2> 54 | </Units> 55 | </ProjectOptions> 56 | <CompilerOptions> 57 | <Version Value="11"/> 58 | <PathDelim Value="\"/> 59 | <Target> 60 | <Filename Value="genalgess"/> 61 | </Target> 62 | <SearchPaths> 63 | <IncludeFiles Value="$(ProjOutDir)"/> 64 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 65 | </SearchPaths> 66 | <Linking> 67 | <Options> 68 | <Win32> 69 | <GraphicApplication Value="True"/> 70 | </Win32> 71 | </Options> 72 | </Linking> 73 | </CompilerOptions> 74 | <Debugging> 75 | <Exceptions Count="3"> 76 | <Item1> 77 | <Name Value="EAbort"/> 78 | </Item1> 79 | <Item2> 80 | <Name Value="ECodetoolError"/> 81 | </Item2> 82 | <Item3> 83 | <Name Value="EFOpenError"/> 84 | </Item3> 85 | </Exceptions> 86 | </Debugging> 87 | </CONFIG> 88 | -------------------------------------------------------------------------------- /genalg.lps: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectSession> 4 | <PathDelim Value="\"/> 5 | <Version Value="10"/> 6 | <BuildModes Active="Default"/> 7 | <Units Count="3"> 8 | <Unit0> 9 | <Filename Value="genalgess.lpr"/> 10 | <IsPartOfProject Value="True"/> 11 | <EditorIndex Value="2"/> 12 | <CursorPos X="25" Y="10"/> 13 | <UsageCount Value="23"/> 14 | <Loaded Value="True"/> 15 | </Unit0> 16 | <Unit1> 17 | <Filename Value="umain.pas"/> 18 | <IsPartOfProject Value="True"/> 19 | <ComponentName Value="frmMain"/> 20 | <HasResources Value="True"/> 21 | <ResourceBaseClass Value="Form"/> 22 | <UnitName Value="UMain"/> 23 | <TopLine Value="58"/> 24 | <CursorPos Y="88"/> 25 | <UsageCount Value="23"/> 26 | <Loaded Value="True"/> 27 | <LoadedDesigner Value="True"/> 28 | </Unit1> 29 | <Unit2> 30 | <Filename Value="unitgenalgess.pas"/> 31 | <IsPartOfProject Value="True"/> 32 | <UnitName Value="Unitgenalgess"/> 33 | <IsVisibleTab Value="True"/> 34 | <EditorIndex Value="1"/> 35 | <TopLine Value="145"/> 36 | <CursorPos X="42" Y="41"/> 37 | <UsageCount Value="23"/> 38 | <Loaded Value="True"/> 39 | </Unit2> 40 | </Units> 41 | <JumpHistory Count="18" HistoryIndex="17"> 42 | <Position1> 43 | <Filename Value="unitgenalgess.pas"/> 44 | <Caret Column="15"/> 45 | </Position1> 46 | <Position2> 47 | <Filename Value="genalgess.lpr"/> 48 | </Position2> 49 | <Position3> 50 | <Filename Value="genalgess.lpr"/> 51 | <Caret Line="10" Column="26"/> 52 | </Position3> 53 | <Position4> 54 | <Filename Value="umain.pas"/> 55 | <Caret Line="9" Column="29"/> 56 | </Position4> 57 | <Position5> 58 | <Filename Value="umain.pas"/> 59 | <Caret Line="89" TopLine="70"/> 60 | </Position5> 61 | <Position6> 62 | <Filename Value="umain.pas"/> 63 | <Caret Line="141" Column="5" TopLine="98"/> 64 | </Position6> 65 | <Position7> 66 | <Filename Value="umain.pas"/> 67 | <Caret Line="123" Column="2" TopLine="82"/> 68 | </Position7> 69 | <Position8> 70 | <Filename Value="umain.pas"/> 71 | <Caret Line="33" TopLine="10"/> 72 | </Position8> 73 | <Position9> 74 | <Filename Value="umain.pas"/> 75 | <Caret Line="102" Column="23" TopLine="80"/> 76 | </Position9> 77 | <Position10> 78 | <Filename Value="umain.pas"/> 79 | <Caret Line="93" Column="3" TopLine="81"/> 80 | </Position10> 81 | <Position11> 82 | <Filename Value="umain.pas"/> 83 | <Caret Line="73" Column="22" TopLine="69"/> 84 | </Position11> 85 | <Position12> 86 | <Filename Value="umain.pas"/> 87 | <Caret Line="41" Column="5" TopLine="19"/> 88 | </Position12> 89 | <Position13> 90 | <Filename Value="umain.pas"/> 91 | <Caret Line="109" Column="8" TopLine="79"/> 92 | </Position13> 93 | <Position14> 94 | <Filename Value="umain.pas"/> 95 | <Caret Line="111" Column="77" TopLine="86"/> 96 | </Position14> 97 | <Position15> 98 | <Filename Value="unitgenalgess.pas"/> 99 | <Caret Line="181" Column="42" TopLine="146"/> 100 | </Position15> 101 | <Position16> 102 | <Filename Value="unitgenalgess.pas"/> 103 | <Caret Line="166" TopLine="143"/> 104 | </Position16> 105 | <Position17> 106 | <Filename Value="unitgenalgess.pas"/> 107 | <Caret Line="179" Column="24" TopLine="145"/> 108 | </Position17> 109 | <Position18> 110 | <Filename Value="umain.pas"/> 111 | <Caret Line="96" Column="28" TopLine="69"/> 112 | </Position18> 113 | </JumpHistory> 114 | </ProjectSession> 115 | </CONFIG> 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 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectSession> 4 | <PathDelim Value="\"/> 5 | <Version Value="10"/> 6 | <BuildModes Active="Default"/> 7 | <Units Count="5"> 8 | <Unit0> 9 | <Filename Value="genalgess.lpr"/> 10 | <IsPartOfProject Value="True"/> 11 | <UsageCount Value="26"/> 12 | </Unit0> 13 | <Unit1> 14 | <Filename Value="umain.pas"/> 15 | <IsPartOfProject Value="True"/> 16 | <ComponentName Value="frmMain"/> 17 | <HasResources Value="True"/> 18 | <ResourceBaseClass Value="Form"/> 19 | <UnitName Value="UMain"/> 20 | <TopLine Value="85"/> 21 | <CursorPos X="20" Y="133"/> 22 | <UsageCount Value="26"/> 23 | <Loaded Value="True"/> 24 | </Unit1> 25 | <Unit2> 26 | <Filename Value="unitgenalgess.pas"/> 27 | <IsPartOfProject Value="True"/> 28 | <UnitName Value="Unitgenalgess"/> 29 | <EditorIndex Value="1"/> 30 | <TopLine Value="747"/> 31 | <CursorPos X="17" Y="760"/> 32 | <UsageCount Value="26"/> 33 | <Loaded Value="True"/> 34 | </Unit2> 35 | <Unit3> 36 | <Filename Value="C:\lazarus\lcl\include\control.inc"/> 37 | <EditorIndex Value="-1"/> 38 | <TopLine Value="3646"/> 39 | <CursorPos Y="3668"/> 40 | <UsageCount Value="12"/> 41 | </Unit3> 42 | <Unit4> 43 | <Filename Value="umain.lfm"/> 44 | <IsVisibleTab Value="True"/> 45 | <EditorIndex Value="2"/> 46 | <UsageCount Value="10"/> 47 | <Loaded Value="True"/> 48 | <DefaultSyntaxHighlighter Value="LFM"/> 49 | </Unit4> 50 | </Units> 51 | <JumpHistory Count="30" HistoryIndex="29"> 52 | <Position1> 53 | <Filename Value="umain.pas"/> 54 | <Caret Line="90" Column="38" TopLine="80"/> 55 | </Position1> 56 | <Position2> 57 | <Filename Value="umain.pas"/> 58 | <Caret Line="91" Column="38" TopLine="81"/> 59 | </Position2> 60 | <Position3> 61 | <Filename Value="umain.pas"/> 62 | <Caret Line="92" Column="38" TopLine="82"/> 63 | </Position3> 64 | <Position4> 65 | <Filename Value="umain.pas"/> 66 | <Caret Line="93" Column="38" TopLine="83"/> 67 | </Position4> 68 | <Position5> 69 | <Filename Value="umain.pas"/> 70 | <Caret Line="94" Column="38" TopLine="84"/> 71 | </Position5> 72 | <Position6> 73 | <Filename Value="umain.pas"/> 74 | <Caret Line="95" Column="38" TopLine="85"/> 75 | </Position6> 76 | <Position7> 77 | <Filename Value="umain.pas"/> 78 | <Caret Line="96" Column="38" TopLine="86"/> 79 | </Position7> 80 | <Position8> 81 | <Filename Value="umain.pas"/> 82 | <Caret Line="97" Column="38" TopLine="87"/> 83 | </Position8> 84 | <Position9> 85 | <Filename Value="umain.pas"/> 86 | <Caret Line="120" Column="19" TopLine="98"/> 87 | </Position9> 88 | <Position10> 89 | <Filename Value="unitgenalgess.pas"/> 90 | <Caret Line="1023" Column="45" TopLine="983"/> 91 | </Position10> 92 | <Position11> 93 | <Filename Value="unitgenalgess.pas"/> 94 | <Caret Line="1007" Column="6" TopLine="985"/> 95 | </Position11> 96 | <Position12> 97 | <Filename Value="unitgenalgess.pas"/> 98 | <Caret Line="1019" Column="39" TopLine="998"/> 99 | </Position12> 100 | <Position13> 101 | <Filename Value="unitgenalgess.pas"/> 102 | <Caret Line="1020" Column="17" TopLine="998"/> 103 | </Position13> 104 | <Position14> 105 | <Filename Value="umain.pas"/> 106 | <Caret Line="120" Column="12" TopLine="52"/> 107 | </Position14> 108 | <Position15> 109 | <Filename Value="unitgenalgess.pas"/> 110 | <Caret Line="1006" TopLine="998"/> 111 | </Position15> 112 | <Position16> 113 | <Filename Value="unitgenalgess.pas"/> 114 | <Caret Line="192" TopLine="170"/> 115 | </Position16> 116 | <Position17> 117 | <Filename Value="umain.pas"/> 118 | <Caret Line="129" Column="8" TopLine="112"/> 119 | </Position17> 120 | <Position18> 121 | <Filename Value="umain.pas"/> 122 | <Caret Line="125" Column="23" TopLine="98"/> 123 | </Position18> 124 | <Position19> 125 | <Filename Value="umain.pas"/> 126 | <Caret Line="131" Column="10" TopLine="111"/> 127 | </Position19> 128 | <Position20> 129 | <Filename Value="umain.pas"/> 130 | <Caret Line="133" Column="30" TopLine="12"/> 131 | </Position20> 132 | <Position21> 133 | <Filename Value="umain.pas"/> 134 | <Caret Line="149" Column="26" TopLine="112"/> 135 | </Position21> 136 | <Position22> 137 | <Filename Value="umain.pas"/> 138 | <Caret Line="118" Column="9" TopLine="96"/> 139 | </Position22> 140 | <Position23> 141 | <Filename Value="umain.pas"/> 142 | <Caret Line="134" Column="18" TopLine="114"/> 143 | </Position23> 144 | <Position24> 145 | <Filename Value="umain.pas"/> 146 | <Caret Line="136" Column="2" TopLine="89"/> 147 | </Position24> 148 | <Position25> 149 | <Filename Value="umain.pas"/> 150 | <Caret Line="172" TopLine="141"/> 151 | </Position25> 152 | <Position26> 153 | <Filename Value="umain.pas"/> 154 | <Caret Line="174" Column="3" TopLine="141"/> 155 | </Position26> 156 | <Position27> 157 | <Filename Value="umain.pas"/> 158 | <Caret Line="71" TopLine="69"/> 159 | </Position27> 160 | <Position28> 161 | <Filename Value="umain.pas"/> 162 | <Caret Line="180" Column="3" TopLine="152"/> 163 | </Position28> 164 | <Position29> 165 | <Filename Value="umain.pas"/> 166 | <Caret Line="134" Column="20" TopLine="112"/> 167 | </Position29> 168 | <Position30> 169 | <Filename Value="umain.pas"/> 170 | <Caret Line="133" Column="20" TopLine="111"/> 171 | </Position30> 172 | </JumpHistory> 173 | </ProjectSession> 174 | </CONFIG> 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 | <!DOCTYPE html> 2 | <html lang="de"> 3 | <head> 4 | <meta charset="UTF-8" /> 5 | <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 | <title>Ökologische Simulation - Zellularautomat & Genetischer Algorithmus 7 | 385 | 386 | 387 | 388 |
389 | Headerbild 390 |
391 | 392 | 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 | 462 | 463 | 464 | 465 | 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 |
520 |
521 |
522 | 523 |
524 |

Simulationsparameter

525 |
526 | 527 | 528 | 10% 529 |
530 |
531 | 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 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 |
IDGen-CodeFitnessAktivVerteilung
581 |
582 |
583 |
584 |
585 | 586 | 595 | 596 | 1219 | 1220 | 1221 | 1222 | 1223 | 1224 | 1225 | 1226 | --------------------------------------------------------------------------------