【发布时间】:2019-06-04 12:38:51
【问题描述】:
我有一个今天到期的大学约会,我开始感到紧张。我们最近讨论了算法优化的动态规划,现在我们将自己实现一个使用动态规划的算法。
任务
所以我们有一个简单的游戏,我们将为其编写一个算法来找到最佳策略以获得最佳分数(假设两个玩家都进行了优化)。
我们有一排像4 7 2 3 这样的数字(请注意,根据任务描述,不能保证它总是相等的数字)。现在每个玩家轮流从后面或前面取一个数字。当挑选最后一个数字时,每个播放器总结该数字,并且每个播放器的结果分数彼此对。结果就是玩家 1 的得分。所以上述数字的最佳顺序是
P1: 3 -> p2: 4 -> p1: 7 -> p2: 2
因此,p1 将拥有3, 7,p2 将拥有4, 2,这导致玩家 1 的最终得分为 (3 + 7) - (4 + 2) = 4。
在第一个任务中,我们应该简单地实现“一种简单的递归方法来解决这个问题”,其中我只使用了一个极小极大算法,这对于自动化测试来说似乎很好。然而,在第二个任务中,我被困住了,因为我们现在将使用动态编程技术。我发现的唯一提示是在任务本身中提到了matrix。
到目前为止我所知道的
我们有一个单词转换问题的示例,其中使用了这样的矩阵,它被称为Edit distance,由两个单词组成,这意味着有多少变化(Insertions,Deletions, Ssubstitutions) 是否需要将一个单词变为另一个单词。这两个单词以表格或矩阵的形式排序,并且对于单词的每个组合都会计算距离。
例子:
W H A T
| D | I
v v
W A N T
编辑距离为 2。您有一个表格,其中每个子字符串的每个编辑距离显示如下:
"" W H A T
1 2 3 4
W 1 0 1 2 3
A 2 1 1 2 3
N 3 2 2 2 3
T 4 3 3 3 2
例如,从WHA 到WAN 需要进行2 次编辑:插入N 和删除H,从WH 到WAN 也需要2 次编辑:替换H->A 和插入N 等等.这些值是用我认为代表优化的“OPT”函数计算的。
我还研究了自下而上和自上而下的递归方案,但我不太确定如何将其附加到我的问题上。
我的想法
提醒一下,我使用数字4 7 2 3。
我从上面了解到,我应该尝试创建一个表格来显示每个可能的结果(就像 minimax 一样,它会在之前保存)。然后我创建了一个简单的表格,我尝试在其中包含可以像这样制作的可能抽奖(我认为这是我的 OPT 函数):
4 7 2 3
------------------
a. 4 | 0 -3 2 1
|
b. 7 | 3 0 5 4
|
c. 2 | -2 -5 0 -1
|
d. 3 | -1 -4 1 0
左列标记玩家 1 平局,上排标记玩家 2 平局,然后每个数字代表numberP1 - numberP2。从这张表中,我至少可以阅读上面提到的 3 -> 4 -> 7 -> 2 (-1 + 5) 的最佳策略,所以我确定该表应该包含所有可能的结果,但我现在不太确定如何从中得出结果。我的想法是开始遍历行并选择其中具有最高数字的行并将其标记为从 p1 中选择(但这无论如何都是贪婪的)。然后 p2 会在这一行中搜索最小的数字,然后选择那个特定的条目,然后轮到它。
例子:
p1 选择行 a。 7 | 3 0 5 4 因为 5 是表中的最大值。 P2 现在从该行中选择 3,因为它是最低的(0 是无效的平局,因为它是相同的数字,你不能选择两次)所以第一轮是 7 -> 4 但后来我注意到这个平局是不可能的,因为 7 从一开始就无法访问。因此,对于每一轮,您只有 4 种可能性:表格的外部数字和直接在它们之后/之前的数字,因为这些数字在绘制后可以访问。所以第一轮我只有行a。或 d。 p1 可以从中挑选:
4 使 p2 得到 7 或 3。或者 p1 得到 3 使 p2 得到 4 或 2
但我真的不知道如何从中得出结论,我真的卡住了。
所以我真的很想知道我是否走在正确的道路上,或者我是否过度考虑了这一点。这是解决这个问题的正确方法吗?
【问题讨论】:
-
通常,要开始使用动态编程,您需要一个递归关系。这将是以下内容:
X(i, j) = max(Arr[i] + X(i+1, j), X(i, j-1) + Arr[j]如果j-i == 0 % 2和X(i, j) = min(Arr[i] + X(i+1, j), X(i, j-1) + Arr[j]如果j-i == 1 % 2。X(i, j)代表玩家 1 可以预期的最佳得分,具有最佳策略。从这个关系(和琐碎的终止案例),您可以通过在计算时存储X的所有值来构建动态规划算法。 -
@m.raynal 我认为这是我没有真正理解的部分。所以我需要创建一个递归关系,但如何处理呢?你的例子有点难以阅读(我认为他们也错过了一些括号)。所以我需要以某种方式找到这种关系,然后将值存储到矩阵中?然后从该表中搜索最佳路径?
标签: algorithm dynamic-programming