将玩家分为“优胜者”和“失败者”:如何证明贪婪的解决方案能带来最佳结果?

时间:2019-02-09 01:23:13

标签: algorithm greedy proof proof-of-correctness

我遇到以下问题:

  n个玩家(其中n是偶数)要互相对战。每个人都不一定会玩,但玩家只能与他人对战一次。如果两个人确实决定互相对抗,我们将有一个失败者和一个获胜者。然后,我希望将我的n位玩家分成大小为n / 2的两组:赢家(W)和输家(L)。我希望赢家中的所有玩家都不会输给输家中的某人。

     

这是不可能的。对于4个玩家和游戏,p1对p2赢了,p2对p3赢了,p3对p4赢了,p4对p1赢了,那么就没有办法将玩家分为W和L。我要做的第二件事是,我希望最小化我的错误:W的玩家输给L的玩家(不互相对抗不算损失)的玩家对数。

我(认为)我找到了这个问题的贪婪解决方案。我只是按照损失的数量对玩家进行排序,然后将损失最少的人放在我的W集合中,其余的填充到L。我该如何证明我的贪婪方法实际上是最优的?我已经进行了几次随机测试,可以证明我的方法可以给出可行的解决方案,但是我不知道如何证明这确实可以最大程度地减少错误。

2 个答案:

答案 0 :(得分:2)

您的贪婪算法不是最佳算法。失败原因:

 W      L
===    ===
 A  vs  x
 B  vs  y
 C  vs  z
 B  vs  A
 C  vs  A
 x  vs  y

最优分区是W =(A,B,C),L =(x,y,z),但是您将A放在失败者集中,因为他有2次失败。

您说您做了一些随机测试。您如何验证您的贪婪算法为这些测试产生了正确的结果?

答案 1 :(得分:0)

请考虑以下结果:

Winner    Loser
Adam      John
Bob       John
John      Charles
John      David
John      Ernest
John      Frank
John      George

我们计算损失并按升序排序:

Player    Losses
Adam      0
Bob       0
Charles   1
David     1
Ernest    1
Frank     1
George    1
John      2

您的算法按以下方式划分玩家:

Winners    Losers
Adam       Ernest
Bob        Frank
Charles    George
David      John

错误是(Charles,John)和(David,John);有两个错误。请考虑以下划分:

Winners    Losers
Adam       David
Bob        Ernest
Charles    Frank
John       George

该部门没有错误:没有输给输者的赢家。这是更好的划分,错误更少;因此,如上所述,您的算法不是最佳的。

您的算法的基本问题是它仅考虑损失的数量;对于这种算法,多产的球员看起来比实际情况更糟,原因仅仅是尽管他们可能有更多的胜利,但他们比其他人损失更大。