如何解决从图表中的节点计算所有可能的路径
我需要一个建议,如何使用程序(以编程方式)计算从开始节点到结束节点的所有可能路径,我可以使用C#,Python或Matlab,但是我不知道哪个更容易,更快速地进行编码和更少的工作量,我也不知道从哪里开始,我还需要自动绘制节点之间的边缘,然后再计算更多公式。 我有以下数据
Node Date Data
A 2020-01-01 2.09
B 2020-01-05 0.89
C 2020-01-08 3.17
D 2020-01-08 1.15
E 2020-01-15 3.65
我要执行以下操作:
-
创建从任何节点到另一个节点的路径(仅一种方式,从较低日期到较高日期),并且必须穿过路径中日期之间的所有节点,例如:
1.1从(A)到(E) 应该提取以下路径:
- A,B,C,E
- A,B,D,E
由于C和D的日期相同,所以我们有2条不同的路径。
-
列表项
解决方法
使用Python {@ 3}}的Python groupby和产品
代码
#include<stdio.h>
int a;
int count2() {
int b ;
printf ("\n value of b2 variable for second time is : %d ",b);
}
int count() {
int b = 2;
b++;
printf ("\n value of b variable is : %d ",b);
b = 99;
}
int main() {
printf ("value of a variable is : %d ",a);
count();
count2();
}
用法
示例1:字符串数据
from itertools import groupby,product
def all_paths(s):
# Convert string to list of node triplets
nodes = [n.strip().split() for n in s.split('\n')]
# Skip header and sort by time
# (since time is padded,no need to convert to datetime object to sort)
nodes = sorted(nodes[1:],key=lambda n: n[1]) # sorting by time which is second item in list (n[1])
# Group nodes by time (i.e. list of list,with nodes with same time in same sublist)
# Just keeping the node field of each item in sublist (i.e. node[0] is Node field)
labels = [[node[0] for node in v] for k,v in groupby(nodes,lambda n:n[1])]
# Path is the product of the labels (list of lists)
return list(product(*labels))
示例2:文件data.txt中的数据
data = '''Node Date Data
A 2020-01-01 2.09
B 2020-01-05 0.89
C 2020-01-08 3.17
D 2020-01-08 1.15
E 2020-01-15 3.65'''
print(all_paths(data))
输出(两种情况):
with open('data.txt','r') as fin:
print(all_paths(fin.read()))
,
这将为每个路径生成一个节点链列表。它使用python列表和字典进行哈希处理-因此,如果要处理大型数据集,它将非常慢。如果是这种情况,请查看熊猫库(groupby)。相同的逻辑将起作用,但是您肯定会在nodes_by_date函数中节省时间。该库中可能还存在其他工具来生成所需的路径。
nodes = [('E',15,3.65),('A',1,2.09),('B',5,.89),('C',8,3.17),('D',1.15)]
#nodes = [('E',1.15),('F',16,100),('G',200),('H',17,1000)]
def all_paths(nodes):
nbd = nodes_by_date(nodes)
return get_chains(nbd,0)
def nodes_by_date(nodes):
# sort by date (not sure what format your data is in,but might be easier to convert to a datenum/utc time)
nodes = sorted(nodes,key=lambda x: x[1])
# build a list of lists,each containing all of the nodes with a certain date
# if your data is larger,look into the pandas library's groupby operation
dates = {}
for n in nodes:
d = dates.get(n[1],[])
d.append(n)
dates[n[1]]=d
return list(dates.values())
def get_chains(nbd,i):
if i == len(nbd):
return []
# depth-first recursion so tails are only generated once
tails = get_chains(nbd,i+1)
chains = []
for n in nbd[i]:
if len(tails):
for t in tails:
newchain = [n]
# only performant for smaller data
newchain.extend(t)
chains.append(newchain)
# end of recursion
else:
chains.append([n])
return chains
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。