在有向无环图中包含权重的最佳方法

时间:2019-08-01 18:28:26

标签: python graph networkx

我正在研究论文,其中包括编写禁忌搜索算法来解决“灵活的车间”问题。为了解决此问题,我将图用作问题/解决方案表示法(问题是无向图,必须将其转换为有向无环图)。

简而言之,我有一个开始(0)和结束(*)节点,它们是权重/持续时间为0的“虚拟”操作。节点表示操作,路径表示在其上处理操作的机器,因此长度边(u,v)的时间是在给定机器上的操作u和v之间进行交换时所花费的建立时间。节点的权重应该是该操作在其分配的机器上的处理时间。在有向无环图中,从0到*的最长路径的长度表示溶液的制造期(最大生产时间)。

要实现此目的,我正在使用networkx库。一切进展顺利,但我遇到了一些问题,即在计算制造期时。 首先,由于我发现的功能(dag_longest_path() and dag_longest_path_length())没有考虑节点权重,因此我将节点权重转移到它们之前的边缘。那似乎解决了问题。 但是,我只是注意到在图形为DiGraph或MultiDiGraph的情况下,这些函数具有不同的输出,如下所示。

在展示代码之前,请原谅我的笨拙,这是第一次张贴。我正在使用的实例包含30个操作和8台机器,但是为了简单起见,我展示了一个包含5个操作和3台机器的简单示例。

import networkx as nx

operations = (1,2,3,4,5)
G=nx.DiGraph()
G.add_node(0,pos=(0,0)) #starting node
G.add_node('*',pos=(1,0)) #end node

G.add_nodes_from(operations)

G.add_edge(0,1, weight = 500)
G.add_edge(1,2, weight = 200)
#these edges are for one machine

G.add_edge(0,3, weight = 150)
G.add_edge(3,4, weight = 177)

#these are for a second machine

G.add_edge(0,5, weight = 999)
#this edge is for the last machine

G.add_edge(2, '*', weight = 0)
G.add_edge(4, '*', weight = 0)
G.add_edge(5, '*', weight = 0)
#edges connecting final operation of each machine to the end node

print(nx.dag_longest_path(G))
print(nx.dag_longest_path_length(G))
#printing the longest path and corresponding length

前面的代码输出以下内容:

[0, 5]
999

这是预料之中的,因为通过节点5的路径确实是最长的路径。但是,它不显示末端节点“ *”。

如果我不是G = nx.DiGraph()而是G = nx.MultiDiGraph(),则输出如下:

[0, 1, 2, '*']
3

现在正确地包含了“ *”节点,但是返回的路径是节点最多的路径,而不是边缘最长的路径。

我在这里想念什么? MultiDiGraph()在这里似乎是正确的图形类型,因为节点0和'*'都具有多个离开/进入它们的边。

我需要一种输出方式:

[0, 5, '*']
999

先谢谢您!

PS:这是我的第一篇文章

,请随时纠正格式和显示方式中的任何错误

0 个答案:

没有答案