我遇到以下问题:
n个玩家(其中n是偶数)要互相对战。每个人都不一定会玩,但玩家只能与他人对战一次。如果两个人确实决定互相对抗,我们将有一个失败者和一个获胜者。然后,我希望将我的n位玩家分成大小为n / 2的两组:赢家(W)和输家(L)。我希望赢家中的所有玩家都不会输给输家中的某人。这是不可能的。对于4个玩家和游戏,p1对p2赢了,p2对p3赢了,p3对p4赢了,p4对p1赢了,那么就没有办法将玩家分为W和L。我要做的第二件事是,我希望最小化我的错误:W的玩家输给L的玩家(不互相对抗不算损失)的玩家对数。
我(认为)我找到了这个问题的贪婪解决方案。我只是按照损失的数量对玩家进行排序,然后将损失最少的人放在我的W集合中,其余的填充到L。我该如何证明我的贪婪方法实际上是最优的?我已经进行了几次随机测试,可以证明我的方法可以给出可行的解决方案,但是我不知道如何证明这确实可以最大程度地减少错误。
答案 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
该部门没有错误:没有输给输者的赢家。这是更好的划分,错误更少;因此,如上所述,您的算法不是最佳的。
您的算法的基本问题是它仅考虑损失的数量;对于这种算法,多产的球员看起来比实际情况更糟,原因仅仅是尽管他们可能有更多的胜利,但他们比其他人损失更大。