Fitness Variation Descriptions

1 The idea of the first variation is to add an advantage to those hypotheses which retain a larger net possession of pieces throughout the game. That is, after every move, a running tab is kept of who has had more pieces on the board, accumulatively, from the first move on. The idea is that the resultant state of the board may not indicate fully which player had an advantage throughout the game: if a player has an advantage throughout the game rather than just near to the end, it is more likely that he will end up winning regardless of the opponent's chosen moves near the end.
One can think of an analogy in soccer: it is common to determine who has had ball possession for a longer period to determine who has played a better game..after all, you can't score unless you at least first have the ball.
Modified code in
2 The purpose of this variation is similar to the one above; the attempt is to reward those hypothesis which retain "possession" for the most moves during a game. Rather than keep track of the net surplus of pieces throughout each move, a counter is simply incremented for each move that our hypothesis has more pieces than the opponent. At the end of the game, a fraction of the default fitness proportional to the incremented counter is subtracted from the default fitness (remember that the lower the fitness the better). The use of a "fractional" reward insures that fitness will not go below zero. Modified code in
4 This variation tried to represent a heuristic similar to the default heuristic but in a different form. Instead of encoding the amount of pieces white won by as the number of pieces black one, encode it as the net number of pieces white won after all the games. The numbers obtained are quite different, and the trees formulated are dramatically different as will be shown in the Results section. Modified code in
5 This variation is simple. Instead of calculating the number of pieces the opponent won by, simply measure fitness solely on whther or not the hypothesis led to a win. That is, for a 5 game fitness measure, the maximum fitness is 5 and the minimum is 0. (The implementation for this actually treats a win as a "1" and a loss as a "5"). This variation was motivated out of the fact that less bias allows for more generalization. If we measure fitness solely on the goal, rather than biasing what we think would be beneficial in obtaining that goal (i.e. maximizing the piece differential between players), we may be ruling out other more effective hypotheses. Modified code in
6 This is Variation 5, but the for fitness is determined over 10 games instead of 5. The for loop in the evaluate() function of was simply altered to accomodate 10 iterations.
7 Variation 5 over 15 iterations (games) for each evaluation. The above mentioned for loop is altered to accomodate 15 iterations.
8 Variation 1 over 10 iterations. See above
9 Variation 2 over 10 iterations. See above

Modified Code

Variation 1 -- modified

//...within game loop...

/*VARIATION 1 - */

fitness_var1 += board.num_white - board.num_black;

//...outside game loop, within for loop...

rawFitness = board.score[OthelloBoard.BLACK] - fitness_var1;
stdF += rawFitness;


Variation 2 -- modified evaluate() in

//...within for loop

board = new OthelloBoard();

//djp26 -- initialize new fitness variation for each game

fitness_var2 = 0.0;

while(!board.gameOver()) {

if (board.gameTurn==OthelloBoard.BLACK) {
} else {

/*VARIATION 2 - */

if (board.num_white > board.num_black)
rawFitness = board.score[OthelloBoard.BLACK];
fitness_var2 = (fitness_var2/100) * rawFitness;
rawFitness -= fitness_var2;
stdF += rawFitness;

Variation 4 -- modified evaluate() in

//...within for loop...simply a new calculation for the rawFitness term.

rawFitness = board.score[OthelloBoard.BLACK] - board.score[OthelloBoard.WHITE];

//....alter return variable to insure a fitness greater than zero.

return stdF + 500;

Variation 5 -- modified evaluate() in

//...within for loop...simply a new calculation for the rawFitness term.

if (board.score[OthelloBoard.BLACK] > board.score[OthelloBoard.WHITE])
rawFitness = 5;
rawFitness = 1;

stdF += rawFitness;


Dave Pisapia -- April 4, 2000--

Machine Learning, cs4771
Professor Siegel
Columbia University