Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 硬币博弈的最优策略_Algorithm_Dynamic Programming - Fatal编程技术网

Algorithm 硬币博弈的最优策略

Algorithm 硬币博弈的最优策略,algorithm,dynamic-programming,Algorithm,Dynamic Programming,考虑一行价值为v1、v2……、vn的n枚硬币。我们轮流与对手比赛。在每一回合中,玩家从该行中选择第一枚硬币或最后一枚硬币,将其永久移除,并获得硬币的价值。确定如果我们先行动,我们肯定能赢得的最大可能金额。 我的解决方案 既然我们先走,我们可以选择v1或v2,然后我们的对手可以从起点或起点进行选择。因此,可能出现的四个子问题是 (1,1)、(1,2)、(2,1)、(2,2) 式中(1,1)表示我从起跑点选择[1],对手也从起跑点选择[1] (1,2)意味着我从起点开始选择,但对手选择最后一个 因此

考虑一行价值为v1、v2……、vn的n枚硬币。我们轮流与对手比赛。在每一回合中,玩家从该行中选择第一枚硬币或最后一枚硬币,将其永久移除,并获得硬币的价值。确定如果我们先行动,我们肯定能赢得的最大可能金额。

我的解决方案

既然我们先走,我们可以选择v1或v2,然后我们的对手可以从起点或起点进行选择。因此,可能出现的四个子问题是

(1,1)、(1,2)、(2,1)、(2,2)

式中(1,1)表示我从起跑点选择[1],对手也从起跑点选择[1]

(1,2)意味着我从起点开始选择,但对手选择最后一个

因此,如果
M(i,j)
是我可以选取的(i,j)上的最大值,那么将(i,j)表示为递归函数

M(i,j) = Max{ Max{ M(i+2,j), M(i+1,j-1) } + vi, Max{ M(i+1,j-1), M(i,j-2) } + vj }
说明:当我有I..j元素时,我可以选择第一个[I+1],我的对手可以选择第一个[I+2]或最后一个[j-1],我希望下次选择时有最大值,因此第一个项在外部最大值内

第二个与上述类似,即如果我选择最后一个[j-1],对手选择第一个[i+1]或最后一个[j-2],我下次将其最大化

现在,在书中我看到递归是

M(i,j) = Max{ Min{ Same } + vi, Min{ Same } + vj }
现在,我为什么要最小化这里。这难道不等于说我第一次必须选择最大化,第二次必须选择最小化

我做错了什么?
谢谢。

如果你想计算你肯定能赢的钱的数量,你必须假设你的对手试图最大化他/她自己的结果,这等于最小化你的结果(因为你的收益总和总是等于
v1+…+vn
)。你的公式计算的是,如果你的对手总是做出错误的(从他/她的角度来看)动作,你能赢多少。

如果硬币的数量是偶数,第一个玩家可以保证自己的最大值为v1+v3+…+v(n-1)和v2+v4+…+越南。找出最大值,然后取v1或vn。此后,只取最初分别处于奇数或偶数位置的硬币。这是可能的,因为无论第二个玩家做什么,当第一个玩家再次移动时,奇数和偶数位置的硬币都会暴露出来

这是第一名选手能做到的最好的吗?第一个玩家可以在任何移动中从“赔率”切换到“偶数”,这取决于“新偶数”之和是否大于或小于“新赔率”之和。第二个玩家的策略应该是尽可能降低转换的激励,这意味着选择最大的硬币(第一个或最后一个位置)。由此产生的位置是否仍然会吸引第一个玩家切换?是的,正如我们从下面的游戏中看到的:

1 3 19 6 8 20
第一个玩家加1+19+8=28和3+6+20=29。他可以保证总得分至少为29分,只要选择20分。结果是

1 3 19 6 8
为了减少第一个玩家从平局转换到赔率的诱惑,第二个玩家需要8分,这比总比分29分还要好

1 3 19 6
然而,诱惑仍然存在。事实上,赔率位置的总和是1+19=20,偶数的总和只有3+6=9,所以第一个玩家现在可以通过切换到赔率来做得更好,并且取1,即使6更大

  3 19 6
第二名球员能做的最好的选择是选择6名,第一名球员得到19名,第二名球员得到3名。总分:第一名球员20+1+19=40,第二名球员8+6+3=17

似乎第一个玩家总是可以通过这种方式获得比第二个玩家更多的玩家。然而,我们仍然不知道这是否是第一个玩家的最佳策略

另一方面,如果硬币的数量n为奇数,则上述分析中第一个玩家和第二个玩家的角色基本上是相反的

现在的问题是,上述贪婪策略真的是最优的吗?在特定情况下,我们可以通过检查二叉决策树进行检查,其中第一个玩家拿走第一枚或最后一枚硬币,然后第二个玩家拿走剩余的第一枚或最后一枚硬币,等等。树中将有
2^n
叶子;可以计算每个叶子上的分数,然后从叶子返回到根,每个较高节点的值可以计算为两个子节点的最大值或两个子节点的最小值,具体取决于轮到谁

可以通过递归函数调用隐式构建树,而不是显式构建树,这将节省所需的总内存,但不会节省时间

如果有人以这种方式分析游戏,并提出与我不同的最佳策略,我非常希望看到它。

这一页非常清楚地解释了问题和解决方案。结论是:

F(i, j) represents the maximum value the user can collect from i'th coin to j'th coin. F(i, j) = Max(Vi + min(F(i+2, j), F(i+1, j-1) ), Vj + min(F(i+1, j-1), F(i, j-2) )) Base Cases F(i, j) = Vi If j == i F(i, j) = max(Vi, Vj) If j == i+1 F(i,j)表示用户可以从中收集的最大值 我要换第三枚硬币。 F(i,j)=最大值(Vi+min(F(i+2,j),F(i+1,j-1)), Vj+min(F(i+1,j-1),F(i,j-2))) 基本情况 F(i,j)=Vi如果j==i 如果j==i+1,则F(i,j)=max(Vi,Vj)
所以基本上我计算的是我能赢的最大值。但我需要找到我能赢的最低最高点。对吧?之所以出现“最小化”是因为每个人都想最小化对手的硬币总价值。因此,您应该假设您的组件采取了策略,当轮到您选择下一枚硬币时,该策略使您的总价值最小化。