【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题) 实验报告 附代码、数据集
目录 一、实验目的与要求 二、实验内容与方法 三、实验步骤与过程 四、实验结论与体会 尾注 一、实验目的与要求 实验目的: 1. 掌握最大流
目录
一、实验目的与要求
二、实验内容与方法
三、实验步骤与过程
四、实验结论与体会
尾注
一、实验目的与要求
实验目的:
1. 掌握最大流算法思想。
2. 学会用最大流算法求解应用问题。
实验要求:
1. 解释流网络的构造原理。
2. 解释为什么最大流能解决这个问题。
3. 给出上面四个球队的求解结果。
4. 尽可能实验优化的最大流算法。
二、实验内容与方法
棒球赛问题:
图:四个球队的比赛情况
上面的表是四个球队的比赛情况,现在的问题是哪些球队有机会以最多的胜利结束这个赛季?可以看到蒙特利尔队因最多只能取得 80 场胜利而被淘汰,但亚特兰大队已经取得 83 场胜利,蒙特利尔队因为wi + ri < wj 而被淘汰。费城队可以赢83场,但仍然会被淘汰。如果亚特兰大输掉一场比赛,那么其他球队就会赢一场。所以答案不仅取决于已经赢了多少场比赛,还取决于他们的对手是谁。
请利用最大流算法给出上面这个棒球问题的求解方法。
三、实验步骤与过程
1. 解释流网络的构造原理,以及为什么最大流能解决这个问题。
本问题中,我们的求解思路如下:
首先讨论某一个队伍(记为A队)是否有机会在赛季中取胜的问题,我们首先可以确定的是:
①显然,A赢下接下来所有的比赛的情况是对其最优的,如果这种情况仍不能取胜,则不可能取胜;
②在①的情况下,A获胜的场次必须大于当前胜场最多的队伍。
但是,即使是同时满足了条件①、②,A也有可能无法在赛季中取胜。这是因为其他队伍之间也会进行比赛,而这些比赛有可能导致某几个队伍无论如何最终胜场都会超过A,使得A无法取胜。
为了讨论A是否有机会取胜的问题,我们可以首先假设A可以取胜:A赢得了所有未进行的比赛。其他队伍完成了所有的比赛,但是胜场都没超过A。
记A的最终胜场maxA,对于队伍B,记B当前胜场为currentB,则B最多还能赢下来的比赛场次是maxA-currentB(如果能全部赢下来,AB正好并列),其他所有队伍最多能赢下来的场次数以此类推。
接下来以“分配胜场”的方式进行求解:将与A无关的比赛的胜场,分配给除A的所有队伍,且使他们的胜场数都不超过A(此处使用上面的“最多还能赢下来的比赛场次”变量实现),即完成了比赛过程。而如果胜场无法全部分配,说明最终有队伍的胜场数会≥maxA,A无法取胜。分配胜场的过程,即可以使用最大流算法来实现。
本问题的流网络就可以由此得出:
对于每一个比赛队伍,我们需要对其构建一个流网络(还是以A为例):
网络中的节点可以分为四类,且每一类在网络中处于同一层,同层之间互不相连:
源节点:从源节点出去的流量是与A无关的比赛的胜场数;
比赛节点:表示的是与A无关的所有比赛;
队伍节点:表示除A的