Passende Listenstruktur gesucht

T

Tabriel

Gast
Abend oder besser Morgen!
Bin auf der Suche nach einer passenden Listenstruktur. Und zwar soll die erste Ebene(=Tiefe 0) aus 6 Elementen bestehen, welche jeweils einen Zahlenwert annehmen. Jedes von diesen Elementen soll wiederum auf 0-6 weitere Elemente zeigen(variabel, je nachdem wieviele Züge möglich sind) usw.
Jedes Element soll einen möglichen Spielzug darstellen, möchte damit den Minimax-Algorithmus für ein Spiel implementieren.
Kann mir wer helfen?

Danke schonma,

Grüße
 
H

Herr K.

Gast
Hallo,

was Du benötigst ist ein Baum. Da gibt es verschiedene Varianten, wie man die aufbauen kann. Hast Du eine bekannte, maximale Breite pro Knoten (in Deinem Fall 6), kannst Du z.B. eine Liste nehmen, die für jede Hierarchieebene einfach erweitert wird. Ein Baum der Tiefe 1 wird von einer Liste der Größe 6 repräsentiert, die Tiefe zwei wäre eine Liste mit 6 + 36 Elementen. Hier hättest Du den Vorteil eines Wahlfreien Zugriffs, dem ersten Knoten (Index == 0) sind die Elemente mit den Indizes 6 bis 11 untergeordnet, dem zweiten Knoten die mit den Indizes 12 bis 17 usw.
Die Berechnung sollte entsprechend einfach ausfallen und Du kannst auf jeden Knoten sehr effizient zugreifen. Nachteilig ist, dass Du eben den vollständigen Baum reservierst, auch wenn der entartet (einer oder wenige Äste werden sehr tief, die anderen bleiben flach).

Hier bietet es sich eher an den Baum über Verknüpfungen aufzubauen. Dazu definierst Du Dir einfach eine Klasse:

Java:
public class TreeNode {

  private final List<TreeNode> childNodes;
  private final TreeNode parent;
  private final int value;

  public TreeNode(int value) {
     this.parent = null;
     this.childNodes = new ArrayList<TreeNode>(6);
     this.value = value;
  }

  protected TreeNode(int value, TreeNode parent) {
     this.parent = parent;
     this.childNodes = new ArrayList<TreeNode>(6);
     this.value = value;
  }

  public TreeNode addNewChild(int value) {
    final TreeNode result = new TreeNode(value, this);
    this.childNodes.add(result);
    return result;
  }

  public TreeNode getChildByValue(int value) {
    for (final TreeNode child: this.childNodes) {
      if (child.getValue() == value) {
        return child;
      }
    }

    return null;
  }

  public int getValue() {
    return this.value;
  }
}

Mal ganz grob. Du könntest hier auch noch einen Getter für alle Kindknoten und zu jedem Kindknoten auch noch den Getter des Elternknoten vorsehen, auch sind hier im Moment beliebig viele Kindknoten möglich, die einfach hintereinander abgelegt werden.

Dein Baum ist einfach ein Wurzelknoten (der hat keinen Elternknoten), an den hängst Du dann jeweils Teilbäume an. So kannst Du dann auch den Baum traversieren, Du nimmst einfach den Wurzelknoten und greifst auf einen der Kindknoten zurück. Die Kindknoten repräsentieren dann wiederum einen Teilbaum, den Du analog traversieren kannst.
 
T

Tabriel

Gast
Tag,
habe jetzt ein weiteres Problem. In der Methode play wird das Spiel simuliert bis zu einer bestimmten Tiefe,indem jede TreeNode einen Spielstand abspeichert, und ein veränderter Spielstand mit der simulate-Methode erzeugt wird, welcher dann an das Kind weitergereicht wird, und für dieses Kind auch wieder die play-Methode aufgerufen wird, sodass für dieses weitere 6 Kinder erzeugt werden etc.Dann wird der Zahlenwert bestimmt, welcher in der Methode auswerten ,je nachdem ob Minimierer/Maximierer dran ist,"hochgereicht" wird.
Hier einfach mal die beiden Methoden:
Java:
    public void play(TreeNode tr, int laufVar)
    {
        if(!(laufVar > difficulty))//Erstellen des Baumes + Simulieren bis in bestimmte Ebene
        {
            System.out.println("Play bei laufVar:" +laufVar);
            int turn;
            if(laufVar%2 != 0) //Bei ungerade sind es Züge von KI = Spieler2, von 0 zu 1, von 2 zu 3 etc.
                turn = 2;
            else
                turn = 1;
            for(int i = 0;i<6;i++)
            {
                System.out.println("Status an Stelle:" + i + " = " + hollows[i+7]);
                int[] tmp = simulate(i,tr.getStatus(),turn);
                if(tmp == null)
                    System.out.println("Füge kein Kind hinzu");
                if(tmp!= null)
                {
                    System.out.println("Füge Kind hinzu");
                    TreeNode child = tr.addNewChild(tmp,i);
                    play(child,(laufVar+1));
                }
            }
        }
        else//Weiterreichen der Werte nach oben
        {
            int[] status = tr.getStatus();
            int value = (status[13] - hollows[13]) - (status[6] - hollows[6]); //Kommen in die KI-Mulde(=Player 2) Steine hinzu bzw. verliert die SpielerKI welche wirkt sich das positiv aus und umgekehrt
            tr.setValue(value);//Abhandlung der untersten Ebene
            System.out.println("Beginne jetzt mit Auswertung");
            auswerten(tr.getParent(),(laufVar-1));
        }
        
    }
public void auswerten(TreeNode tr,int laufVar)//Kriegt immer parent übergeben
    {
        if(laufVar != 0)//Kinder suchen, vergleichen, und je nach Ebene(Spieler A/Spieler B) den kleinsten/größten Wert annehmen und eine Ebene raufgehen(durch tr.getParent())
        {
            System.out.println("Auswerten bei laufVar: "+laufVar);
            int max = -255;
            int min = 255;
            ArrayList<TreeNode> childNodes = tr.getChildNodes();
            for(int i = 0;i<6;i++)
            {
                TreeNode tmp = childNodes.get(i);
                if(tmp != null)//Der Zweig wurde nicht weitergegangen, da Zug nicht möglich
                {
                    if(laufVar%2 != 0)//Ebene vom Gegner da ungerade
                    {
                        if(tmp.getValue() < min)
                            tr.setValue(tmp.getValue());
                    }
                    else
                    {
                        if(tmp.getValue()>max)
                            tr.setValue(tmp.getValue());
                    }
                }
            }
            auswerten(tr.getParent(),--laufVar);
        }
        else//Ganz oben angekommen, ein letztes vergleichen und play-Methode vom Controller aufrufen
        {
            int max = -255;
            int index = 0;//Für Weitergabe des gewählten Zuges an Controller
            ArrayList<TreeNode> childNodes = tr.getChildNodes();
            for(int i = 0;i<6;i++)
            {
                TreeNode tmp = childNodes.get(i);
                if(tmp != null)
                {
                    if(tmp.getValue() > max)
                    {
                        tr.setValue(tmp.getValue());
                        index = i;
                    }
                }
            }
            ctrl.KIplay(index);
        }
    }

Problem ist, dass er eine IndexOutOfBound-Exception auswirft für die erstellte ArrayList childNodes. Scheinbar wird in der for-Schleife der play-Methode auf die Abarbeitung der weiteren play-Methode gewartet, zumindestens wird nur 1x der Satz "Füge Kind hinzu" ausgegeben pro Variablenwert, und nicht wie zu erwartet 6^Laufvariablen mal.
Kann ich das irgendwie umgehen, dass auf die Abarbeitung der play-Methode gewartet wird?

Grüße
 
T

Tabriel

Gast
Oh Entschuldigung, ich habe vergessen das Java-Tag zu schließen, hier der Code:

Java:
    public void play(TreeNode tr, int laufVar)
    {
        if(!(laufVar > difficulty))//Erstellen des Baumes + Simulieren bis in bestimmte Ebene
        {
            System.out.println("Play bei laufVar:" +laufVar);
            int turn;
            if(laufVar%2 != 0) //Bei ungerade sind es Züge von KI = Spieler2, von 0 zu 1, von 2 zu 3 etc.
                turn = 2;
            else
                turn = 1;
            for(int i = 0;i<6;i++)
            {
                System.out.println("Status an Stelle:" + i + " = " + hollows[i+7]);
                int[] tmp = simulate(i,tr.getStatus(),turn);
                if(tmp == null)
                    System.out.println("Füge kein Kind hinzu");
                if(tmp!= null)
                {
                    System.out.println("Füge Kind hinzu");
                    TreeNode child = tr.addNewChild(tmp,i);
                    play(child,(laufVar+1));
                }
            }
        }
        else//Weiterreichen der Werte nach oben
        {
            int[] status = tr.getStatus();
            int value = (status[13] - hollows[13]) - (status[6] - hollows[6]); //Kommen in die KI-Mulde(=Player 2) Steine hinzu bzw. verliert die SpielerKI welche wirkt sich das positiv aus und umgekehrt
            tr.setValue(value);//Abhandlung der untersten Ebene
            System.out.println("Beginne jetzt mit Auswertung");
            auswerten(tr.getParent(),(laufVar-1));
        }
        
    }
public void auswerten(TreeNode tr,int laufVar)//Kriegt immer parent übergeben
    {
        if(laufVar != 0)//Kinder suchen, vergleichen, und je nach Ebene(Spieler A/Spieler B) den kleinsten/größten Wert annehmen und eine Ebene raufgehen(durch tr.getParent())
        {
            System.out.println("Auswerten bei laufVar: "+laufVar);
            int max = -255;
            int min = 255;
            ArrayList<TreeNode> childNodes = tr.getChildNodes();
            for(int i = 0;i<6;i++)
            {
                TreeNode tmp = childNodes.get(i);
                if(tmp != null)//Der Zweig wurde nicht weitergegangen, da Zug nicht möglich
                {
                    if(laufVar%2 != 0)//Ebene vom Gegner da ungerade
                    {
                        if(tmp.getValue() < min)
                            tr.setValue(tmp.getValue());
                    }
                    else
                    {
                        if(tmp.getValue()>max)
                            tr.setValue(tmp.getValue());
                    }
                }
            }
            auswerten(tr.getParent(),--laufVar);
        }
        else//Ganz oben angekommen, ein letztes vergleichen und play-Methode vom Controller aufrufen
        {
            int max = -255;
            int index = 0;//Für Weitergabe des gewählten Zuges an Controller
            ArrayList<TreeNode> childNodes = tr.getChildNodes();
            for(int i = 0;i<6;i++)
            {
                TreeNode tmp = childNodes.get(i);
                if(tmp != null)
                {
                    if(tmp.getValue() > max)
                    {
                        tr.setValue(tmp.getValue());
                        index = i;
                    }
                }
            }
            ctrl.KIplay(index);
        }
    }
 
T

Tabriel

Gast
Ok,
ich habe jetz nach etwas Nachforschung probiert, den Teil in der for-Schleife in einen Thread zu packen, und die Methode auf synchronized gestellt. Kommt leider immernoch IndexOutOfBounds-Exception(Diesmal mehrere, wegen mehreren Threads). Kenne mich mit den Threads auch noch nicht so gut aus, ich habe jetz einfach synchronized vor die Methode geschrieben und die Abhandlung so verändert(der relevante Teil):
Java:
                if(tmp!= null)
                {
                    final int c = i;
                    final TreeNode g = tr;
                    final int a = laufVar;
                    new Thread(){
                        public void run()
                        {
                           System.out.println("Füge Kind hinzu");
                           TreeNode child = g.addNewChild(tmp,c);
                           play(child,(a+1)); 
                        }
                    }.start();
                    //statt:
                    //System.out.println("Füge Kind hinzu");
                    //TreeNode child = tr.addNewChild(tmp,i);
                    //play(child,(laufVar+1)); //Evt. hier nur einmal play aufrufen für eine ArrayList und diese übergeben nach der for-schleife
                }
Er gibt jetzt öfter "Füge Kind hinzu aus", aber teilweise kommt nach 3x schon der Auswerten-Teil, manchmal nach 6x, es ist alles etwas wirr durcheinander.

Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
S Passende Java Collection Allgemeine Java-Themen 5
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
D Passende Name für Methoden finden Allgemeine Java-Themen 3
F Passende Struktur gesucht Allgemeine Java-Themen 6
S Suche passende substring - Methode! Allgemeine Java-Themen 9
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
N Java API für CardDav und CalDav gesucht Allgemeine Java-Themen 4
B OCR Library gesucht Allgemeine Java-Themen 6
V Javalehrer gesucht Allgemeine Java-Themen 2
K Java-Forum gesucht Allgemeine Java-Themen 12
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
A Hilfe gesucht Allgemeine Java-Themen 44
N Schulung zu Tomcat/JSP/Struts gesucht Allgemeine Java-Themen 0
E Gewollte Endlosschleife unterbrechen oder Alternative gesucht Allgemeine Java-Themen 2
S API gesucht Allgemeine Java-Themen 3
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
Londi DJ MP3 Lib gesucht Allgemeine Java-Themen 0
I Dringend nachhilfe in programmieren gesucht!!!!!!!! Allgemeine Java-Themen 1
I Dringend nachhilfe in programmieren in mannheim gesucht!!!!! Allgemeine Java-Themen 3
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
J Kalenderwecker gesucht Allgemeine Java-Themen 2
D Kuriose Geschichte -> Antwort gesucht Allgemeine Java-Themen 4
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
S Java XTools gesucht Allgemeine Java-Themen 2
N Boolsche Algebra via eval vereinfachen -> Ausmultiplizieren gesucht Allgemeine Java-Themen 15
E Nachhilfe in Java gesucht!!! Allgemeine Java-Themen 3
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
B Dringend Hilfe gesucht für Struktogramm Allgemeine Java-Themen 11
N Liste gesucht Allgemeine Java-Themen 2
Guybrush Threepwood Pattern gesucht: Punkt ohne Leerzeichen dahinter Allgemeine Java-Themen 3
B IRC-Library Gesucht Allgemeine Java-Themen 2
T Projektthema gesucht Allgemeine Java-Themen 2
c_sidi90 Aufgaben für Einstellungstest (Azubicasting) gesucht Allgemeine Java-Themen 10
M WebFramework für Userhandling gesucht Allgemeine Java-Themen 7
E Dezimalzahl -> Hexadezimalzahl [Lösungsweg gesucht] Allgemeine Java-Themen 2
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
R Collections Datenstruktur gesucht Allgemeine Java-Themen 12
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
alex_fairytail IT-Kleinprojekt: Ideen gesucht! Allgemeine Java-Themen 18
B TypeOf oder ähnliches gesucht Allgemeine Java-Themen 3
A Bibliothek für NP-harte Zuordnung gesucht. Allgemeine Java-Themen 7
E Super erzwingen, konzept/pattern gesucht. Allgemeine Java-Themen 8
S Webstart: vollständige JNLP-Doku. gesucht Allgemeine Java-Themen 4
S Meinung zu Programmidee gesucht Allgemeine Java-Themen 9
Guybrush Threepwood Neuronale Netzwerke - Bibliothek gesucht Allgemeine Java-Themen 3
agentone Graphen-Lib gesucht Allgemeine Java-Themen 7
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
F Spam-Mail-Programm gesucht Allgemeine Java-Themen 11
S JKL - Bibiliothek gesucht ? Allgemeine Java-Themen 9
hdi Beispiel für EDT Violations gesucht Allgemeine Java-Themen 4
J Open Source Projekt anbieten - Leitfaden gesucht Allgemeine Java-Themen 3
E Mehrfacher vererbungsersatz gesucht. Allgemeine Java-Themen 9
A Regex gesucht Allgemeine Java-Themen 9
J Parser / Scanner / Tokenizer gesucht Allgemeine Java-Themen 3
V DecimalformatPattern gesucht Allgemeine Java-Themen 4
as182005 Bibliothek für Graph Visualisierung gesucht Allgemeine Java-Themen 3
H Framework empfehlung / gute Anfängerbeispiele gesucht Allgemeine Java-Themen 12
M Texteditor gesucht Allgemeine Java-Themen 3
B Effizienter Suchalgorithmus gesucht Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
P Java-Security-Aufgabe gesucht Allgemeine Java-Themen 2
J Listener für Ende eines Threads gesucht... Allgemeine Java-Themen 5
T Webseite (HTML) Parser gesucht Allgemeine Java-Themen 8
D klassenstruktur gesucht Allgemeine Java-Themen 17
N Datenstruktur für Netze gesucht Allgemeine Java-Themen 8
B Pattern gesucht, Programm Optionen, Casten vermeiden Allgemeine Java-Themen 3
S Verschlüsselungsbibliotheken gesucht Allgemeine Java-Themen 8
N Empfehlung für Java 1.5 Decompiler gesucht Allgemeine Java-Themen 2
D Banking Framework gesucht Allgemeine Java-Themen 5
G OOP Umsetzung gesucht Allgemeine Java-Themen 25
S Netzwerkdiagramm / Sequenzdiagramm - Ideen gesucht Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
J Bibliothek gesucht Ana_lysieren von wss. Referenzen Allgemeine Java-Themen 2
S VideoStreaming-Tool gesucht! Allgemeine Java-Themen 2
G Sehr gutes Java-Framework(Gui-Builder) auf XML-Basis gesucht Allgemeine Java-Themen 21
T Datenstruktur gesucht Allgemeine Java-Themen 18
D Report Engine gesucht Allgemeine Java-Themen 2
F Idee fuer Suchfeldmapping gesucht Allgemeine Java-Themen 10
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
0 Rechenaufwändiger, kurzer Codeschnipsel gesucht! Allgemeine Java-Themen 17
E Countdownfunktion gesucht Allgemeine Java-Themen 52
S Koridinatensystem gesucht Allgemeine Java-Themen 4
M IRC Chat - Klasse oder Application gesucht Allgemeine Java-Themen 9
D gesucht Wörterbuch deutsch / englisch Allgemeine Java-Themen 4
N Denkanstösse zu Schnittmengensuche gesucht Allgemeine Java-Themen 9
M Schnell kleine Hilfe gesucht! Allgemeine Java-Themen 3
K Elegante Lösung zum Manipulieren von Collections gesucht Allgemeine Java-Themen 16
B Formel Interpreter gesucht Allgemeine Java-Themen 7
S Methode zum Zählen von Buchstaben in Strings gesucht Allgemeine Java-Themen 11
K Prozess-Visualisierung: Stichwörter gesucht Allgemeine Java-Themen 4
B Unicode für Kreuz gesucht Allgemeine Java-Themen 2
H Unicode Darstellung in Java, spezielles Zeichen gesucht Allgemeine Java-Themen 4
foobar Alternative zu JavaHelp gesucht Allgemeine Java-Themen 2
B Methode gesucht Allgemeine Java-Themen 3
H if - else if-else bessere Lösung gesucht Allgemeine Java-Themen 4
M Chat-Software gesucht Allgemeine Java-Themen 3
T Design-Tipp gesucht Allgemeine Java-Themen 2
G Shopsystem gesucht Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben