Designfrage: KI

Hayo, ich wäre angemeldet - kann aber momentan das Konto noch nicht aktivieren :stuck_out_tongue:

Ich stehe nun vor der wichtigen Entscheidung, wie ich eine KI für meine Anwendung konzipiere. Das ist gar nicht so leicht, darum schlage ich jetzt mal was vor, wovon ich ausgehe, dass es hier in der Luft zerrissen wird. Doch zuvor noch ein paar Zeilen zu der Applikation:
Wie manche aus dem GUI-Forum sicherlich schon wissen, arbeite ich an einer Anwendung, die Knoten und Kanten darstellen kann. Dies sind Arbeitsprozesse, mit Übergangswahrscheinlichkeiten. Gesucht ist der effizienteste Weg vom Start zum Ziel. Mööh, das ist doch Traveling Salesman werden einige sicher denken, und ya, das stimmt. Die „innovative“ Idee ist, dies aber nun mit der Ameisen-KI zu lösen und nicht mit althergebrachten Algorithmen.

**[img=http://img101.imageshack.us/img101/5412/78079398.jpg]
**

Mein Programm besteht aus folgenden Modulen (Controller genannt)
Das Herz ist der MainController. Der startet alle anderen Controller und leitet Kommunikation wenns sein muss durch. Ganz unten ist der XMLController. Der parst XML und schiebt die Attribute in eine ArrayList, nein in zwei. In eine ArrayList und eine ArrayList. Beides sind von mir erstellte Klassen mit eben diesen Attributen.
Dann gibt es einen OutputController. Der ist für die Ausgabedarstellung notwendig. Wenn die GUI initialisiert ist, schreibt er auch in die GUI-Konsole (Textarea auf der GUI).
Der GraphController verwaltet die Knoten- und Kantenlisten. D.h. er gibt auch Teillisten zurück, z.B. von allen Kanten die zu einem Knoten führen oder von ihm abgehen, oder deren Übergangswahrscheinlichkeit größer einer bestimmten Schwelle ist (die Schwelle stellt man mit einem JSlider ein)
Der GUIController initialisiert die GUI und holt die Teillisten aus GraphController (über main) Achya, die Controller sind alle auf private, ausser die von main. Deswegen muss der GUIController teilweise auch als Proxy dienen. Nämlich für das Zeichenfeld (das JPanel), denn der muss ja die Kanten und Knoten dann letztlich zeichnen.
So das ist alles schon ziemlich fertig - jetzt möchte ich mit der KI beginnen.
Der KIController startet dann die Berechnung. Doch vorher muss er Bots initialisieren. Nun weiß ich aber nicht womit man das am besten macht. Da ich vllt auch andere KIs einsetzen will, bräuchte ich soetwas wie eine KIElement - Klasse, in welcher die Regeln für die KI stehen. Das Problem ist aber, dass ich eine andere KI anders betiteln müsste.
sowas wie
setupKI(KIElement kiElement) wäre das dann. kiElement soll aber aus verschiedenen Klassen kommen können. Geht das? Mein Programmierverstand schreit nein. KIElement ist ja nunmal die Klasse und ich kann nicht zwei verschiedene Klassen mit dem gleichen Namen haben. Was gehen könnte, wäre eine Ableitung einer Defaultklasse die KIElement heißt, und die dann zu modifizieren. Sowas hatte ich auch vor, aber wie man das realisiert weiß ich noch nicht so richtig. Es geht ja darum, das das Objekt von KIElement (der Übergabeparameter wegen) stammt. Man soll ja später noch weitere KIs entwickeln können, ohne dass die alten überschrieben werden von der Neuen. Das soll also auch modular sein.
grob gesagt soll sowas dabei rauskommen:
KIElement ki1 = new AntKI();
KIElement ki2 = new BeeKI();
geht sowas? Ich wäre sehr von einer angeregten Diskussion angetan.

tut mir leid fürs flamen, aber mit extends scheint das tatsächlich zu gehen. cool, ein Problem weniger. OOP sei gepriesen.
Ich möchte mal anmerken, dass ich Java zwar als Vorlesung hatte, aber ich damals sogut wie nichts gelernt habe. Darum müssen manche Begriffe erstmal klar werden. Ich wusste schon, dass man auch Vererben kann, aber nicht, dass die Kindsklasse auf den Typ der Elternklasse verglichen werden kann.

Im allgemeinen könnte man sich ein interface “KI” überlegen - und sich klarmachen, was dort für Methoden drin stehen müßten… Irgendjemandem, der eine KI braucht, kann man dann genau das übergeben: irgendeine KI. Ggf. kann man dann auch noch ein KIFactory verwenden, falls nötig.

hy marco, ya das genau habe ich auch getan. Jetzt hat die Klasse Bot und die Klasse KI ein Interface bekommen. Das ist aber noch Neuland für mich. Darum muss ich mir das erstmal ansehen.

Ich hab auch noch nen Vorschlag. Der unterscheidet sich von eurem, indem er noch eine abstrakte Klasse verwendet um spätere Erweiterungen einfacher zu gestalten:

  • Interface für die KIs

  • Abstrakte Klasse (mit oft benötigten Funktionalitäten, Tools, Hilfsmitteln) die das Interface Implementiert

  • Die eigentliche KI(-Klasse), welche die abstrakte Klasse implementiert

  • Wenn notwendig weitere KI-Klassen, um eine zusätzliche Spezialisierung vorzunehmen

–> der Controller (das Modul), der dann für die KI zuständig ist, kann in seiner Schnittstelle auch die abstrakte Klasse erwarten, somit ist dann sichergestellt, dass die Tools und Hilfs-Methoden der abstrakten Klasse vorhanden sind, aber die Klasse auch gleichzeitig das Interface implementiert.

siehe Anhang für grafische Veranschaulichung

cool, genauso habe ich es auch schon intuitiv gemacht. Nur mit dem Unterschied, dass die Klasse KünstlicheIntelligenz bei mir Bot heißt. Auch ein Interface habe ich für Bot erstellt. Aber der Aufbau ist dennoch gleich deinem. Ich habe außerdem noch zwischen dem Controller und deinem KünstlicheIntelligenz eine Threadklasse dazwischengelegt. Später sollen sich die Bots sinnvoll auf Threads verteilen. Der Einfachheit halber habe ich jetzt aber erstmal nur einen. Aah ich sehe gerade, dass ich hier Unsinn erzähle. Ich habs genauso wie du gemacht. Auch mit den Bezeichnungen (nur heißt bei mir die Klasse KI, + KIIinterface). Zusätzliche wird KI aber von der Klasse Bot instanziiert. Ist ja auch logisch. So ein Bot besitzt ein Hirn und Daten über seine Position. Und vor Bot steht die Threadklasse…

@_@ da muss man echt seine Konzentration zusammenhalten, sonst passiert alles, nur nicht das, was passieren soll.

Wohlgemerkt, ist nicht alles was ich hier erzähle immer gut oder die beste Lösung, sind einfach nur Vorschläge. Aber wenn du es so gemacht hast wie ich, sitzt das mit der Objektorientierung doch schon recht gut :wink:

Dann bist du wohl einer der vielen in den letzten Tagen die ihre Mailadresse falsch angegeben haben :wink: :stuck_out_tongue:

Edit: Scheinbar doch nicht, dein Account ist auf jeden Fall aktiviert, der müsste gehen.

nope, mein Arbeitsplatz möchte nicht, dass ich mich in GMX einlogge ^^ das ist alles.