MCTS加上加權矩陣做出的黑白棋

2021-08-17 19:02:30 字數 4202 閱讀 5840

#include 

#include

#include

#include

#include

#include

#include

#include

#include "jsoncpp/json.h"

using

namespace

std;

const

double epsilon = 0.0000001;

int currbotcolor; // 電腦執子顏色(1為黑,-1為白,棋盤狀態亦同)

int gridinfo[8][8] = ; // 先x後y,記錄棋盤狀態

int blackpiececount = 2, whitepiececount = 2;

const

int value[8][8] = ;

// 向direction方向改動座標,並返回是否越界 這個是八個方向上的

inline

bool movestep(int &x, int &y, int direction)

void draw(int b[8][8])

}cout

if (gridinfo[x][y] == -color) //移動一下還是對方棋子那就對方棋子個數加1,把對方的個數和位置記下來儲存到effectivepoints陣列上

else

if (gridinfo[x][y] == 0) //沒有棋子

else

//這種情況指的是這個棋子是我方,那麼計數器就不置0了,直接跳出,這時已經是我方棋子夾住了currcount多的敵方棋子

}if (currcount != 0)

else

//白棋

while (currcount > 0) //這裡把加在中間的對方棋子翻轉過去}}

if (isvalidmove) //如果這個地方是合法的座標,那麼下面就對這盤棋的黑白進行改變+1

else

return

false;

}class uctreenode

} // default constructor

void init()

blacknum=blackpiececount;

whitenum=whitepiececount;

colortoplay=-currbotcolor; //把玩家下完的棋局狀態記錄下來

}void inherit(uctreenode prenode)

blacknum=prenode.blacknum;

whitenum=prenode.whitenum;

}void copy(uctreenode &temp)

temp.blacknum=blacknum;

temp.whitenum=whitenum;

temp.colortoplay=colortoplay;

temp.xpos=xpos;

temp.ypos=ypos;

}bool isleaf() const

bool procstep(int xp, int yp,int color, bool checkonly = false)

if (board[x][y] == -color) //注意這裡在兩個函式中執行顏色有區別

//移動一下還是對方棋子那就對方棋子個數加1,把對方的個數和位置記下來儲存到effectivepoints陣列上

else

if (board[x][y] == 0) //沒有棋子

else

//這種情況指的是這個棋子是我方,那麼計數器就不置0了,直接跳出,這時已經是我方棋子夾住了currcount多的敵方棋子

}if (currcount != 0)

else

//白棋

while (currcount > 0) //這裡把加在中間的對方棋子翻轉過去}}

if (isvalidmove) //如果這個地方是合法的座標,那麼下面就對這盤棋的黑白進行改變+1

else

return

false;

}int possiblepos()

childnum=poscount;

return poscount;

}int selectaction()

} // for loop

//cout<<"孩子有:"value();

//cout<<"選擇的點是:"inherit(*this);//把父節點的局面給這個子節點

//這裡是變動後的下一步棋局面

vpchildren_i[selected]->procstep(position[selected][0],position[selected][1],vpchildren_i[selected]->colortoplay);

return selected; //找出uct最大的結點返回

} // selectaction

void expand()

if(childnum!=0)

isleaf_i=false;

}int simulation()

}int x = temp->position[tempi][0];

int y = temp->position[tempi][1];

temp->procstep(x, y, -temp->colortoplay); //原來是-的,搞了好久==

//draw(temp->board);

} else

zonenum++;

if(zonenum>1) break; //避免兩邊都沒子可下,一直迴圈的情況

temp->colortoplay=-temp->colortoplay;

}//cout<<"模擬落子:黑子"whitenum > temp->blacknum) || (currbotcolor==1 && temp->whitenum < temp->blacknum) )

return

1; //電腦是什麼顏色,最後這個顏色多就是勝利。

else

return

0; //好吧,輸和平局都返回0;

}void updatestats(double value)

void iterate()

//cout<<"以上從跟往下走到葉子結點"if(pcur->nvisits_i>75)

double value = pcur->simulation();

//pcur->value();

//cout<<"模擬下棋得到的值是:"}

int bestaction()

} // for loop

return selected;

} // bestaction

void value() const

};int main()

// 看看玩家本回合輸入

x = input["requests"][turnid]["x"].asint();

y = input["requests"][turnid]["y"].asint();

//cout= 0)

procstep(x, y, -currbotcolor); // 模擬對方落子

// 做出決策(你只需修改以下部分)

int resultx=-1, resulty=-1;

uctreenode tree;

tree.init(); //當前棋局當下來

//draw(tree.board);

tree.expand();

if(tree.childnum!=0)

//coutresultx=tree.vpchildren_i[bestaction]->xpos;

resulty=tree.vpchildren_i[bestaction]->ypos;

}// 決策結束,輸出結果(你只需修改以上部分)

json::value ret;

ret["response"]["x"] = resultx;

ret["response"]["y"] = resulty;

json::fastwriter writer;

cout

<< writer.write(ret) << endl; //這是電腦上的決定

return

0;}

如何計算加權和及矩陣乘法運算回顧

x和矩陣,每一行代表乙個詞,用xi x i xi 表示,y為一向量,表示每個詞的權重,shape為 n,通過轉化將y變為矩陣y,shape為 n,1 如何求x中每個詞的加權和,如下 x ty x ty xty其實上述不用將y轉化成y,因為矩陣可以直接與向量相乘,以上操作只是應用於attention機...

Neo4j 做推薦 (6) 加權內容演算法

除了考慮計算相似性的型別之外,還有更多的特徵,如演員和導演。讓我們使用加權總和根據他們共同的演員 流派和導演的數量對建議進行評分,以提高分數。根據重疊特徵的數量和型別計算加權和 find similar movies by common genres match m movie where m.ti...

洛谷 最大加權矩形 字首和,dp,矩陣壓縮

題目鏈結 題目 思路 這個就類似最大子串行,有人會問,這和最大子串行有關係?其實在我們進行矩陣壓縮後,這個問題其實就變成了最大子串行 矩陣壓縮 我的理解就是把矩陣分成小的矩陣 把每種情況都分出來 例我們有矩陣 1 2 3 4 5 6 7 8 9 我們先列舉第一行 1 2 3.再加上的第二行 1 2 ...