Algorithm 重新建模maxflow mincost以丢失负边权重

Algorithm 重新建模maxflow mincost以丢失负边权重,algorithm,boost,graph,Algorithm,Boost,Graph,假设我有一个问题简化如下: “生产者Pi可以以每件商品的成本ci生产一定数量的ai商品。消费者Ck可以以每件商品的pk利润消费一定数量的bk 我们感兴趣的是最大增益/最小损耗的maxflow,我们打算通过使用BGL或其 我们应该能够通过将源S连接到每个Pi,使用容量边缘ai和权重ci对其进行建模 然后,我们将每个Pi连接到每个Ck,并具有容量bk和重量-pk的边缘 最后,我们将每个Ck连接到目标T,具有容量bk和成本0的边缘 在该图上运行cycle_Cancel后,我们可以得到两个值:maxfl

假设我有一个问题简化如下:

“生产者
Pi
可以以每件商品的成本
ci
生产一定数量的
ai
商品。消费者
Ck
可以以每件商品的
pk
利润消费一定数量的
bk

我们感兴趣的是最大增益/最小损耗的maxflow,我们打算通过使用BGL或其

我们应该能够通过将源
S
连接到每个
Pi
,使用容量边缘
ai
和权重
ci
对其进行建模

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

最后,我们将每个
Ck
连接到目标
T
,具有容量
bk
和成本
0的边缘

在该图上运行cycle_Cancel后,我们可以得到两个值:
maxflow
将产生最大售出单位,
-mincost
将表示总收益/损失

显然,我们不能使用连续的最短路径非负权重,因为名称已经说明了它

不过,我注意到,循环取消比连续最短路径方法慢得多,通过重新构造问题,我们可以消除负权重

然而,我不知道如何重新设计它。我们显然不能简单地将一个常数添加到所有边权重,因为这可能会改变最短路径,从而伪造结果。然而,我们必须以某种方式反映这样一个事实:获取某些边会增加总成本,而获取其他边则会减少总成本


有什么提示吗?

对于最小成本最大流量来说,这是一个奇怪的问题。最好按成本增加对生产者进行排序,按利润减少对消费者进行排序,然后反复让第一个剩余生产者发送给第一个剩余消费者,只要有好处。如果你想变得超级花哨,有一个O(n)-类似于您最喜欢的中值查找算法的时间算法

编辑:因为使用“最小成本最大流量”有隐藏的原因(请不要养成这种习惯;算法设计特别容易出现XY问题),所以您可以按如下方式重新加权圆弧(这是一种标准技巧,用于约翰逊算法)


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

我并不是真的关注你的问题。按照你的措辞,生产者
I
只能向消费者
I
销售,消费者
I
只能从生产者
I
消费。不过,这个问题解决起来并不重要,所以我可能会误解。生产者
I
可以向任何消费者销售,反之亦然,consumer
i
可以从任何生产者那里消费。我真的应该选择不同的索引,很抱歉造成混淆。现在应该更清楚了。正如我所说,它已经简化了。虽然我很感谢你的输入,但我真的在寻找一种方法,将其转化为一种没有负边权重的mincost maxflow类型的东西。