后续:使用NetworkX在Python中添加两个独立图形的边缘连接节点

时间:2018-08-17 14:10:06

标签: python-3.x networkx

我相当精通C ++,但是我同时学习python,NetworkX和有关pythonic代码的所有知识。阅读各种网站和参考文献后,我的问题与this question相同。不同之处在于我执行任务所采用的方法。请注意,这个问题是关于添加边而不是drawing。我有一个图(SAR),其节点也是图(船和漂泊),

import networkx as nx
import math

# User Inputs
Num_Adrift = 4

# Cluster Definition
Boat = nx.Graph(P_Weight=7000,P_Vol=9*29*60,P_MPG=1,P_Speed=20,P_Crew_Lim=5,P_Asset=1,P_Count=1)
Adrift = nx.Graph(P_Distance=2,P_Time_Lim=30,P_DriftSpeed=1,P_Asset=0,P_Count=Num_Adrift)
SAR = nx.Graph(P_Success = 0)

# SAR Graph
SAR.add_node(Boat)
SAR.add_node(Adrift)

这是在上述问题的注释中引入的方法。我可以使用将船连接到Adrift,

SAR.add_edge(Boat,Adrift,weight=1)

假设Boat有一个节点:

Boat.add_node("embark",P_Material=1,C_supply=1)

并且Adrift有节点

Adrift.add_node("embark",P_lock=1,P_Material=1,C_supply=0)

它们具有相同的名称(目的是在以后自动执行节点连接和计算)。

问题1:为什么此语法不起作用,该如何解决?是不是因为它们本身不是SAR内的节点?

SAR.add_edge(Boat.node["embark"],Adrift.node["embark"],weight=1)

问题2: NetworkX是否能够区分Boat.node [“ embark”]和Adrift.node [“ embark”],还是会认为我正在尝试从某个节点获得优势自己?

我得到的错误是:

---> 76                         SAR.add_edge(Boat.node["embark"],Adrift.node["embark"],weight=1) #<--- this part of code = problem :(

/anaconda3/lib/python3.6/site-packages/networkx/classes/graph.py in add_edge(self, u_of_edge, v_of_edge, **attr)
    873         u, v = u_of_edge, v_of_edge
    874         # add nodes
--> 875         if u not in self._node:
    876             self._adj[u] = self.adjlist_inner_dict_factory()
    877             self._node[u] = {}

TypeError: unhashable type: 'dict'

1 个答案:

答案 0 :(得分:1)

  

TypeError:不可散列的类型:'dict'

NetworkX使用python字典作为数据结构。因此,当您添加节点时,该节点就是dict中给定值(例如其边列表)的key

要使对象成为键,它必须是唯一的。为了比较键之间的唯一性,对象必须是可哈希的。

由于字典不可散列,因此您不能将字典用作键,因此不能将字典用作节点。

可以执行的操作是将整数映射到您的字典,并将其存储在另一词典中。然后,您可以将整数作为节点,并从另一个字典获取实际值。