KI-Schwarm

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

adba

Betreff: KI-Schwarm

BeitragMi, Apr 28, 2004 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein kleines Programm geschrieben das Insekten (oder andere) Schwärme simuliert die sich gegenseitig die Ressourcen streitig machen.

Die Schwärme wachsen wenn sie genügend Nahrung haben und verkleinern sich wenn sie zu wenig Nahrung haben.
Die Naturressourcen sind aber nicht unbegrenzt. Die Pflanzen bleiben erhalten wenn es noch genug hat aber wenn es zu viele Insekten gibt die die Pflanzen "abfressen" kann sich die Pflanzenpopulation nicht mehr halten und es gibt keine Nahrung mehr. Das wiederum führt natürlich dazu das Schwärme keine Nahrung mehr haben und im schlimsten Fall aussterben.
Ich habe noch etwas Evolution intergieren:
Wenn ein Schwarm ausstirbt wird er ersetzt aus dem besten Schwarm zu Zeit plus minus ein bisschen Zufall (Mutation). Dazu müssen natürlich die Eigenschaften der Schwärme leicht anders sein. Weil die Nahrungsgewinnung aber nicht sehr stark von den Eigenschaften abhängt sondern mehr vom Standort, ist das hier (noch) nicht ausgereift.

Viel Spas:

BlitzBasic: [AUSKLAPPEN]

Type nahrungtype
Field x,y,n
End Type

Type ameisetype
Field x#,y#,dx#,dy#
Field zx,zy,tzx,tzy,n,b
End Type

Type stammtype
Field x,y,nahrung#,max#,besch#,tragmax,col
End Type

Const ameiseanz = 19999
Const nahrungsanz = 2
Const nama#=60
Const stammanz = 6
Const maxx = 240
Const maxy = 240
Const d = 650
Global nahrunganz = nahrungsanz

Dim ameise.ameisetype(stammanz,ameiseanz*5)
Dim nahrung.nahrungtype(nahrungsanz*100)
Dim stamm.stammtype(stammanz)

SeedRnd MilliSecs()
Graphics 320,240,0,1
SetBuffer(BackBuffer())

For a = 0 To nahrungsanz*100
nahrung(a) = New nahrungtype
nahrung(a)\x = Rnd(0,maxx)
nahrung(a)\y = Rnd(stammanz+3,maxy)
nahrung(a)\n = Rnd(nama/10,nama/3)
Next

For a = 0 To stammanz
stamm(a) = New stammtype
stamm(a)\x = Rnd(20,maxx-20)
stamm(a)\y = Rnd(20+stammanz+3,maxy-20)
stamm(a)\max = 10
stamm(a)\nahrung=nama/3
stamm(a)\tragmax=Rand(1,20)
stamm(a)\besch=Rnd(0.9,0.99)
stamm(a)\col=a
Next

For a = 0 To stammanz
For b = 0 To ameiseanz*5
ameise(a, b)= New ameisetype
ameise(a, b)\x = stamm(a)\x
ameise(a, b)\y = stamm(a)\y
ameise(a, b)\zx= -1
Next
Next

While KeyDown(1)=False
;delay 10
Cls
For a = 0 To stammanz
For b = 0 To stamm(a)\max
If ameise(a, b)\zx = -1 Then
ameise(a, b)\dx = Rnd(-1,1)
ameise(a, b)\dy = Rnd(-1,1)
odmin# = 9000000
For c = 0 To nahrunganz
ox# = Abs(nahrung(c)\x - stamm(a)\x) + Abs(nahrung(c)\x - ameise(a, b)\x)
oy# = Abs(nahrung(c)\y - stamm(a)\y) + Abs(nahrung(c)\y - ameise(a, b)\y)
If ox < d And oy < d Then
od# = (ox ^ 2 + oy ^ 2)
If od < odmin Then
odmin = od
ameise(a, b)\zx = nahrung(c)\x
ameise(a, b)\zy = nahrung(c)\y
ameise(a, b)\b = c
End If
End If
Next
Else
If ameise(a, b)\x > ameise(a, b)\zx Then
ameise(a, b)\dx = ameise(a, b)\dx - .2
Else
ameise(a, b)\dx = ameise(a, b)\dx + .2
End If
If ameise(a, b)\y > ameise(a, b)\zy Then
ameise(a, b)\dy = ameise(a, b)\dy - .2
Else
ameise(a, b)\dy = ameise(a, b)\dy + .2
End If
ameise(a, b)\dx = ameise(a, b)\dx * stamm(a)\besch
ameise(a, b)\dy = ameise(a, b)\dy * stamm(a)\besch
If Abs(ameise(a, b)\zx - ameise(a, b)\x) < 2 And Abs(ameise(a, b)\zy - ameise(a, b)\y) < 2 Then
If ameise(a, b)\zx = stamm(a)\x And ameise(a, b)\zy = stamm(a)\y And ameise(a,b)\n>0 Then
ameise(a, b)\n = ameise(a, b)\n - 1
stamm(a)\nahrung = stamm(a)\nahrung + .01
If ameise(a, b)\n = 0 Then
ameise(a, b)\zx = ameise(a, b)\tzx
ameise(a, b)\zy = ameise(a, b)\tzy
End If
Else
If ameise(a, b)\zx <> nahrung(ameise(a, b)\b)\x Then
ameise(a, b)\zx = -1
Goto weiter
End If
nahrung(ameise(a, b)\b)\n = nahrung(ameise(a, b)\b)\n - 1
If nahrung(ameise(a, b)\b)\n < 1 Then
nahrung(ameise(a, b)\b)\x = Rnd(0,maxx)
nahrung(ameise(a, b)\b)\y = Rnd(stammanz+8,maxy)
nahrung(ameise(a, b)\b)\n = Rnd(1,nama/10)
ameise(a, b)\zx = -1
End If
If ameise(a, b)\zx <> nahrung(ameise(a, b)\b)\x Then
ameise(a, b)\zx = -1
End If
If ameise(a, b)\n > stamm(a)\tragmax Then
ameise(a, b)\tzx = ameise(a, b)\zx
ameise(a, b)\tzy = ameise(a, b)\zy
ameise(a, b)\zx = stamm(a)\x
ameise(a, b)\zy = stamm(a)\y
End If
ameise(a, b)\n = ameise(a, b)\n + 1
End If
End If
End If
.weiter
ameise(a, b)\x = ameise(a, b)\x + ameise(a, b)\dx
ameise(a, b)\y = ameise(a, b)\y + ameise(a, b)\dy
If ameise(a, b)\x > maxx Then ameise(a, b)\x = maxx
If ameise(a, b)\y > maxy Then ameise(a, b)\y = maxy
If ameise(a, b)\x < 0 Then ameise(a, b)\x = 0
If ameise(a, b)\y < 0 Then ameise(a, b)\y = 0
Next
Next

nn# = 0
Color 100,100,100
Rect 0,0,maxx/2,stammanz+3
best=-1
bestwert#=-1
mal=-1
malwert#=9999999999999
For a = 0 To stammanz
nn = nn + stamm(a)\nahrung
If stamm(a)\nahrung>bestwert Then
bestwert=stamm(a)\nahrung
best=a
EndIf
If stamm(a)\nahrung<malwert Then
malwert=stamm(a)\nahrung
mal=a
EndIf
Next
mx=MouseX()
my=MouseY()
nn = nn / (stammanz+1)
If nn=0 Then nn=0.001
For a = 0 To stammanz
r=Sin(360*a/(stammanz+1)+0)*127+128
g=Sin(360*a/(stammanz+1)+120)*127+128
b=Sin(360*a/(stammanz+1)+240)*127+128
Color r,g,b
Oval stamm(a)\x-5,stamm(a)\y-5,10,10,0
Text 242,a*15+20,Str(Int(stamm(a)\max))
Text 280,a*15+20,Str(Int(stamm(a)\nahrung))
Line 1,a+1,maxx*stamm(a)\nahrung/(nn*2),a+1
If stamm(a)\nahrung>stamm(a)\max+5 And Rand(0,100)<100 Then
stamm(a)\max=stamm(a)\max+1
stamm(a)\nahrung=stamm(a)\nahrung-1
If stamm(a)\max>ameiseanz*5 Then stamm(a)\max=ameiseanz*5
ElseIf stamm(a)\nahrung <stamm(a)\max-5 And Rand(0,100)<100 Then
stamm(a)\max=stamm(a)\max-1
If stamm(a)\max<1 Then stamm(a)\max=1
ElseIf stamm(a)\nahrung<0 Then
stamm(a)\nahrung=0
stamm(a)\max=1
If best<>-1 Then
stamm(a)\tragmax=stamm(best)\tragmax+Rand(-1,1)
stamm(a)\besch=stamm(best)\besch+Rnd(-0.01,0.01)
If stamm(a)\besch<0.7 Then stamm(a)\besch=0.7
If stamm(a)\besch>0.99 Then stamm(a)\besch=0.99
If stamm(a)\tragmax<1 Then stamm(a)\tragmax=1
stamm(a)\col=stamm(best)\col
If stamm(best)\nahrung>40 Then
stamm(a)\nahrung=20
stamm(best)\nahrung=stamm(best)\nahrung-20
EndIf
EndIf
EndIf
stamm(a)\nahrung=stamm(a)\nahrung-stamm(a)\max/5000
If a<>stamm(a)\col Then
aa=stamm(a)\col
r=Sin(360*aa/(stammanz+1)+0)*127+128
g=Sin(360*aa/(stammanz+1)+120)*127+128
b=Sin(360*aa/(stammanz+1)+240)*127+128
Color r,g,b
Oval stamm(a)\x-4,stamm(a)\y-4,8,8,0
EndIf
If mx+5>stamm(a)\x And mx-5<stamm(a)\x And my+5>stamm(a)\y And my-5<stamm(a)\y Then
r=Sin(360*a/(stammanz+1)+0)*127+128
g=Sin(360*a/(stammanz+1)+120)*127+128
b=Sin(360*a/(stammanz+1)+240)*127+128
Color r,g,b
Text 242,160,"TM="+Str(stamm(a)\tragmax)
Text 242,175,"BE="+Str(stamm(a)\besch)
EndIf
Next
If mal<>-1 And Rand(0,100)<1 And stamm(mal)\nahrung<stamm(mal)\max Then
stamm(mal)\tragmax=stamm(mal)\tragmax+Rand(-1,1)
stamm(mal)\besch=stamm(mal)\besch+Rnd(-0.01,0.01)
If stamm(mal)\besch<0.7 Then stamm(mal)\besch=0.7
If stamm(mal)\besch>0.99 Then stamm(mal)\besch=0.99
If stamm(mal)\tragmax<1 Then stamm(mal)\tragmax=1
EndIf
Color 255,255,255
Line 1,best+1,10,best+1

Color 200,200,200
Line mx-5,my,mx+5,my
Line mx,my-5,mx,my+5

GUT=0
For a = 0 To nahrunganz
nahrung(a)\n=nahrung(a)\n+nama/100
If nahrung(a)\n>nama Then nahrung(a)\n=nama
r=nahrung(a)\n/(nama/10)
Oval nahrung(a)\x-r/2, nahrung(a)\y-r/2, r, r,1
If nahrung(a)\n>nama*2/3 Then
GUT=GUT+1
EndIf
Next
If GUT>2*nahrunganz/3 And Rand(100)<10 Then
nahrunganz=nahrunganz+1
If nahrunganz>nahrungsanz*20 Then
nahrunganz=nahrungsanz*20
EndIf
ElseIf GUT<2*nahrunganz/3
nahrunganz=nahrunganz-1
If nahrunganz<1 Then
nahrunganz=1
EndIf
EndIf
Text 242,220,Str(nahrunganz)
If best<>-1 Then
aa=best
r=Sin(360*aa/(stammanz+1)+0)*127+128
g=Sin(360*aa/(stammanz+1)+120)*127+128
b=Sin(360*aa/(stammanz+1)+240)*127+128
Color r,g,b
Text 242,190,"TM="+Str(stamm(best)\tragmax)
Text 242,205,"BE="+Str(stamm(best)\besch)
EndIf
LockBuffer(BackBuffer())
For a=0 To stammanz
r=Sin(360*a/(stammanz+1)+0)*127+128
g=Sin(360*a/(stammanz+1)+120)*127+128
b=Sin(360*a/(stammanz+1)+240)*127+128
rgb=r*$10000+g*$100+b
For b=0 To stamm(a)\max
WritePixelFast ameise(a,b)\x,ameise(a,b)\y,rgb
Next
Next
UnlockBuffer(BackBuffer())
Flip 0
Wend


End
 

Gast

BeitragMi, Apr 28, 2004 11:53
Antworten mit Zitat
Sieht gut aus, was haben eigentlich diese Zahlen am Rand zu bedeuten?

Und mich würde noch interessieren, an welcher stelle des Codes sich die Evolution befindet! Hab mich nicht so zurechtgefunden Wink

adba

BeitragMi, Apr 28, 2004 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Zahlen am Rand sagen einerseits wie viele Insekten der Schwarm beinhaltet und die Zahl rechts davon stehen für die mögliche Entwiklung des Schwarms in abhängigkeit des Nahrungsvorrats (Es ist scho lange her seit ich das Programmiert habe darum weiss ich es selber nicht mehr so ganz Wink)

Dieser Code ist die Evolution:
BlitzBasic: [AUSKLAPPEN]
ElseIf stamm(a)\nahrung<0 Then 
stamm(a)\nahrung=0
stamm(a)\max=1
If best<>-1 Then
stamm(a)\tragmax=stamm(best)\tragmax+Rand(-1,1)
stamm(a)\besch=stamm(best)\besch+Rnd(-0.01,0.01)
If stamm(a)\besch<0.7 Then stamm(a)\besch=0.7
If stamm(a)\besch>0.99 Then stamm(a)\besch=0.99
If stamm(a)\tragmax<1 Then stamm(a)\tragmax=1
stamm(a)\col=stamm(best)\col
If stamm(best)\nahrung>40 Then
stamm(a)\nahrung=20
stamm(best)\nahrung=stamm(best)\nahrung-20
EndIf
EndIf
EndIf
 

Kekskiller

BeitragMi, Apr 28, 2004 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Es macht Spaß den gefräßigen Gesellen ein bißchen zu zuschauen.
Momentan sind bei mir die lilanen die radikalsten , aber wer weiß ,
vielleicht hohlen sie noch die roten ein.Daraus musst du einen Simulator
basteln Mr. Green

adba

BeitragSo, Mai 02, 2004 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist ja schon ein Simulator.. oder was meinst du genau damit?
Ich sollte ihn einfach noch ein bisschen anschaulicher machen (die zahlen anschreiben usw...)
Disimulation wird sowieso erst nach einiger betrachtungszeit interessant. dann wenn die erste kolonie die übermacht hat oder eine ausstirbt oder die nahrungsvorräte zur neige gehen... ich kann sowas stundelnag zusehen Smile

sbrog

BeitragMo, Mai 03, 2004 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
mit vwait wäre das ganze nicht so schnell Rolling Eyes
 

Ava

Gast

BeitragDi, Mai 11, 2004 21:23
Antworten mit Zitat
Shocked

Echt witzig!! Very Happy
 

walski

Ehemaliger Admin

BeitragDi, Mai 11, 2004 23:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mir das ganze schon vor n paar Tagen mal angeguckt und fands ganz witzig, aber jetzt kam mir eben ne Idee:

Sterben diese Viecher jemals ganz aus?

Sonst könnte man das ganze mal in C oder so umschreiben und eine Visualisierung in PHP und ich könnts bei mir aufm vServer 24/7 laufen lassen Wink

Das wär nach 3 Monaten sicher interessant, oder?

walski
buh!
 

Dreamora

BeitragDi, Mai 11, 2004 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
*ggg*

Dir scheint langweilig zu sein wa Smile

3 Monate viecher evolution spielen ... also wirklich *gggg*

Wenn dann müsste man da schon noch unfair eingreifen können *fg*
 

walski

Ehemaliger Admin

BeitragMi, Mai 12, 2004 0:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, je mehr ich drüber nachdenke, auf desto bessere Ideen komme ich Smile

Wartets mal ab, ich überleg mir da mal was.

walski
buh!
 

TOONY

BeitragFr, Mai 14, 2004 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
walski hat Folgendes geschrieben:

Sonst könnte man das ganze mal in C oder so umschreiben und eine Visualisierung in PHP und ich könnts bei mir aufm vServer 24/7 laufen lassen Wink


Wie kann man ein php script 24std auf einem server laufen lassen, ohne dass jemand darauf zugreift?

Erklär mir das bitte!! oder gib mir bitte infos dazu!

Danke im vorraus! Smile
 

pogi02

BeitragSa, Jun 12, 2004 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ja das geht schon nur du müsstest die cron Job so einstellen das es immer zugrifft also jede sek oder so

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group