广工人工智能实验报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*@return{[type]} [description]
*/
Chessboard。prototype。evaluate = function(){
//max,min权重,max连棋数,min连棋数
var maxW = minW = 0,
maxCount,minCount;
//横向计算
for (var i = 0; i < this.row; i++){
arr[i]= [];
for (var j = 0; j < column;j++) {
var sum = 0;
for (var n = 0; n〈this.column;n++) {
sum +=(this。data[i][n]*matrix。data[n][j]);
}
arr[i][j] = sum;
if(maxCount == this。row){
return Infinity;
} else{
if(minCount == this。row){
return—Infinity;
} else {
//如果没有max的棋子,则min可能连成3子
if (!maxCount){
minW++;
}
//如果没有min的棋子,则max可能连成3子
for (var j = 0, m = this。column;j < m; j++){
this。data[i][j] = Chessboard.NONE;
}
}
this。stack =[];
this.is_ended = false;
};
/**
*[availableSteps获取可走的位置]
*@return{[type]}[description]
if(type== Chessboard。MIN){
minCount++;
}
}
}
//如果连成3子
if(maxCount == 3){
return Infinity;
}else {
if (minCount == 3){
return -Infinity;
} else {
//如果没有max的棋子,则min可能连成3子
*/
Chessboard.prototype。put = function(row,column,type){
if (this.data[row][column]== Chessboard.NONE) {
this.data[row][column]= type;
this.stack。push({
row: row,
if(this。data[i][j]== Chessboard。NONE){
availableSteps。push({
row: i,
column:j
});
}
}
}
return availableSteps;
};
/**
*[rotate把棋盘旋转90度]
*@return{[type]}[description]
this。data =[];
this.row = row;
this.column = column;
for(var i = 0;i < row; i++){
this。data[i]= [];
for (var j = 0; j〈column;j++){
this。data[i][j] = Chessboard。NONE;
*/
Chessboard.prototype.availableSteps = function(){
var availableSteps =[];
for (var i = 0, n = this.row; i〈n; i++) {
for (var j = 0,m = this.column;j < m;j++) {
return data.toString();
})。join('\n');
};
/**
* [put下棋]
* @param{[type]} row[行]
*@param {[type]} column [列]
* @param {[type]}type [人还是AI下棋]
* @return {[type]}[description]
*@return{[type]}[description]
*/
Chessboard.prototype。rollback = function(n){
n = || 1;
for(var i = 0; i〈n;i++){
var step = this。stack。pop();
if(step){
this.data[step.row][step。column] = Chessboard。NONE;
[1,0,0],
[0,1,0],
[—dx, -dy,1]
]);
var translateMatrix2 = new Matrix([
[1, 0,0],
[0,1, 0],
[dx,dy,1]
]);
var rotateMatrix = new Matrix([
[0,—1, 0],
[1, 0, 0],
[0,0,1]
column: column,
type:type
});
if(this。stack。length == this.row*this。column){
this。is_ended = true;
}
}
return this;
};
/**
*[rollback悔棋]
*@param {[type]} n[后退n步]
}
}
return newMatrix(arr);
}
};
/**
*[Chessboard棋盘]
* @param {[type]} row[description]
* @param {[type]}column[description]
*/
var Chessboard = function(row,column){
//当前这一行,max连棋数,min连棋数
maxCount = minCount = 0;
for(var j = 0; j〈this.column; j++){
var type = this。data[i][j];
if(type == Chessboard。MAX){
maxCount++;
}else {
};
/**
*[hash给棋盘一个编码]
*@param {[type]} sourceRadix[来源进制]
*@param{[type]}targetRadix[目的进制]
*@return {[type]}[description]
*/
Chessboard.prototype.hash = function(sourceRadix, targetRadix) {
]);
var res = matrix.multiply(translateMatrix1).multiply(rotateMatrix).multiply(translateMatrix2);
board。put(res。data[0][0], res.data[0][1],type);
}
}
return board;
if (!minCount) {
maxW++;
}
}
}
}
//右斜下方向计算
maxCount = minCount = 0;
for (var i = 0; i〈this.column; i++) {
var str = this.data。map(function(arr){
return arr。join('');
}).join('’);
return parseInt(str,sourceRadix).toString(targetRadix);
};
/**
*[evaluate计算当前棋盘的估值]
this.data = arr;
this。row = arr.length;
this.column = arr。length ? arr[0].length : 0;
};
/**
*[multiply矩阵乘法转换]
*@param{[type]} matrix [转换矩阵]
*@return{[type]}[description]
if(!maxCount){
minW++;
}
//如果没有min的棋子,则max可能连成3子
if(!minCount){
maxW++;
}
}
}
}
//纵向计算
for (var i = 0; i〈this.column;i++) {
//当前这一列,max连棋数,min连棋数
maxCount = minCount = 0;
什么是alpha—beta剪枝呢?就是如果max人类当前一种走法1至少可以获取alpha优势,而另一种走法2,min电脑的一步棋则可能让人类获取比alpha更小的优势,那么max人类肯定不会选择走法2,所以计算在计算min电脑的走法时,min电脑的其他走法就不用再计算了。
最后min电脑经过steps.length种走法对比之后,选择w值最小的一种走法,把棋盘回退一步,并返回棋盘估值和下棋位置。
如果考虑步数为N,先获取min电脑可以下棋的位置steps。
对于可以下棋的一步step,电脑AI下棋到step的第row行,第column列。
如果这时候min电脑已经赢了,则把棋盘回退一步,返回棋盘估值和下棋位置,不用再考虑其他走法了。
否则,min需要在每一种走法里面,选择一种走法,令max人类走N—1步之后,自己的优势保持最大(即w值最小)。
max走法类似,人类会选择w值最大的走法下棋,所以max函数和min函数分别代表人和AI下棋,互相递归调用,直到递归到步数为0时返回N步之后的估值.
三、实验代码及数据记录
1.代码
/**
* [Matrix矩阵]
*@param{[type]} arr[矩阵二维数组]
*/
var Matrix = function(arr) {
}
}
this.is_ended = false;
return this;
};
/**
*[reset重置棋盘]
*@return{[type]}[description]
*/
Chessboard。prototype.reset = function(){
for(var i = 0,n = this。row; i〈n; i++){
}
}
this.stack = [];
this。is_ended = false;
};
/**
* [toString输出棋盘信息]
* @return{[type]}[description]
*/
Chessboard.prototype.toString = function(){
return this.data.map(function(data) {
人工智能实验项目名称aialphabeta剪枝算法实验成绩3114006156实验日期201611一实验内容设计具有ai的井子棋游戏采用jsai采用剪枝算法二实验设计原理分析及流程min电脑ai下棋时如果考虑步数为0则代表直接返回当前棋盘估值w值越大代表对max越有优势越小则代表对min越有优势wmaxwminw
for (var i = 0; i〈this.row; i++){
for(var j = 0; j < this。column;j++){
var type = this.data[i][j];
var matrix = new Matrix([
[i, j,1]
]);
var translateMatrix1 = new Matrix([
for(var j = 0;j < this.row;j++){
var type = this。data[j][i];
if (type == Chessboard.MAX){
maxCount++;
}else{
if (type == Chessboard。MIN) {
minCount++;
}
}
}
//如果连成3子
*/
Matrix.prototype。multiply = function(matrix){
if(this.column == matrix。row){
var row = this。row,
column = matrix。column,
arr =[];
for(var i = 0;i〈row;i++) {
实验课程名称:__人工智能
实验项目名称
井子棋AIalpha-beta剪枝算法
实验成绩
实验者
叶海恒
专业班级
计科8班
学号
3114006156
实验日期
2016.11
设计具有AI的井子棋游戏(采用js)
AI采用α—β剪枝算法
min电脑AI下棋时,如果考虑步数为0,则代表直接返回当前棋盘估值w(值越大代表对max越有优势,越小则代表对min越有优势,w=maxW-minW)。
*/
Chessboard.prototype。rotate = function(){
var board = new Chessboard(this.row, this。column),
dx = Math。floor(this.column / 2),
dy = Math.floor(this.row / 2);
*/
Chessboard。prototype。evaluate = function(){
//max,min权重,max连棋数,min连棋数
var maxW = minW = 0,
maxCount,minCount;
//横向计算
for (var i = 0; i < this.row; i++){
arr[i]= [];
for (var j = 0; j < column;j++) {
var sum = 0;
for (var n = 0; n〈this.column;n++) {
sum +=(this。data[i][n]*matrix。data[n][j]);
}
arr[i][j] = sum;
if(maxCount == this。row){
return Infinity;
} else{
if(minCount == this。row){
return—Infinity;
} else {
//如果没有max的棋子,则min可能连成3子
if (!maxCount){
minW++;
}
//如果没有min的棋子,则max可能连成3子
for (var j = 0, m = this。column;j < m; j++){
this。data[i][j] = Chessboard.NONE;
}
}
this。stack =[];
this.is_ended = false;
};
/**
*[availableSteps获取可走的位置]
*@return{[type]}[description]
if(type== Chessboard。MIN){
minCount++;
}
}
}
//如果连成3子
if(maxCount == 3){
return Infinity;
}else {
if (minCount == 3){
return -Infinity;
} else {
//如果没有max的棋子,则min可能连成3子
*/
Chessboard.prototype。put = function(row,column,type){
if (this.data[row][column]== Chessboard.NONE) {
this.data[row][column]= type;
this.stack。push({
row: row,
if(this。data[i][j]== Chessboard。NONE){
availableSteps。push({
row: i,
column:j
});
}
}
}
return availableSteps;
};
/**
*[rotate把棋盘旋转90度]
*@return{[type]}[description]
this。data =[];
this.row = row;
this.column = column;
for(var i = 0;i < row; i++){
this。data[i]= [];
for (var j = 0; j〈column;j++){
this。data[i][j] = Chessboard。NONE;
*/
Chessboard.prototype.availableSteps = function(){
var availableSteps =[];
for (var i = 0, n = this.row; i〈n; i++) {
for (var j = 0,m = this.column;j < m;j++) {
return data.toString();
})。join('\n');
};
/**
* [put下棋]
* @param{[type]} row[行]
*@param {[type]} column [列]
* @param {[type]}type [人还是AI下棋]
* @return {[type]}[description]
*@return{[type]}[description]
*/
Chessboard.prototype。rollback = function(n){
n = || 1;
for(var i = 0; i〈n;i++){
var step = this。stack。pop();
if(step){
this.data[step.row][step。column] = Chessboard。NONE;
[1,0,0],
[0,1,0],
[—dx, -dy,1]
]);
var translateMatrix2 = new Matrix([
[1, 0,0],
[0,1, 0],
[dx,dy,1]
]);
var rotateMatrix = new Matrix([
[0,—1, 0],
[1, 0, 0],
[0,0,1]
column: column,
type:type
});
if(this。stack。length == this.row*this。column){
this。is_ended = true;
}
}
return this;
};
/**
*[rollback悔棋]
*@param {[type]} n[后退n步]
}
}
return newMatrix(arr);
}
};
/**
*[Chessboard棋盘]
* @param {[type]} row[description]
* @param {[type]}column[description]
*/
var Chessboard = function(row,column){
//当前这一行,max连棋数,min连棋数
maxCount = minCount = 0;
for(var j = 0; j〈this.column; j++){
var type = this。data[i][j];
if(type == Chessboard。MAX){
maxCount++;
}else {
};
/**
*[hash给棋盘一个编码]
*@param {[type]} sourceRadix[来源进制]
*@param{[type]}targetRadix[目的进制]
*@return {[type]}[description]
*/
Chessboard.prototype.hash = function(sourceRadix, targetRadix) {
]);
var res = matrix.multiply(translateMatrix1).multiply(rotateMatrix).multiply(translateMatrix2);
board。put(res。data[0][0], res.data[0][1],type);
}
}
return board;
if (!minCount) {
maxW++;
}
}
}
}
//右斜下方向计算
maxCount = minCount = 0;
for (var i = 0; i〈this.column; i++) {
var str = this.data。map(function(arr){
return arr。join('');
}).join('’);
return parseInt(str,sourceRadix).toString(targetRadix);
};
/**
*[evaluate计算当前棋盘的估值]
this.data = arr;
this。row = arr.length;
this.column = arr。length ? arr[0].length : 0;
};
/**
*[multiply矩阵乘法转换]
*@param{[type]} matrix [转换矩阵]
*@return{[type]}[description]
if(!maxCount){
minW++;
}
//如果没有min的棋子,则max可能连成3子
if(!minCount){
maxW++;
}
}
}
}
//纵向计算
for (var i = 0; i〈this.column;i++) {
//当前这一列,max连棋数,min连棋数
maxCount = minCount = 0;
什么是alpha—beta剪枝呢?就是如果max人类当前一种走法1至少可以获取alpha优势,而另一种走法2,min电脑的一步棋则可能让人类获取比alpha更小的优势,那么max人类肯定不会选择走法2,所以计算在计算min电脑的走法时,min电脑的其他走法就不用再计算了。
最后min电脑经过steps.length种走法对比之后,选择w值最小的一种走法,把棋盘回退一步,并返回棋盘估值和下棋位置。
如果考虑步数为N,先获取min电脑可以下棋的位置steps。
对于可以下棋的一步step,电脑AI下棋到step的第row行,第column列。
如果这时候min电脑已经赢了,则把棋盘回退一步,返回棋盘估值和下棋位置,不用再考虑其他走法了。
否则,min需要在每一种走法里面,选择一种走法,令max人类走N—1步之后,自己的优势保持最大(即w值最小)。
max走法类似,人类会选择w值最大的走法下棋,所以max函数和min函数分别代表人和AI下棋,互相递归调用,直到递归到步数为0时返回N步之后的估值.
三、实验代码及数据记录
1.代码
/**
* [Matrix矩阵]
*@param{[type]} arr[矩阵二维数组]
*/
var Matrix = function(arr) {
}
}
this.is_ended = false;
return this;
};
/**
*[reset重置棋盘]
*@return{[type]}[description]
*/
Chessboard。prototype.reset = function(){
for(var i = 0,n = this。row; i〈n; i++){
}
}
this.stack = [];
this。is_ended = false;
};
/**
* [toString输出棋盘信息]
* @return{[type]}[description]
*/
Chessboard.prototype.toString = function(){
return this.data.map(function(data) {
人工智能实验项目名称aialphabeta剪枝算法实验成绩3114006156实验日期201611一实验内容设计具有ai的井子棋游戏采用jsai采用剪枝算法二实验设计原理分析及流程min电脑ai下棋时如果考虑步数为0则代表直接返回当前棋盘估值w值越大代表对max越有优势越小则代表对min越有优势wmaxwminw
for (var i = 0; i〈this.row; i++){
for(var j = 0; j < this。column;j++){
var type = this.data[i][j];
var matrix = new Matrix([
[i, j,1]
]);
var translateMatrix1 = new Matrix([
for(var j = 0;j < this.row;j++){
var type = this。data[j][i];
if (type == Chessboard.MAX){
maxCount++;
}else{
if (type == Chessboard。MIN) {
minCount++;
}
}
}
//如果连成3子
*/
Matrix.prototype。multiply = function(matrix){
if(this.column == matrix。row){
var row = this。row,
column = matrix。column,
arr =[];
for(var i = 0;i〈row;i++) {
实验课程名称:__人工智能
实验项目名称
井子棋AIalpha-beta剪枝算法
实验成绩
实验者
叶海恒
专业班级
计科8班
学号
3114006156
实验日期
2016.11
设计具有AI的井子棋游戏(采用js)
AI采用α—β剪枝算法
min电脑AI下棋时,如果考虑步数为0,则代表直接返回当前棋盘估值w(值越大代表对max越有优势,越小则代表对min越有优势,w=maxW-minW)。
*/
Chessboard.prototype。rotate = function(){
var board = new Chessboard(this.row, this。column),
dx = Math。floor(this.column / 2),
dy = Math.floor(this.row / 2);