Difference between revisions of "Connect Four"

From CSE231 Wiki
Jump to navigation Jump to search
Line 45: Line 45:
  
 
=Code To Implement=
 
=Code To Implement=
==Win or Lose Heuristic==
+
==Negamax==
{{CodeToImplement|WinOrLoseHeuristic|evaluate|connectfour.studio}}
+
{{CodeToImplement|ConnectFour|select<br>negamaxKernel<br>selectNextColumn|connectfour.studio}}
  
{{Sequential|public double evaluate(Board board)}}
+
{{Sequential|private static ColumnEvaluationPair select(ColumnEvaluationPair[] array)}}
  
==Sequential Negamax==
+
{{Parallel|static ColumnEvaluationPair negamaxKernel(Board board, Heuristic heuristic, IntPredicate parallelPredicate, IntPredicate evaluatePredicate, int currentDepth)}}
{{CodeToImplement|SequentialConnectFour|negamax|connectfour.studio}}
 
  
{{Sequential|public static ColumnEvaluationPair negamax(Board board, Player playerWhoseTurnItIs, Config config, int currentDepth)}}
+
{{Sequential|public static int selectNextColumn(Board board, Heuristic heuristic, IntPredicate parallelPredicate, IntPredicate evaluatePredicate)}}
  
==Parallel Choose Your Own Adventure==
+
==Win or Lose Heuristic==
The approach for each of the parallel paths is fundamentally the same.  Create tasks for each branch until you reach the specified depth at which you transition to sequential.
+
{{CodeToImplement|WinOrLoseHeuristic|evaluate|connectfour.studio}}
  
The forall and futures paths use our X10 inspired features.  The NegamaxTask path is more well suited to those interested in standard Java parallel constructs.
+
{{Sequential|public double evaluate(Board board)}}
 
 
Choose one of the following paths:
 
===path a) forall===
 
{{CodeToImplement|ParallelForallConnectFour|negamax|connectfour.studio.chooseyourownadventure.forall}}
 
 
 
{{Parallel|public static ColumnEvaluationPair negamax(Board board, Player playerWhoseTurnItIs, Config config, int currentDepth)}}
 
  
===path b) futures===
+
==OpenEndedHeuristic (Optional)==
{{CodeToImplement|ParallelFuturesConnectFour|negamax|connectfour.studio.chooseyourownadventure.futures}}
 
 
 
{{Parallel|public static ColumnEvaluationPair negamax(Board board, Player playerWhoseTurnItIs, Config config, int currentDepth)}}
 
 
 
===path c) recursive tasks===
 
{{CodeToImplement|NegamaxTask|compute|connectfour.studio.chooseyourownadventure.recursivetasks}}
 
 
 
{{Parallel|public ColumnEvaluationPair compute()}}
 
 
 
==OpenEndedHeuristic==
 
NOW OPTIONAL
 
 
{{CodeToImplement|OpenEndedHeuristic|evaluate|connectfour.challenge}}
 
{{CodeToImplement|OpenEndedHeuristic|evaluate|connectfour.challenge}}
  
 
{{Sequential|public double evaluate(Board board)}}
 
{{Sequential|public double evaluate(Board board)}}
 
==(Optional) Utility==
 
You may elect to implement this utility method so that you can reuse the functionality across your negamaxes.
 
 
One of the annoying things about parallel programming is that you often have to duplicate code for the initial parallel part often followed by the sequential part when you have created enough tasks already.  When building negamax, I found that I wanted to build a common method which would select the best column value pair from both the sequential and parallel algorithms.  To allow for all of the different parallel adventures, select takes a function which returns the ColumnEvaluationPair.  As an example, for the ParallelFuturesConnectFour adventure I used:
 
 
<nowiki>return NegamaxUtils.select(futures, (future) -> chainedGet(future));</nowiki>
 
 
{{CodeToImplement|NegamaxUtils|select|connectfour.challenge}}
 
 
{{Sequential|public static <T> ColumnEvaluationPair select(T[] array, Function<T, ColumnEvaluationPair> f)}}
 
  
 
=Testing Your Solution=
 
=Testing Your Solution=

Revision as of 17:44, 13 February 2019

credit for this assignment: Finn Voichick and Dennis Cosgrove

Motivation

Minimax is an important concept in game theory and search.

Negamax is a variant which relies on

While this technique is applicable to Chess (as Deep Blue employed to defeat Kasparov), we choose Connect Four as our context since it has a simpler game mechanic.

While the core part of searches like Minimax may be easy to parallelize, critical aspects such as alpha-beta pruning are more challenging.

Parallelism can be added in a number of different ways. We can choose at our preference between: forall, futures, and RecursiveTask.

Background

Video

Tutorial

Solving Connect Four

Wikipedia

Minimax

Negamax

The Core Questions

  • What are the tasks?
  • What is the data?
  • Is the data mutable?
  • If so, how is it shared?

Code To Use

connectfour.core

interface Board

isDone()
getValidPlays()
createNextBoard(int column)

java.util.concurrent

class RecursiveTask extends ForkJoinTask

compute()

class ForkJoinTask

fork()
join()

Code To Implement

Negamax

class: ConnectFour.java Java.png
methods: select
negamaxKernel
selectNextColumn
package: connectfour.studio
source folder: student/src/main/java

method: private static ColumnEvaluationPair select(ColumnEvaluationPair[] array) Sequential.svg (sequential implementation only)

method: static ColumnEvaluationPair negamaxKernel(Board board, Heuristic heuristic, IntPredicate parallelPredicate, IntPredicate evaluatePredicate, int currentDepth) Parallel.svg (parallel implementation required)

method: public static int selectNextColumn(Board board, Heuristic heuristic, IntPredicate parallelPredicate, IntPredicate evaluatePredicate) Sequential.svg (sequential implementation only)

Win or Lose Heuristic

class: WinOrLoseHeuristic.java Java.png
methods: evaluate
package: connectfour.studio
source folder: student/src/main/java

method: public double evaluate(Board board) Sequential.svg (sequential implementation only)

OpenEndedHeuristic (Optional)

class: OpenEndedHeuristic.java Java.png
methods: evaluate
package: connectfour.challenge
source folder: student/src/main/java

method: public double evaluate(Board board) Sequential.svg (sequential implementation only)

Testing Your Solution

Visualization

class: ConnectFourViz.java VIZ
package: connnectfour.challenge
source folder: student/src//java

ConnectFourViz.png

Correctness

class: ConnectFourTestSuite.java Junit.png
package: connnectfour.challenge
source folder: testing/src/test/java