-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPlayer.java~
130 lines (121 loc) · 3.9 KB
/
Player.java~
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*File: Player.java
*Purpose:Choose an intelligent move for computer player
* Implemented with Minmax tree and alpha beta pruning
* Aurthor:Zhenjie Ruan([email protected]) Yihong Guo([email protected])
*/
public class Player {
private final int D = 4;
public Move chooseMove(Graph G) {
int max = -10000;
Move best = null;
for (int u = 0; u < 6; u++) {
for (int v = 0; v < 6; v++) {
System.out.println(u + " " + v + " " + G.isEdge(u, v));
if ((!G.isEdge(u, v)) && (u != v)) {
G.addEdge(u, v, -1);
int val = minMax(G, 1, -10000, 10000);
System.out.println(max+" "+val);
if (val > max) {
best = new Move(u, v);
max = val;
}
//G.printEdges();
G.removeEdge(u, v);
}
}
}
if(best == null){
for (int u = 0; u < 6; u++) {
for (int v = 0; v < 6; v++) {
System.out.println(u + " " + v + " " + G.isEdge(u, v));
if ((!G.isEdge(u, v)) && (u != v)) {
return new Move(u,v);
}
}
}
}
return best;
}
int minMax(Graph G, int depth, int alpha, int beta) {
boolean flag = false;
for (int u = 0; u < 6; u++) {
for (int v = 0; v < 6; v++) {
if ((!G.isEdge(u, v)) && (u != v)) {
flag = true;
break;
}
}
}
if (flag == false || depth == D) {
return eval(G);
} else if(depth%2 == 0){
int val = -10000;
for (int u = 0; u < 6; u++) {
for (int v = 0; v < 6; v++) {
if ((!G.isEdge(u, v)) && (u != v)) {
G.addEdge(u, v, -1);
alpha = max(alpha, val);
if (beta < alpha) {
G.removeEdge(u, v);
break;
}
val = max(val, minMax(G, depth + 1, alpha, beta));
//G.printEdges();
G.removeEdge(u, v);
}
}
}
//G.printEdges();
return val;
}else{
int val = 10000;
for (int u = 0; u < 6; u++) {
for (int v = 0; v < 6; v++) {
if ((!G.isEdge(u, v)) && (u != v)) {
G.addEdge(u, v, 1);
beta = min(beta, val);
if (beta < alpha) {
G.removeEdge(u, v);
break;
}
val = min(val, minMax(G, depth + 1, alpha, beta));
//G.printEdges();
G.removeEdge(u, v);
}
}
}
//G.printEdges();
return val;
}
}
public int max(int a, int b) {
if (a > b) {
return a;
}
return b;
}
public int min(int a, int b){
if(a < b){
return a;
}
return b;
}
public int eval(Graph G) {
int count = 0;
if (G.isCycleOfLength(3,-1)){
return -10000;
} else if (G.isCycleOfLength(3, 1))
return 10000;
for (int u = 0; u < 6; u++) {
int A = G.degree(u, 1); //red
int B = G.degree(u, -1); //blue
if (A > 1) {
count = count + A;
}
if (B > 1) {
count = count - B;
}
}
return count;
}
}