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

本文介绍了如何使用Leela Zero的权重网络进行围棋人机对战。网络根据棋盘状态生成18通道输入,并输出362个值表示各位置的胜率。虽然缺少蒙特卡罗树搜索,导致官子较弱,但在占领大场方面表现出色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

网络输入:

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<int> &顺序黑,
		   vector<int> &顺序白,卷积层  &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 <endn; i++)
			{
					d[顺序黑[i]]=1.0f;
			}
			
		else
			for (int i = 0; i <endn; i++)
			{
					d[顺序白[i]]=1.0f;
			}
		endn--;
		num++;
		d+=wh;
		if(num==8)
			break;
	}
	while(n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值