重新建模maxflow-mincost以减少负边缘权重

时间:2015-12-17 11:05:58

标签: algorithm boost graph

我们说我的问题简化如下:

  

"制作人Pi可以按每个项目ai生成一定数量的ci项目。消费者Ck可以使用bk金额,每个项目的利润为pk

我们对最大增益/最小损失的maxflow感兴趣,我们打算通过使用BGL' successive_shortest_path_nonnegative_weights或其cycle_canceling来实现这一目标。

我们应该能够通过将来源S与容量Pi的边缘和权重ai的每个ci相关联来对此进行建模。

然后,我们将每个Pi与容量Ck和权重bk的边缘连接到每个-pk

最后,我们将每个Ck与目标T连接起来,容量为bk,费用为0

在该图表上运行cycle_canceling后,我们可以获得两个值:maxflow将产生最大销售量,-mincost将代表总收益/损失。

我们显然不能使用successive_shortest_path_nonnegative_weights,因为 - 好吧,名字已经说明了。

但是,我注意到,cycle_canceling比successive_shortest_path方法慢得多,而且通过重新制定问题,我们可以摆脱负权重。

但是,我不确定如何重新设计它。我们显然不能简单地为所有边权重添加常量,因为这可能会改变最短路径,从而伪造结果。然而,我们必须以某种方式反映这样一个事实,即采取某些边缘会增加总成本,而其他人会从中减去。

任何提示?

1 个答案:

答案 0 :(得分:0)

这是最小成本最大流量的奇怪问题。更好地通过增加成本来对生产者进行分类,通过利润减少对消费者进行分类,然后只要有利益,就会反复让第一个剩余生产者发送给第一个剩余消费者。如果你想获得超级想象,那么有一种O(n)-time算法类似于你最喜欢的中位数发现算法。

编辑:因为隐藏的原因使用最小成本最大流量(请不要养成这个习惯;算法设计特别容易出现XY问题),你可以做的是如下重新加权弧(这是一个标准技巧,用于例如Johnson的算法)。

使用能够处理负权重的算法(例如,Bellman-Ford)来计算从S到每个顶点v的距离d(v)。现在,更新弧的权重w(u-> v)u- > v到d(u)+ w(u-> v) - d(v),这保证是非负的,而从S到T的每条路径的总相对权重保持不变直到加性常数( d术语望远镜)。