【问题标题】:Disconnect two nodes in undirected weighted graph with min cost以最小成本断开无向加权图中的两个节点
【发布时间】:2021-09-26 02:43:12
【问题描述】:

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

举例

这里断开0节点和6节点需要5分钟成本

【问题讨论】:

标签: algorithm graph-theory np max-flow


【解决方案1】:

使用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(性能降低)。

【讨论】:

    【解决方案2】:
    LOOP
       Use Dijkstra to find min path from src to dst
       If no path found
          STOP
       Remove cheapest link on path
    

    【讨论】:

    • 在图中的桥的情况下,它不会给我最小成本,只需移除桥,我们就可以断开两个节点,并且它不需要的桥边至少是一个跨度>
    • 这称为贪心算法。不能保证找到最佳值。但它通常会,它快速且易于实施。对于现实世界的问题,这是要走的路
    • 如果我们没有得到最佳解决方案,那么我们可以做一个 dfs 找到所有路径并从每条路径中删除至少一个为什么要使用 Dijkstra,但在这里我们需要每次都找到最低成本使用 dfs 或 Dijkstra 将无法正常工作
    • 检查我添加了一个示例,其中 dfs 或 Dijkstra 会给我们错误的结果,使用 dfs 或 Dijkstra 我们将得到 7 作为结果,但答案是 5
    • 正如我所解释的,我发布的算法不能保证总能找到最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多