目录
问题描述
1、在消消乐中如何计算出最大得分(假设消掉之后不会再补充)
2、分析K(元素种类)、M(棋盘行数)、N(棋盘列数)、X(交换步数)对计算最大得分的方法的影响
一、无剪枝回溯设计
以棋盘状态作为结点,每一个棋盘状态代表一个结点
以最初始的状态为初始结点,以没有可以消除元素的棋盘为叶子结点
先从左下角开始交换,判断是否可以产生新的结点,如果可以产生新的结点,则继续递归从左下角开始交换,继续判断是否可以产生新的结点,直到没有可以消除的元素时,则返回上一个结点,交换下一个位置的元素,继续判断,直到所有棋盘状态都判断过,则终止
图1
如图1,棋盘初始状态为最初结点
交换位置1和位置2,得到新的棋盘状态,即结点1
结点1没有有效的可交换的元素,返回上一层
交换位置1和4,1和4无法产生新的棋盘状态,跳过
交换位置2和3,产生新的棋盘状态结点2,在结点2中继续交换位置1和2,产生新的棋盘状态结点3
结点3没有有效的可交换元素,返回上一层结点2
结点2没有有效的可交换元素,返回上一层结点1
结点1继续交换位置2和5,得到新的棋盘状态结点4
结点4没有有效的可交换元素,返回上一层结点1
结点1往后都没有有效的可交换元素了,终止
图2
如图2,黄色箭头即为回溯的顺序
二、剪枝设计
参数准备:
在N个测试样本中,用无剪枝回溯计算每个样本的最大得分的平均分a
将无剪枝回溯的递归次数设置为1,计算出N个样本的只交换1步的平均得分b
那么a-b就代表了交换1次后继续交换所能得到的最大平均分
以此类推,可计算出交换1次、2次、3次、4次….. 后继续交换所能得到的最大平均分c1,c2,c3,c4,….cN
剪枝判断:
在新的c1,c2,c3,c4,….cN作为参数
比如说:
在100个随机生成的棋盘样本中,无剪枝回溯得到的平均分是22分,无剪枝回溯只交换1步所得到的平均分是6分,只交换2步所得到的平均分是9分,只交换3步所得到的平均分是11分
则交换1步继续交换下去后可得到的最大平均分是22-6=16分
交换2步继续交换下去后可得到的最大平均分是22-9=13分
交换3步继续交换下去后可得到的最大平均分是22-11=11分
在第k层时先判断当前得分加上此层所对应的参数是否大于当前总分
若大于,代表继续递归仍有较大机会创造出更大的总分,则继续递归
若不大于,代表继续递归能创造出更大的总分的机会比较小,则停止递归,剪掉
图3
如图3,通过参数准备得到1层后可得的最大平均分是14分
当前最大得分是20分
结点1当前得分是7分,7+14>20,那么保存结点1,继续向下递归
到了结点2的时候,结点2当前得分是4分