• Keine Ergebnisse gefunden

MAX MINMAX

N/A
N/A
Protected

Academic year: 2021

Aktie "MAX MINMAX"

Copied!
79
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Informatik II für Elektrotechniker

FS 2008

Der α-β-Algorithmus

(2)

• Unterbäume abschneiden, die den Minimax-Wert nicht

beeinflussen

• Ziel: Schnittmöglichkeiten möglichst früh erkennen und möglichst viele Unterbäume

abschneiden Skript S. 182

Baumschnitte

(3)

Implementierung (Beispiel)

int maxValue (GameState g, int α, int β) { if (cutofftest(g)) return eval(g);

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(α, minValue(s, α, β));

if (α ≥ β) break; // β-Schnitt }

return α;

}

int minValue (GameState g, int α, int β) { if (cutofftest(g)) return eval(g);

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { β = min(β, maxValue(s, α, β));

if (β ≤ α) break; // α-Schnitt }

return β;

}

Skript S. 183

(4)

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g

10 20 3 8 4 35 1 17 22

MAX MIN MAX

(5)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞));

if ( β ≤ -∞) break;

}

return β;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

MAX MIN MAX

(6)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , minValue(s, -∞, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞));

if ( β ≤ -∞) break;

}

return β;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(-∞, +∞)

g2

MAX MIN MAX

(7)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , minValue(s, -∞, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞));

if ( β ≤ -∞) break;

}

return β;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g3, -∞, +∞)

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(-∞, +∞)

(-∞, +∞)

g2 g3

MAX MIN MAX

(8)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , minValue(s, -∞, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞));

if ( β ≤ -∞) break;

}

return β;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g3, -∞, +∞) cutofftest(g3)) Æ true!!

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(-∞, +∞)

(-∞, +∞)

g2 g3

MAX MIN MAX

(9)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , minValue(s, -∞, +∞));

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞));

if ( β ≤ -∞) break;

}

return β;

minValue(g3, -∞, +∞) cutofftest(g3)) Æ true!!

eval(g3) = 5

return 5

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(-∞, +∞)

(-∞, +∞)

g2 g3

MAX MIN MAX

(10)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞) break;

}

return β;

minValue(g3, -∞, +∞) cutofftest(g3)) Æ true!!

eval(g3) = 5

return 5

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(-∞, +∞)

(-∞, +∞)

g2 g3

MAX MIN MAX

(11)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , 5 );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞) break;

}

return β;

minValue(g3, -∞, +∞) cutofftest(g3)) Æ true!!

eval(g3) = 5

return 5

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(-∞, +∞)

g2 g3

MAX MIN MAX

(-∞, +∞)

(12)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( -∞ , 5 );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞) break;

}

return β;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

g2

MAX MIN MAX

(-∞, +∞)

(13)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 5;

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞) break;

}

return β;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

g2

MAX MIN MAX

(5, +∞)

(14)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 5;

if ( α ≥ +∞ )break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(5, +∞)

g2

false!

MAX MIN MAX

(15)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(5, +∞)

g2

MAX MIN MAX

next successor

(16)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(5, +∞)

g2

minValue(g4, 5 , +∞)

( 5, +∞)

g4

MAX MIN MAX

(17)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(5, +∞)

g2

minValue(g4, 5 , +∞) cutofftest(g4)) Æ true!!

( 5, +∞)

g4

MAX MIN MAX

(18)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ β ) break; // β-Schnitt }

return α;

minValue(g4, 5 , +∞) cutofftest(g4)) Æ true!!

eval(g4) = 10

return 10 maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(5, +∞)

g2

( 5, +∞)

g4

MAX MIN MAX

(19)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ β ) break; // β-Schnitt }

return α;

minValue(g4, 5 , +∞) cutofftest(g4)) Æ true!!

eval(g4) = 10

return 10 maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , minValue(s, 5 , +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

(5, +∞)

g2

( 5, +∞)

g4

MAX MIN MAX

(20)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = max( 5 , 10 );

if ( α ≥ +∞) break;

}

return α;

minValue(g4, 5 , +∞) cutofftest(g4)) Æ true!!

eval(g4) = 10

return 10 maxValue(g, -

∞, + ∞)

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 5, +∞)

g2

( 5, +∞)

g4

MAX MIN MAX

(21)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

MAX MIN MAX

(22)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞ )break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞ , maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

false!

MAX MIN MAX

(23)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞ )break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

g2 has no more successors!

MAX MIN MAX

(24)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞ )break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

g2 has no more successors!

MAX MIN MAX

(25)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞ )break;

}

return 10;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

g2 has no more successors!

MAX MIN MAX

(26)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞ )break;

}

return 10;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞ , maxValue(s, -∞, +∞) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

g2 has no more successors!

MAX MIN MAX

(27)

maxValue(g2,-∞, +∞)

cutofftest(g2) Æfalse

for (GameState s = g2.firstsucc; s != g2.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞ )break;

}

return 10;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞ , 10 );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

( 10, +∞)

g2

MAX MIN MAX

(28)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞ , 10 );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, +∞)

MAX MIN MAX

(29)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return β;

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞)

(-∞, 10)

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

MAX MIN MAX

(30)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return β;

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞)

(-∞, 10)

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

false!

MAX MIN MAX

(31)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞)

(-∞, 10)

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

MAX MIN MAX

next successor

(32)

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞ , 10) );

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(-∞, 10)

MAX MIN MAX

(33)

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞ , 10) );

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

minValue(g6, -∞, 10)

(-∞, 10)

(-∞, 10)

g6

MAX MIN MAX

(34)

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞ , 10) );

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

minValue(g6, -∞, 10) cutofftest(g6)) Æ true!!

(-∞, 10)

(-∞, 10)

g6

MAX MIN MAX

(35)

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞ , 10) );

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

minValue(g6, -∞, 10) cutofftest(g6)) Æ true!!

eval(g6) = 20

return 20

(-∞, 10)

(-∞, 10)

g6

MAX MIN MAX

(36)

minValue(g6, -∞, 10) cutofftest(g6)) Æ true!!

eval(g6) = 20

return 20 maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = max(-∞, minValue(s, -∞ , 10) );

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(-∞, 10)

(-∞, 10)

g6

MAX MIN MAX

(37)

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = max(-∞ , 20 );

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

minValue(g6, -∞, 10) cutofftest(g6)) Æ true!!

eval(g6) = 20

return 20

(-∞, 10)

(-∞, 10)

g6

MAX MIN MAX

(38)

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = 20;

if ( α ≥ 10) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(20, 10)

MAX MIN MAX

(39)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = 20 ;

if ( 20 ≥ 10 )break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(20, 10)

true!

MAX MIN MAX

(40)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10 , maxValue(s, -∞, 10));

if ( β ≤ -∞ ) break;

}

return β;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = 20 ;

if ( 20 ≥ 10 )break; // β Schnitt!!

}

return 20;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(20, 10)

β

MAX MIN MAX

(41)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10, maxValue(s, -∞, 10) );

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = 20 ;

if ( 20 ≥ 10 )break; // β Schnitt!!

}

return 20;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(20, 10)

β

MAX MIN MAX

(42)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(10 , 20);

if ( β ≤ -∞ ) break;

}

return β;

maxValue(g5, -∞, 10)

cutofftest(g5) Æfalse

for (GameState s = g5.firstsucc; s != g5.lastsucc; s = s.nextsucc) { α = 20 ;

if ( 20 ≥ 10 )break; // β Schnitt!!

}

return 20;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

g5

(20, 10)

β

MAX MIN MAX

(43)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

β

MAX MIN MAX

(44)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

β

false!

MAX MIN MAX

(45)

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return 10;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return β;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

β

g1 has no more successors!

MAX MIN MAX

(46)

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , minValue(s, -∞, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return 10;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

β

g1 has no more successors!

MAX MIN MAX

(47)

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(-∞ , 10 );

if ( α ≥ +∞) break;

}

return α;

minValue(g1, -∞, +∞)

cutofftest(g1)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = 10;

if ( 10 ≤ -∞ )break;

}

return 10;

5

(-∞, +∞) g g1

10 20 3 8 4 35 1 17 22

(-∞, 10)

β

MAX MIN MAX

(48)

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

MAX MIN MAX

(49)

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

false!

MAX MIN MAX

(50)

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

MAX MIN MAX

(51)

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g9, 10, +∞)

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g7.firstsucc; s != g7.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

(10, +∞)

g8

(10, +∞)

g9

MAX MIN MAX

(52)

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

minValue(g9, 10, +∞) cutofftest(g9)) Æ true!!

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g7.firstsucc; s != g7.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

(10, +∞)

g8

(10, +∞)

g9

MAX MIN MAX

(53)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g9, 10, +∞) cutofftest(g9)) Æ true!!

eval(g9) = 8

return 8 maxValue(g, -

∞, + ∞)

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

(10, +∞)

g9

MAX MIN MAX

(54)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g9, 10, +∞) cutofftest(g9)) Æ true!!

eval(g9) = 8

return 8 maxValue(g, -

∞, + ∞)

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

(10, +∞)

g9

MAX MIN MAX

(55)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , 8);

if ( α ≥ +∞) break;

}

return α;

minValue(g9, 10, +∞) cutofftest(g9)) Æ true!!

eval(g9) = 8

return 8 maxValue(g, -

∞, + ∞)

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

(10, +∞)

g9

MAX MIN MAX

(56)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = 10;

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

MAX MIN MAX

(57)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = 10

if ( 10 ≥ +∞ )break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

false!

MAX MIN MAX

(58)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

MAX MIN MAX

next successor

(59)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

( 10, +∞)

g10

minValue(g10, 10, +∞)

MAX MIN MAX

(60)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

maxValue(g, -

∞, + ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

( 10, +∞)

g10

minValue(g10, 10, +∞) cutofftest(g10)) Æ true!!

MAX MIN MAX

(61)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g10, 10, +∞) cutofftest(g10)) Æ true!!

eval(g10) = 4 return 4 maxValue(g, -

∞, + ∞)

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

( 10, +∞)

g10

MAX MIN MAX

(62)

maxValue(g8, 10, +∞)

cutofftest(g8) Æfalse

for (GameState s = g8.firstsucc; s != g8.lastsucc; s = s.nextsucc) { α = max( 10 , minValue(s, 10, +∞));

if ( α ≥ +∞) break;

}

return α;

minValue(g10, 10, +∞) cutofftest(g10)) Æ true!!

eval(g10) = 4 return 4 maxValue(g, -

∞, + ∞)

cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = 10;

if ( 10 ≥ +∞)break;

}

return α;

maxValue(g, -

∞,+ ∞) cutofftest(g) Æfalse

for (GameState s = g.firstsucc; s != g.lastsucc; s = s.nextsucc) { α = max(10 , minValue(s, 10, +∞) );

if ( α ≥ +∞) break;

}

return α;

5

(10, +∞) g

10 20 3 8 4 35 1 17 22

β

(10, +∞) g7

minValue(g7, 10, +∞)

cutofftest(g7)) Æfalse

for (GameState s = g1.firstsucc; s != g1.lastsucc; s = s.nextsucc) { β = min(+∞, maxValue(s, 10, +∞));

if ( β ≤ 10 ) break;

}

return β;

(10, +∞)

g8

( 10, +∞)

g10

MAX MIN MAX

Referenzen

ÄHNLICHE DOKUMENTE

Auch wenn einige Arzneimittel für Kinder zugelassen sind, gilt die Zulas- sung häufig nur für sehr eng definierte Krankheitsbilder.. So müssen Eltern von PTA und Apotheker

In nachfolgendem soll angenommen werden, daß das etwa im Dampf enthaltene Wasser auf seinem Wege zum Überhitzer nicht wesentlich unter die Temperatur der dem Drucke

Ihnen will er auch in der Zukunft genau zuhören: „Wir brauchen ein offenes Ohr für Kolleginnen und Kollegen, die in der DGI mitmachen wollen.“ Es fallen im Gespräch

Die Autoren weisen namentlich darauf hin, dass zur beruflichen und sozialen Reintegration dieser Menschen gesundheitsfördernde, bildungsorientierte und sozial

Während der Angeklagte B dabei ist, den Saal zu verlassen, verliest ein Zuschauer eine Erklärung, in der er Richter Oehm auffordert, seine „eigene Befangenheit“ einzugestehen und

Das Berlin-Institut für Bevölkerung und Entwicklung ist ein unabhängiger Thinktank, der es sich zur Aufgabe gemacht hat, das Bewusstsein für den demografischen Wandel zu

Die kantonsrätliche Umwelt-, Bau und Wirtschaftskommission stimmt einstimmig für den Beitritt zur total revidierten Interkantonalen Vereinbarung über das öffentliche

der Liste aller Freundeskreismitglieder im 2021 und teils schon für 2022 - und ebenso aufgeführt sind unsere grosszügigen Unterstützer – neben der Gemeinde Wollerau viele