我正在研究论文,其中包括编写禁忌搜索算法来解决“灵活的车间”问题。为了解决此问题,我将图用作问题/解决方案表示法(问题是无向图,必须将其转换为有向无环图)。
简而言之,我有一个开始(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:这是我的第一篇文章
,请随时纠正格式和显示方式中的任何错误