[英]Dividing players into "winners" and "losers": how to prove that greedy solution gives optimal result?
我有一个问题,说明以下内容:
n 个玩家(其中 n 是偶数)要互相玩游戏。 不一定每个人都会玩,但玩家只能与其他人玩一次。 如果两个人决定互相比赛,我们就会有一个输家和一个赢家。 然后我希望将我的 n 个玩家分成两组,大小为 n/2:赢家 (W) 和输家 (L)。 我希望我的赢家系列中的所有玩家都不会输给我的输家系列中的某个人。
这是不可能的。 对于 4 个玩家和游戏 p1 对 p2,p2 对 p3,p3 对 p4 和 p4 赢对 p1 那么没有办法将玩家划分为 W 和 L。我做下一个最好的事情,这是我希望尽量减少我的错误:W 中的玩家输给 L 中的玩家的玩家对数(不互相对抗不算输)。
我(认为)我找到了这个问题的贪婪解决方案。 我只是根据他们的输球数量对玩家进行排序,并将输球最少的人放在我的 W 组中,并将其余的人填入 L。我如何证明我的贪婪方法实际上是最佳的? 我已经做了几次随机测试,我可以证明我的方法会给出一个可行的解决方案,但我不知道如何证明这实际上可以最大限度地减少我的错误。
你的贪心算法不是最优的。 它失败了:
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 个损失。
你说你做了一些随机测试。 您如何验证您的贪婪算法为这些测试产生了正确的结果?
考虑以下结果:
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
这种划分没有错误:没有输给输家的赢家。 这是一个更好的划分,错误更少; 所以你的算法,如上所述,不是最优的。
你的算法的根本问题是它只考虑损失的数量; 对于这种算法,多产的玩家可能看起来比实际情况更糟,这仅仅是因为他们比其他人输得更多,尽管可能赢了更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.