【问题标题】:Rock Paper Scissors grouping optimization剪刀石头布分组优化
【发布时间】:2015-11-28 18:26:40
【问题描述】:

只是试图找到一个好的算法来使用典型的 RPS 规则找到最佳解决方案。我还没有开始编写问题。

给定两个有序数组,每个数组包含 N 个元素,通过重新排序第一个数组来优化获胜次数。

例如:

a[0] = rock     
a[1] = paper
a[2] = paper
a[3] = rock

b[0] = paper
b[1] = rock
b[2] = scissors
b[3] = rock

// currently
a[0] vs b[0] = -1 // (rock losses to paper)
a[1] vs b[1] = +1 // (paper beats rock)
a[2] vs b[2] = -1 // (paper losses to scissors)
a[3] vs b[3] = 0 // (rock ties to rock)

应该返回的最优顺序是 { 1, 0, 3, 2 }

paper ties paper
rock ties rock
rock beats scissors
paper beats rock

问题是,我如何得出这个结果?一些约束。

平局比输赢相互抵消更可取。这可能是通过权衡损失而不是胜利来实现的。即

a[0] = rock
a[1] = paper
b[0] = paper
b[1] = rock

{0, 1} vs b[..] = -1, +.95 = -.05
{1, 0} vs b[..] = 0, 0 = 0 // preferred order

此外,最好在数组底部获胜。

关于如何完成此任务的任何建议?谢谢。

【问题讨论】:

  • 每个 RPS 匹配都是相互独立的,所以除了检查每个组合之外,我没有看到其他解决方案。
  • 您是在寻找算法、实现(请指定语言)还是两者兼而有之?
  • 我现在正在用 lua 编码。也就是说,我只是在寻找一种我可以实现的算法。

标签: algorithm optimization


【解决方案1】:

对于小数组,你可以解决https://en.wikipedia.org/wiki/Assignment_problem

对于大型数组,请注意,您可以通过给出 3x3 计数数组中的条目来准确描述任何解决方案,其中 A[i,j] 给出玩家 A 说的次数 (0 => rock, 1 =>纸,2 => 剪刀)和 B 表示(0 => 石头,1=> 纸,2=> 剪刀)。因此,您要填写此数组以最大化相当于 A 获胜的单元格的总和,但要受到总和列的限制,该列的总和等于 B 在其数组中说石头、纸和剪刀的次数,并且同上 A 的行 - 结果告诉您足以填充 A 给定 B 的数组。

你当然可以用整数线性规划解决这个问题。我怀疑问题总是在拐角处,如果你用线性规划解决它,只是将每个条目限制为 >= 0,你会得到一个整数答案,但我还没有正式证明这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2016-01-16
    相关资源
    最近更新 更多