-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathProgram.cs
85 lines (74 loc) · 3.37 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Drawing;
namespace Heuristic.Linq.Example.EightPuzzle
{
class Program
{
static void Main(string[] args)
{
while (true)
{
// http://www.8puzzle.com/images/8_puzzle_start_state_a.png
var initial = new BoardState(new[]
{
new Point(1, 2), // empty square
new Point(0, 1), // square 1
new Point(0, 0), // square 2
new Point(2, 0), // square 3
new Point(2, 1), // square 4
new Point(2, 2), // square 5
new Point(1, 1), // square 6
new Point(0, 2), // square 7
new Point(1, 0), // square 8
});
// http://www.8puzzle.com/images/8_puzzle_goal_state_a.png
var goal = new BoardState(new[]
{
new Point(1, 1), // empty square
new Point(0, 0), // square 1
new Point(1, 0), // square 2
new Point(2, 0), // square 3
new Point(2, 1), // square 4
new Point(2, 2), // square 5
new Point(1, 2), // square 6
new Point(0, 2), // square 7
new Point(0, 1), // square 8
});
Console.WriteLine("A)* Search");
Console.WriteLine("B)est-first Search");
Console.WriteLine("I)terative Deepening AStar Search");
Console.WriteLine("R)ecursive Best-first Search");
Console.Write("Select an algorithm: ");
var queryable = default(HeuristicSearchBase<BoardState, BoardState>);
// Initialize the algorithm with the callback that gets all valid moves.
switch (Console.ReadKey().Key)
{
case ConsoleKey.A:
queryable = HeuristicSearch.AStar(initial, goal, (board, lv) => board.GetNextSteps());
break;
case ConsoleKey.B:
queryable = HeuristicSearch.BestFirstSearch(initial, goal, (board, lv) => board.GetNextSteps());
break;
case ConsoleKey.I:
queryable = HeuristicSearch.IterativeDeepeningAStar(initial, goal, (board, lv) => board.GetNextSteps());
break;
case ConsoleKey.R:
queryable = HeuristicSearch.RecursiveBestFirstSearch(initial, goal, (board, lv) => board.GetNextSteps());
break;
default: continue;
}
Console.WriteLine();
// GetSumOfDistances() calculates the sum of Manhattan distance
// between each of square and its goal.
// -------------------------------------------------
var solution = from board in queryable
orderby board.GetSumOfDistances(goal)
select board;
// -------------------------------------------------
// Print out the solution.
foreach (var board in solution)
Console.WriteLine(board);
}
}
}
}