以最小成本断开无向加权图中的两个节点

问题描述

假设我们已经给出了一个无向加权图以及一个源节点和目标节点,我们需要通过删除边来断开源节点和目标节点的连接,并且删除边的成本是边的权重。我们需要最小化断开两个节点的成本。

例如

enter image description here

此处断开 0 节点和 6 节点需要 5 分钟成本

解决方法

使用 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).                                                   
                                                      
source(0).                      
sink(6). 

以及描述您的问题的 encoding.lp

%% chose a subset of the edges to remove 
{removed(X,Y,W) : edge(X,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,W),not removed(X,W).
%% handling bidirectional edges 
reach(Y) :- reach(X),edge(Y,X,not removed(Y,W).
                                                                                                                       
%% it is not allowed to reach the sink                                                                                 
:- sink(X),reach(X).                                                                                                  
                                                                                                                       
%% minimize the number of removed edges weighted by W                                                                  
#minimize {W,Y : removed(X,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,4) removed(4,6)
Optimization: 10
Answer: 2
removed(5,4) removed(1,4)
Optimization: 8
Answer: 3
removed(0,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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...