Minimix/AlphaBeta fuer KI



  • Hallo.
    Ich versuche derzeit eine KI mit Hilfe des Minimax-Algorithmus zu schreiben, aber kriege es noch nicht so wirklich hin...
    z.B. was stimmt hier nicht?

    int Min(int depth)
    {
    	int neuerwert;
    	int alterwert = 10000;
    
    	ArrayVonZuegen arr;
    	arr = SucheAlleMoeglichenZuege();
    
    	for (size_t i=0; i<arr.size(); i++)
    	{
    		SimuliereZug(arr[i]);
    
    		if (depth == 0 || KeineZuegeMehrMoeglich())
    			neuerwert = BewerteSpieleSituationVonDemDerAmZugIst();
    		else
    			neuerwert = Max(depth-1);
    
    		MacheZugRueckgaengig();
    
    		if (neuerwert<alterwert)
    			alterwert = neuerwert;
    	}
    
    	return alterwert;
    }
    
    int Max(int depth)
    {
    	int neuerwert;
    	int alterwert = -10000;
    
    	ArrayVonZuegen arr;
    	arr = SucheAlleMoeglichenZuege();
    
    	for (size_t i=0; i<arr.size(); i++)
    	{
    		SimuliereZug(arr[i]);
    
    		if (depth == 0 || KeineZuegeMehrMoeglich())
    			neuerwert = BewerteSpieleSituationVonDemDerAmZugIst();
    		else
    			neuerwert = Min(depth-1);
    
    		MacheZugRueckgaengig();
    
    		if (neuerwert>alterwert)
    			alterwert = neuerwert;
    	}
    
    	return alterwert;
    }
    
    void FuehreBestenZugAus()
    {
    	// hier ist auch so ein Problem - wie finde ich jetzt anhand von Min()
    	// und Max() den besten Zug?
    }
    

    Und wie erweitere ich dann den Algorithmus um das AlphaBeta-Verfahren, um einen Laufzeitvorteil zu erlangen? (wobei ich ja schon zufrieden waere, wenn das mit dem Minimax funktioniert 😞 )
    Waehre fuer jede Hilfe dankbar!

    P.S.: Bitte nicht ins Spiele-Forum verschieben, weil 1. hat das nichts mit Grafik zu tun und 2. kann ich dann nicht mehr antworten 😃


  • Mod

    Du hast etwas wichtiges vergessen: Was ist dein Problem? Ich sehe nur eine Menge Programmcode in dem angeblich irgendein nicht näher bekannter Fehler sein soll.



  • Zug FuehreBestenZugAusNeeFindeIhnNur()
    {
    //alles kopier von Max
        int neuerwert; 
        Zug alterzug; //neu
        int alterwert = -10000; 
    
        ArrayVonZuegen arr; 
        arr = SucheAlleMoeglichenZuege(); 
    
        for (size_t i=0; i<arr.size(); i++) 
        { 
            SimuliereZug(arr[i]); 
    
            if (depth == 0 || KeineZuegeMehrMoeglich()) 
                neuerwert = BewerteSpieleSituationVonDemDerAmZugIst(); 
            else 
                neuerwert = Min(depth-1); 
    
            MacheZugRueckgaengig(); 
    
            if (neuerwert>alterwert) 
            {
                alterwert = neuerwert; 
                alterzug = arr[i];//neu
            }
        } 
    
        return alterzug; //geändert
    }
    


  • hi
    uff... also hab jetzt noch die ganze Zeit rumprobiert - aber meine KI bleibt einfach nur strohdumm... hab das jetzt genauso implementiert wie du (volkard) es geschrieben hast, aber irgendwo ist noch der Wurm drin.
    Wo liegt nur der Fehler?
    Teilweise wiederholt die KI auch sinnloserweise Zuege, obwohl diese haetten vermieden werden koennen.



  • Ich hab nix verbessert oder repariert, sondern nur

    // hier ist auch so ein Problem - wie finde ich jetzt anhand von Min() 
    // und Max() den besten Zug?
    

    beantwortet.


Anmelden zum Antworten