华容道的求解算法重写

本文介绍了作者对一个横刀立马棋局求解算法的优化过程,从最初的效率低下(约1.5s)到现在的快速求解。优化包括棋局压缩和使用分支限界法(BFS)进行广度优先搜索,并通过特征值剪枝提高效率。作者提供了Java和Go两种语言的实现,并对比了单线程与多线程在求解速度上的差异。实验结果显示,单线程在特定场景下表现更优,而多线程在某些情况下可能出现死锁问题。此外,还枚举了所有可行棋局并利用缓存提升速度。

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

大学时写的求解算法效率有点低,以横刀立马棋局求解极限约为1.5s因此根据重写一遍,目前只有java版本的 go版本的也写了

在最初的版本中,只考虑了关羽固定为横,四上将固定为竖的设计,不能符合全部的情形,因而重写。
依旧按照原来思路对棋局进行压缩,省掉了对四上将与曹操的坐标压缩,简化了计算过程,每个棋子横坐标为2位,纵坐标为3位,共十个棋子,总计50位。使用5位记录棋子的横竖方向和坐标加起来一共55位,小于long类型的64位。

求解算法方面
依旧是采用分支限界法进行求解,使用广度优先算法建立树并同步进行判定和剪枝。求解完成时间停止建树,以此来保证此解为全局最优解。
简单来说就是 BFS 方法搜索,采用数组模拟整个棋盘,剪枝的方式为对棋局求取特征值,对于具备相同特征的棋局,不再进行建树求解。

懒得做界面了,纯java命令行模式,可在idea中直接打开。
go版本的同理。

另外将所有可行的棋局都用枚举的方法计算出来了,数字代表的是横方向和总方向棋子的数量

github链接

使用缓存已经生成的棋局,单线程的极限速度要高于多线程的极限速度,可能是因为线程间的切换影响了求解的速度,在进行多棋局求解时,单线程明显优于多线程(每种类型的开局状态都已经求出了,可以根据开局自带的字典生成随机棋局),在单个棋局求解时,多线程相较于单线程稳定,都在300ms左右,单线程的速度也和多线程差不多(cpu : 10210U),go版本的速度约70ms,多线程也并未能有明显的进步,反而因为写的不规范造成几率死锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值