C++实现人机对战围棋(使用Leela Zero权重)-策略

策略部分就是哪个下载的权重的网络,根据棋面黑白子状态,输出一些下子位置和(在该位的)胜率。

网络输入:

Leela Zero网络权重输入是:

```
1)在时间T = 0时行棋的一方
2)在时间T = -1时行棋的一方(如果T = 0则为0)
...
8)在时间T = -7时行棋的一方(如果T <= 6则为0)
9)时间T = 0时的另一方
10)时间T = -1时的另一方(如果T = 0则为0)
...
16)T = -7时的另一方(如果T <= 6则为0)
17)如果要移动黑棋则全部为1,否则为0
18)如果要移动白棋则全部为1,否则为0
```

形成18个19 x 19平面。

由黑方和白方下子序号--->生成18通道输入数据:

void	生成18通道输入数据(vector &顺序黑,
		   vector &顺序白,卷积层  &out)
{	
	float *d=out.data;
	int wh=out.width*out.height;


	bool b=false;//黑,白移动方
	if(顺序白.size()==顺序黑.size())
	{
		//黑下
		b=true;
	}

	int num=0;//步数
	int endn;//终止点
	if(b)
		endn= 顺序黑.size();//终止点
	else
		endn= 顺序白.size();//终止点

	//移动方8步
	while(endn>0)
	{
		if(b)
			for (int i = 0; i 0)
	{
		if(b)
			for (int i = 0; i 

模型定义:

struct go模型 //6残差,128通道
{
	//w_input
	层数据 * conv1;//3x3卷积
	batchnorm * bn1;//正则化

	int 残差块数量;//6块
	残差块 * 块;

	//策略
	层数据 * p_conv1;//1x1卷积
	batchnorm * p_bn1;//正则化
	层数据 * p_ip1;//全连接卷积

	//价值
	层数据 * v_conv1;//1x1卷积
	batchnorm * v_bn1;//正则
	层数据 * v_ip1;//全连接卷积
	层数据 * v_ip2;//全连接卷积
	
	//构造函数
	go模型();

};

网络部分和前面超分重建没什么区别

由策略部分输出362个值(361(19x19) + 1手pass)

按胜率排序并返回所有的点:

void 找出最好的落点(卷积层 & d,vector &前5序号)
{
	//按胜率排序并返回所有的点//只取前好的5个点不行(已有子)

	float *di=d.data;
	int size= d.width * d.height * d.depth;

	vector zp;
	int *zpIndex=new int[size];//索引数组排序用
	int *zpi=zpIndex;

	for (int i = 0; i 

对战一局图:

C++实现人机对战围棋(使用Leela Zero权重)-策略_第1张图片

 由于没有蒙特卡罗树搜索(因为看不懂),官子有点弱,占大场还是比较历害的。

全文已结束。

下载:

人机对战围棋.rar

win32人机对战围棋(使用Leela Zero权重)程序,喜欢下围棋的人可以一试

https://download.csdn.net/download/juebai123/11485184

你可能感兴趣的:(人机对战围棋)