Programmierte "Intelligenz"

So ich hab mir mal das bischen Mühe gemacht und das Spiel an dem ich werkel umgebaut zu etwas, was schwarm intelligenz schon fast gleich kommt. Nur dass sich die Intelligenz auf zufällige Bewegungsvektoren beschränkt :D
Ne echt.. also ich hab hier ein kleines Programm, was mir mehrere Objekte anzeigt, die in einem Raum drin sind. Jedes Objekt hat eine Update funktion, welche jeden Frame aufgerufen wird. Bis jetzt steht in der Update Funktion nichts weiter drin also eine zufällige Bewegung.

Was mach ich jetzt?
Ich denke ich werde das jez erstmal mit 10 ausprobieren,die dann versuchen sollen einen bestimmten abstand zu ihren Partnern einzuhalten.
Vllt. fällt mir auch was besseres ein. Oder euch :D

btw: bei 300 instanzen und wahrscheinlich (hab die Anzeige dummerweise rausgeschmissen) 60fps ackert meine CPU auf 12%. Hab 4 Kerne (Q6600 4*2,4 GHz)

Warte auf eure antworten

Lukas
 
@Crysis nerd (warum eigentlich "nerd? xD):

hast du das echt in 3D gemacht?^^
ich hätte das sonst virtuell gemacht, also jedes Objekt bekommt einfach einen vektor als Variable und dann findet da die "Bewegung" statt
aber so kannste ja jetzt das mit dem bestimmten Abstand auch erstmal machen.
und dann würde ich in die Updatefunktion noch sowas einbauen, dass das Objekt z.B. eine Gefahr erkennt und dann in die entgegengesetzte Richtung ausweicht. tjo und die andern müssen dann eben wieder ihren mindestabstand einhalten.

Obwohl da wüsste ich auch nicht, was sinnvoll ist:

Code:
switch (variable_umstaende) // oder halt if und elseif, jenachdem^^
case gefahr1: .....
case gefahr2: ....
case doof: ...
case zu_nah: .....
aber das wär ja nicht intelligent, da dann ja nur das aus der switch-case-anweisung behandelt wird.

Dann hätt ich persönlich mit meinem mickrigen Kenntnisstand irgendwie eine weitere sache eingefügt:
Code:
case default (oder unbekannter_umstand)
und dann was da passiert irgendwie gespeichert, sodass der schwarm auch lernt.
inwieweit das nun zu realisieren ist weiß ich nicht :D

aber das mit der Updatefunktion ist wohl schonmal das sinnvollste, was geht, um die objekte mehr oder weniger unabhängig voneinander interagieren zu lassen.
Sonst pack doch einfach mal was rein und schau mal, was passiert ;)

So ich bin dann erst am Montag wieder da ....
 
Das Problem bei deinem von a bis b in ner Datei speichern ist wohl kaum das addieren der Strings sondern das schreiben auf die Datei, da deine Festplatte vieeel langsamer ist, als deine CPU könnte.

lg KoK
 
@Crysis nerd (warum eigentlich "nerd? xD):
Wer redet hier gerade über selbstlernende Schwarmintelligenz? :D
Das Crysis find ich viel nerviger... is zwar cool das Spiel, aber nich das beste so...
Bin auch unter Crynerd bekannt, was sich aber iwie emo anhört, aber nunja egal, hab den namen jez ^^
Sorry für OT :D
hast du das echt in 3D gemacht?^^
ich hätte das sonst virtuell gemacht, also jedes Objekt bekommt einfach einen vektor als Variable und dann findet da die "Bewegung" statt
aber so kannste ja jetzt das mit dem bestimmten Abstand auch erstmal machen.
und dann würde ich in die Updatefunktion noch sowas einbauen, dass das Objekt z.B. eine Gefahr erkennt und dann in die entgegengesetzte Richtung ausweicht. tjo und die andern müssen dann eben wieder ihren mindestabstand einhalten.
Nein, hab ich irgendwas mit 3D erwähnt? 0.o
Alles 2D...
Was du mit deinem virtuell meinst, ist mir gerade leider schleierhaft...
Also ich erklär dir mal wie das bei uns ist. Ich nutze, weil ich faul bin, einfach die Physikengine (unserer Gamengine), da die die Bewegungen ein wenig "geschmeidiger" macht. Also in jedem Durchgang wird diese Funktion aufgerufen:
Code:
m_Physic->AddForce(Vector2D<float>(rand()%101/250.f-0.2f, rand()%101/250.f-0.2f))
Es wird also eine Kraft hinzugefügt, die dann in die Geschwindigkeit umgerechnet wird. Und die Kraft wird als 2D Vektor übergeben, wobei beide Werte eine Zufallszahl sind (von -0,2 bis +0,2)

Jetzt eine Gefahr einzubauen sollte nicht sehr schwer sein... Man nimmt dann als Kraft einfach (Object_Position - Gefahr_pos) und schon hat man wieder seinen Bewegungsvektoren.

Ich versuch aber gerade, dass sie einen immer gleichen Abstand zu ihren Partnern haben.
Meine Taktik ist:
Alle anderen Objekte durchgehen, das Objekt mit dem geringsten Abstand auswählen. Wenn dieser Abstand jetzt > 100 ist, wird sich auf das Objekt zu bewegt. Falls kleiner, davon weg.
Nur gestern hatte ich nich mehr so viel zeit... und irgendwie habe ich das mit dem Durchlaufen aller list Elemente gefailt... aber ich mach jez weiter ^^
 
Du könntest doch, falls festgestellt wird, dass einer zu nahe dran ist, den Geschwindigkeitsvektor einfach umdrehen, sodass er in die andere Richtung weiter "schwimmt".
Sieht dann natürlich noch nicht so realistisch aus, da keine Dämpfung oder Reaktionszeit dabei ist, aber für den Anfang evtl. nicht schlecht.

lg Kok
 
Das haben wir doch so... praktisch. Wir bilden die Differenz der beiden Vektoren und schon haben wir unseren Bewegungsvektoren, der uns entweder zum anderen Objekt hinbringt oder wegführt (je nachdem wie man sie voneinander abzieht)
Und die Dämpfung haben wir ja praktisch schon durch die Physikengine drin. Denn wir nutzen nicht die Funktion SetSpeed(vektor) sondern AddForce(vektor).
Reaktionszeit will ich auch garnich einplanen eig^^
Also wenn du jez wirklich die Zeit meinst:
"mh ich bin ein fiisch, ein fröhlicher fiiisch. Wow was is das denn da? Ja is das wohl ein Hai? Ja das könnte sein, ma umdrehen" :D

mfg

PS: doofes was auch immer.. jedenfalls wollte ich das schon heute mittag posten, aber iwie hat das Forensystem ein wenig gefailt


EDIT1: Mit ein wenig Hilfe hab ichs jez geschafft, dass die Teile sich tatsächlich richtig schön auf Abstand halten. Sieht richtig lustig aus :D (btw: alle lustigen "Stadien" des Projektes Speicher ich)
Zur Zeit bewegen sie sich immer mit dem selben Kraft betrag. Das änder ich jetzt.. dann müssten sie theoretisch mal Ruhelage erreichen..
 
hi,
verfolge die diskussion nun auch schon seit einiger zeit. seeehr interesting :D
Ein freund von mir wollte auchmals so etwas mit intelligenter sprachausgabe machen, er wollte irgendwie für jedes wort eine zahl speichern, die so eine art sinn/intention/zweck darstellt. und je nachdem, was eingegeben wurde, konnte nun (ungefähr) der sinn der eingabe geschätzt werden und dementsprechend behandelt werden.
aber ich hab gesagt: na denn viel spass bei den 600.000 deutschen wörtern, mehrdeutigkeiten und so weiter :ugly:
Seitdem studiert er brav weiter^^

@crysis nerd: könntest du evtl. auch BIlder von den lustigen stadien hier posten? xD
 
Ich kann sogar die ausführbaren Datein mal hochladen, wenn jemand Spaß dran hat. Aber im moment haben mein Freund und ich einfach zu viel FUN :D
Morgen oder so ;)
Wir haben es inzwischen geschafft, dass 50 objekte nach 10 secunden in ruhelage sind und einen perfekten Abstand einhalten. Jetzt wollen wir, dass der Schwarm dem mauszeiger folgt..
 
das will ich auch können -.-


^^
ne (also doch schon .. aber) wär prima mit den dateien :daumen:

PS: mal sehn, wer jetz noch wach ist und antwortet :P
 
ALso ich geh jez pennen .. ich hab jez mal einen bösen Fisch eingebaut, vor dem alle fliehen sollten.
Durch ein paar Verwechslungenen von < und > wurde daraus möglicherweise eine schöne Frau und die Objekte eine Horde Männer. Keiner wich auch nur 250 von ihrer Seite :D :D

Bis morgen
 
So ich lad jetzt mal eine Version hoch und ihr sagt, was ihr davon haltet :P

http://sebi707.de/crap/AI.rar

Einstellungen: in game.ini können Auflösung und Fullscreen verändert werden. In swarm.ini können anzahl der Objekte und Anzahl der Nachbarn umgestellt werden.
Anzahl der Nachbarn ist die Zahl von den nächstens (örtlich nächstens) objekte, auf die geachtet wird. D.h. wenn der Wert 1 ist, orientiert sich jedes Teilchen nur an seinem nächsten Nachbarn und ignoriert alle anderen.
Diesen Wert (NoN) kann man noch im Spiel mit W und S umstellen.
Weitere bedienung: Pfeiltasten -> Kamera steurern
L und P -> Zoomen
Maustaste gedrückt halten -> Hai verschieben

Zum Starten braucht ihr die aktuelle DirectX Version und dieses C++ Redistrituable (ja ich weiß voll fail geschrieben, aber ich kanns mir nich merken -.-) 2010

Das wärs eigentlich...

Pls Meinungen :D
 
Meinung:

xDDDDDDDDDDDDDDDD

Die AI lässt sich fast so "spielen" wie diese Strategiespiele auf onemoreleve.com, wo man so Schafe mit der Maus in einen bestimmten Bereich scheuchen muss^^
aber sonst klasse :daumen:

Allerdings hab ichs geschfft, alle *hust* Dinger ausm Bildschirm zu jagen und dann war mein Mauszeiger da ganz allerin :ugly:

achja Edit: ab 650 Objekten macht hier die Atom-CPU schlapp :D
 
Danke, aber eine wichtige Sache habe ich vergessen:

Source Code ist für jeden in diesem Forum selbstverständlich offen!
Ich meine, wir haben hier darüber geredet.. Und mir erst die Anregung geschaffen. Also falls ihr was eigenes Probieren wollte, meldet euch einfach, ich schick euch das dann und erklär mal eben, wo was rein muss und wie das Grundsystem aufgebaut ist..

Ich will ja hier nicht alleine daran programmieren, sondern ich wollte mit euch eig tolle Intelligenz besprechen :D

Achja: Wenn jemand sich das programmieren nich zutraut, aber trotzdem irgendwas haben will (außer Käsekuchen, den will jeder), kann er das sagen, vllt schaff ichs ja es einzubauen.

mfg
Lukas
 
hi,
so ich meld mich jetzt auch mal wieder .... ehec lässt grüßen -.-

also @Crysis nerd:
die Visualisierung ist super :daumen:
ich meinte mit meinem "virtuellen Vektorraum", dass ich genau das mache, nur eben ohne Visualisierung^^
Sobald es mir wieder besser geht, werde ich vllt auch mal in deinen Code spicken wollen, aber .... eigentlich heißt es ja selbst ist der Mann :D
also ma sehn ;)

achja und könntest du evtl. auch mehrere "feindliche Objekte" erstellen und je nachdem, ob es die eigenen scharmmitglieder zerstört (kann ja nah einer zufällig gewählten Zeit eintreten) wird dem Objekt eben ausgewichen oder nicht; oder so xD

@Joffal: was fürn Atom ist den das? der muss aber schon ziemlich dröge sein :ugly:


Edit: scharmmitglieder :lol:
ich änder das mal nicht ... vielleicht möchte sich ja der eine oder andere von euch darüber lustig machen :P
 
So.. Also erstmal:
Arrg :D wollte gerade schreiben, dass ich fadades witz nich ralle, bis ich ihn gerade gerallt habe >.<

Jedenfalls, wie ich schon richtig darauf hingewiesen wurde: das ist nicht richtig Intelligenz, sondern einfach nur "normale Programmierung", ein sog. "Reaktives System" (hab ich natürlich ganz alleine gewusst das wort, damn nagut fragile heart wars -.-). Aber ich wusste nicht, wie man das irgendwie in ein anständiges System für Künstliche Intelligenz quetschen könnte. Aber Fragile Heart guckt sich das mal an und macht ein Verbesserungs vorschlag)

Und achja, der Source, damit ihr euch die PN spart: http://sebi707.de/crap/AISource.rar
Bitte nicht missbrauchen oder so. Ich gebs jez einfach mal raus im guten Glauben an euch, dass damit nix passiert (was immer das auch seien sollte)
Is jez leider nur die Visual Studio 2010 Projektdatei dabei... Achja: das wichtige ist in Object.cpp Object::Update()

Verbesserungsvorschläge und alles weitere zum Source, meinem Programmierstil oder ALLES höre ich gerne ;)

Lukas
 
Verbesserungsvorschläge und alles weitere zum Source, meinem Programmierstil oder ALLES höre ich gerne ;)

laut Informatikunterricht sollen bzw. sollten wir immer kommentare mit einer gesamtlänge von etwa 1/3 der gesamten Codelänge schreiben :ugly: :P :D
aber man versteht es trotzdem ;)
trotz meiner Angewohnheit, dass ich eine variable gut und gerne mal z.B. "var_die_das_und_das_macht" nenne ^^

Also im Modulkatalog für das Informatikstudium an der uni Hannover gibt es auch eine kleine nette Zeichnung zum Thema KI.
Dort läuft es auch mit einer Datenbank ab .....
Irgendwie bzw. irgendwo muss ja noch der Lernprozess rein. und der sollte wohl erstmal auf Benutzereingaben basieren.

Ich glaub ich besorg mir erstmal Lektüre für SQL; damit kann man den "Lernprozess" gut realisieren und es wird später voraussichtlich auch in meinem Studium angewandt :ugly:

PS: Schade, dass es hier nicht auch Codebeispiele gibt :D
 
Naja, du müsstest erstmal eine saubere Trennung haben und definieren was das System alles lernen können soll. ;) Dann können wir gerne über eine Datenbank reden. :ugly:
 
Naja, du müsstest erstmal eine saubere Trennung haben und definieren was das System alles lernen können soll. Dann können wir gerne über eine Datenbank reden.

Jo, daran hab ich eben auch grad gedacht ;)
Wenn man sich da weiter bei OOP aufhält 8was glaube ich unumgänglich ist) dann könnte man ja eine Inputklasse erstellen, die standardisierte Infos zum "Lernobjekt" enthält. Und während des Lernens wird der Kram dann halt aufgewurschtelt und in eine passende Datenbank gespeichert (z.B. Bilder einfach in einen ordner, Wörter in ein "Wörterbuch" Termine in eine Sektion wichtig :D ). Damit könnnte man viele Datentypen bearbeiten. Problem ist nur die standardisierung oder? :huh:
Hab eben schonmal ein Codebeispiel gefunden, womit man Websites aufrufen und den Quellcode einsehen kann. Wenn man dort die Tags rausfiltert, hätte man ja schonmal eine Informationsquelle ^^

Dann macht man in die GUI noch eine Drag'n'Drop-Fläche rein und für jeden Dateityp oder was auch immer gibt es eine Überladung der Methode "ki_learn([der drag'n'drop-inhalt])" .....
oder so :P


So und nun mal ein bisschen OT an die erfahreneren unter uns: Ich hab gestern Abend meine Bewerbung für ein Praktikum abgeschickt, und mir ist vorhin eingefallen, dass ich eine Änderung nicht rückgängig gemacht habe: "Über eine positive Rückmeldung würde ich mich sehr freuen." -> Ja, das positiv ist da noch fett :ugly: is das schlimm? ^^
 
Erstmal wäre schon eine "richtige Intelligenz" zu haben, bevor wir über selbstlernende nachdenken. Fragile Heart wollte mir eigentlich mal eine verbesserte Version schicken.. aber iwie kommt nix ^_^
und @fadade: was du in deinem letzen Post gesagt hast, ist vllt. ein bischen zu weit gegriffen erstmal.
Andere Sache: wenn das hier weiterentwickelt wird, weiterhin auf der Engine die bei mir dabei war? Wenn ein Projekt darauf aufbaut, müsste ich vllt. nochmal den Besitzer der Engine fragen, is aber zum Glück ein Kumpel...
 
Zurück