我有一张有向图。每条边都有一个内在的“权重”w_ij
,它是固定的。每个节点都有一个可以配置的值v_i
,除了“根节点”(没有传入边)和“叶子节点”(没有外围边缘),其值是固定的。
每个边的“按节点调整”边缘值由下式给出:
s_ij = w_ij + v_j - v_i
也就是说,我们通过其相邻节点的值的差异来调整边缘的值。当然,更改节点的值会影响s_ij
。
我对min{s_ij}
的值感兴趣,并希望找到节点的最佳值分配,以便最大化这个“瓶颈”值。
有关如何做到的任何想法?
注意:从根到叶子的循环和“固定路径”提供最小值的上限(例如,在一个循环中,节点差异的总和始终为0,所以最好的你可以得到的是边缘内在权重的平均值。但由于周期和“固定路径”可能重叠,因此不清楚最小上限是否可达到。该解决方案可能首先涉及找到这样的路径/周期。
欢迎提出意见,想法和见解。
答案 0 :(得分:4)
如果我理解正确,问题可以表述为这个线性程序。调整输入,使v_i = 0
作为源或接收器的每个顶点i
。
maximize z
subject to
for every ij,
z + v_i - v_j <= w_ij (i.e., z <= w_ij + v_j - v_i = s_ij)
variables
z unbounded
for every vertex i not a source or sink,
v_i unbounded
这是双重计划。
minimize sum_ij of w_ij y_ij
subject to
sum_ij y_ij >= 1
for every vertex i not a source or sink,
sum_j y_ij - sum_j y_ji = 0
variables
for every ij,
y_ij >= 0
如果我们没有从保护约束中排除源和汇,那么这将是最小平均成本周期的线性程序。事实上,我们仍然可以使用流分解技术来表明存在一个最优的存在,即源 - 汇路径或循环,我相信对于找到最小平均成本周期的简单算法的略微修改是适用于此。
获得最佳值z*
后,您可以通过运行具有权重v_i
的Bellman-Ford找到潜力w_ij - z*
。我为没有提供更多细节而道歉,但我有这种唠叨的感觉,我正在做你的功课。
答案 1 :(得分:1)
我可以立即想出两种不同的方法:
首先,您可以二元搜索答案。 检查您可以获得给定的最小边缘权重与最短路径问题密切相关 - 您对节点权重的差异有一堆约束,并且每个约束都是形式w i - w j &gt; = l ij ,某些w已修复。
其次,你可以做subgradient optimisation。您希望最大化边权重的最小值。在这里制定一个次级梯度非常容易。
这个问题可能有很多有用的结构,我不会在这里利用。您可以尝试写下线性编程放松并使用它。这样做 - 更深入地分析问题 - 几乎肯定会导致比上述任何一种方法更快的算法。