【发布时间】:2021-09-26 02:43:12
【问题描述】:
假设我们给定了一个无向加权图和一个源节点和目标节点,我们需要通过删除边来断开源节点和目标节点,删除边的成本是边的权重。我们需要最小化断开两个节点的成本。
举例
这里断开0节点和6节点需要5分钟成本
【问题讨论】:
标签: algorithm graph-theory np max-flow
假设我们给定了一个无向加权图和一个源节点和目标节点,我们需要通过删除边来断开源节点和目标节点,删除边的成本是边的权重。我们需要最小化断开两个节点的成本。
举例
这里断开0节点和6节点需要5分钟成本
【问题讨论】:
标签: algorithm graph-theory np max-flow
使用Answer Set Programming,您可以有效地以声明方式解决 NP 问题。
给定一个实例文件instance.lp 来描述您的图表:
edge(0,1,5).
edge(1,2,3).
edge(2,5,3).
edge(5,6,4).
edge(1,3,4).
edge(3,4,5).
edge(4,6,6).
source(0).
sink(6).
以及描述您的问题的encoding.lp:
%% chose a subset of the edges to remove
{removed(X,Y,W) : edge(X,Y,W)}.
%% source is reachable
reach(X) :- source(X).
%% going through edges is reachable if the edge ws not removed
reach(Y) :- reach(X), edge(X,Y,W), not removed(X,Y,W).
%% handling bidirectional edges
reach(Y) :- reach(X), edge(Y,X,W), not removed(Y,X,W).
%% it is not allowed to reach the sink
:- sink(X), reach(X).
%% minimize the number of removed edges weighted by W
#minimize {W,X,Y : removed(X,Y,W)}.
%% show only removed edges
#show removed/3.
调用clingo encoding.lp instance.lp(可在https://potassco.org/ 获得)产生输出:
clingo version 5.5.1
Reading from encoding.lp ...
Solving...
Answer: 1
removed(5,6,4) removed(4,6,6)
Optimization: 10
Answer: 2
removed(5,6,4) removed(1,3,4)
Optimization: 8
Answer: 3
removed(0,1,5)
Optimization: 5
OPTIMUM FOUND
最后一个答案是您问题的最佳解决方案。 您也可以简单地将这两个文件的内容复制到浏览器文本字段中以试用here(性能降低)。
【讨论】:
LOOP
Use Dijkstra to find min path from src to dst
If no path found
STOP
Remove cheapest link on path
【讨论】: