paths = list(nx.all_simple_paths(G, source="沙河", target="知春里"))#这里是用于调试输出,这个地方paths一直没有结果
有哪位大佬知道为什么吗,还有后面的代码也可以帮我改改看看吗
```python
import networkx as nx
import numpy as np
# #changPing = [
# "清河站"
# "西二旗"
# "生命科学园"
# "朱辛庄"
# "巩华城"
# "沙河"
# "沙河高教园"
# "南邵"
# "北邵洼"
# "昌平东关"
# "昌平"
# "十三陵景区"
# "昌平西山口"
# #]
AllLine={
"changPing" : [
"清河站",
"西二旗",
"生命科学园",
"朱辛庄",
"巩华城",
"沙河",
"沙河高教园",
"南邵",
"北邵洼",
"昌平东关",
"昌平",
"十三陵景区",
"昌平西山口",
],
"line1":[
"古城",
"八角游乐园",
"八宝山",
"玉泉路",
"五棵松",
"万寿路",
"公主坟",
"军事博物馆",
"木樨地",
"南礼士路",
"复兴门",
"西单",
"天安门西",
"天安门东",
"王府井",
"东单",
"建国门",
"永安里",
"国贸",
"大望路",
"四惠",
"四惠东",
"高碑店",
"传媒大学",
"双桥",
"管庄",
"八里桥",
"通州北苑",
"果园",
"九棵树",
"梨园",
"临河里",
"土桥",
"花庄",
"环球度假区",
],
"line2":[
"西直门",
"车公庄",
"阜成门",
"复兴门",
"长椿街",
"宣武门",
"和平门",
"前门",
"崇文门",
"北京站",
"建国门",
"朝阳门",
"东四十条",
"东直门",
"雍和宫",
"安定门",
"鼓楼大街",
"积水潭",
],
"line4":[
"安河桥北",
"北宫门",
"西苑",
"圆明园",
"北京大学东门",
"中关村",
"海淀黄庄",
"人民大学",
"魏公村",
"国家图书馆",
"动物园",
"西直门",
"新街口",
"平安里",
"西四",
"灵境胡同",
"西单",
"宣武门",
"菜市口",
"陶然亭",
"北京南站",
"马家堡",
"角门西",
"公益西桥",
"新宫",
"西红门",
"高米店北",
"高米店南",
"枣园",
"清源路",
"黄村西大街",
"黄村火车站",
"义和庄",
"生物医药基地",
"天宫院",
],
"line5":[
"宋家庄",
"刘家窑",
"蒲黄榆",
"天坛东门",
"磁器口",
"崇文门",
"东单",
"灯市口",
"东四",
"张自忠路",
"北新桥",
"雍和宫",
"和平里北街",
"和平西桥",
"惠新西街南口",
"惠新西街北口",
"大屯路东",
"北苑路北",
"立水桥南",
"立水桥",
"天通苑南",
"天通苑",
"天通苑北",
],
"line6":[
"金安桥",
"苹果园",
"杨庄",
"西黄村",
"廖公庄",
"田村",
"海淀五路居",
"慈寿寺",
"花园桥",
"白石桥南",
"车公庄西",
"车公庄",
"平安里",
"北海北",
"南锣鼓巷",
"东四",
"朝阳门",
"东大桥",
"呼家楼",
"金台路",
"十里堡",
"青年路",
"褡裢坡",
"黄渠",
"常营",
"草房",
"物资学院路",
"通州北关",
"北运河西",
"北运河东",
"郝家府",
"东夏园",
"潞城",
],
"line7":[
"北京西站",
"湾子",
"达官营",
"广安门内",
"菜市口",
"虎坊桥",
"珠市口",
"桥湾",
"磁器口",
"广渠门内",
"广渠门外",
"双井",
"九龙山",
"大郊亭",
"百子湾",
"化工",
"南楼梓庄",
"欢乐谷景区",
"垡头",
"双合",
"焦化厂",
"黄厂",
"郎辛庄",
"黑庄户",
"万盛西",
"万盛东",
"群芳",
"高楼金",
"花庄",
"环球度假区",
],
"line8":[
"朱辛庄",
"育知路",
"平西府",
"回龙观东大街",
"霍营",
"育新",
"西小口",
"永泰庄",
"林萃桥",
"森林公园南门",
"奥林匹克公园",
"奥体中心",
"北土城",
"安华桥",
"安德里北街",
"鼓楼大街",
"什刹海",
"南锣鼓巷",
"中国美术馆",
"金鱼胡同",
"王府井",
"前门",
"珠市口",
"天桥",
"永定门外",
"木樨园",
"海户屯",
"大红门南",
"和义",
"东高地",
"火箭万源",
"五福堂",
"德茂",
"瀛海",
],
"line9":[
"郭公庄",
"丰台科技园",
"科怡路",
"丰台南路",
"丰台东大街",
"七里庄",
"六里桥",
"六里桥东",
"北京西站",
"军事博物馆",
"白堆子",
"白石桥南",
"国家图书馆",
],
"line10":[
"巴沟",
"苏州街",
"海淀黄庄",
"知春里",
"知春路",
"西土城",
"牡丹园",
"健德门",
"北土城",
"安贞门",
"惠新西街南口",
"芍药居",
"太阳宫",
"三元桥",
"亮马桥",
"农业展览馆",
"团结湖",
"呼家楼",
"金台夕照",
"国贸",
"双井",
"劲松",
"潘家园",
"十里河",
"分钟寺",
"成寿寺",
"宋家庄",
"石榴庄",
"大红门",
"角门东",
"角门西",
"草桥",
"纪家庙",
"首经贸",
"丰台站",
"泥洼",
"西局",
"六里桥",
"莲花桥",
"公主坟",
"西钓鱼台",
"慈寿寺",
"车道沟",
"长春桥",
"火器营",
],
"line11":[
"新首钢",
"北辛安",
"金安桥",
],
"line13":[
"西直门",
"大钟寺",
"知春路",
"五道口",
"上地",
"清河站",
"西二旗",
"龙泽",
"回龙观",
"霍营",
"立水桥",
"北苑",
"望京西",
"芍药居",
"光熙门",
"柳芳",
"东直门",
],
"line14":[
"张郭庄",
"园博园",
"大瓦窑",
"郭庄子",
"大井",
"七里庄",
"西局",
"东管头",
"丽泽商务区",
"菜户营",
"西铁营",
"景风门",
"北京南站",
"陶然桥(暂缓开通)",
"永定门外",
"景泰",
"蒲黄榆",
"方庄",
"十里河",
"南八里庄",
"北工大西门",
"平乐园",
"九龙山",
"大望路",
"红庙",
"金台路",
"朝阳公园",
"枣营",
"东风北桥",
"将台",
"高家园(暂缓开通)",
"望京南",
"阜通",
"望京",
"东湖渠",
"来广营",
"善各庄",
],
"line15":[
"俸伯",
"顺义",
"石门",
"南法信",
"后沙峪",
"花梨坎",
"国展",
"孙河",
"马泉营",
"崔各庄",
"望京东",
"望京",
"望京西",
"关庄",
"大屯东路",
"安立路",
"奥林匹克公园",
"北沙滩",
"六道口",
"清华东路西口",
],
"line16":[
"北安河",
"温阳路",
"稻香湖路",
"屯佃",
"永丰",
"西北旺",
"马连洼",
"农大南路",
"西苑",
"万泉河桥",
"苏州桥",
"万寿寺",
"国家图书馆",
"甘家口",
"玉渊潭东门",
],
"fangShan":[
"东管头南",
"首经贸",
"花乡东桥",
"白盆窑",
"郭公庄",
"大葆台",
"稻田",
"篱笆房",
"长阳",
"广阳城",
"良乡大学城北",
"良乡大学城",
"良乡大学城西",
"良乡南关",
"苏庄",
"阎村东",
],
"yiZhuang":[
"宋家庄",
"肖村",
"小红门",
"旧宫",
"亦庄桥",
"亦庄文化园",
"万源街",
"荣京东街",
"荣昌东街",
"同济南路",
"经海路",
"次渠南",
"次渠",
"亦庄火车站",
],
"yanFang":[
"阎村东",
"紫草坞",
"阎村",
"星城",
"大石河东",
"马各庄",
"饶乐府",
"房山城关",
"燕山",
],
"daXing_airport":[
"草桥",
"大兴新城",
"大兴机场",
],
"capital_airport":[
"北新桥",
"东直门",
"三元桥",
"T3航站楼",
"T2航站楼",
]
}
distance={ #已去掉环路终点和起点权值
"changPing":[1546,5440,2368,3799,2026,1965,5357,1959,1683,2433,3509,1213],
"line1":[1921,1953,1479,1810,1778,1313,1172,1166,1231,424,1596,1217,925,852,774,1230,1377,790,1385,1673,1714,1375,2002,1894,1912,1763,1700,1465,990,1225,1257,776,2238,1863],
"line2":[910,960,1833,1234,929,851,1171,1634,1023,946,1736,1027,824,2228,792,1237,1766],
"line4":[1363,1251,1672,1295,887,900,1063,1051,1658,1517,1441,1025,1100,1100,869,1011,815,1152,1200,1643,1480,827,989,2798,5102,1810,1128,1096,1200,1214,987,2035,2918,1811],
"line5":[1670,905,1900,1183,877,822,945,848,1017,791,866,1151,1059,1026,1121,1838,2956,1330,1306,1544,964,941],
"line6":[1438,839,1792,1794,2276,2140,1508,1431,1167,1665,887,1444,1322,1349,1937,1400,1669,846,1450,2037,1283,3999,1239,1854,1407,2115,2557,3143,1600,929,1347,1194],
"line7":[935,734,1875,1373,886,1205,869,1016,1138,1332,1241,1311,781,865,903,1465,905,1679,1304,1021,1678,1752,2517,2961,2110,1160,1195,1425,1769],
"line8":[2319,1986,2017,1115,1895,1543,1042,2553,2558,1017,1667,900,1009,1275,1084,1188,902,1437,873,762,1857,1085,881,1800,741,845,1678,2446,1537,1215,1684,2076,1510],
"line9":[1348,788,980,1585,1326,1779,1309,1171,1398,1912,1044,1096],
"line10":[1441,1110,950,976,1058,1102,1330,967,1100,1020,982,1713,1003,1759,1535,914,853,1150,734,835,1760,1033,1021,1073,1803,1060,1675,1273,1244,1124,1259,1688,1550,1119,1717,954,749,1587,2365,1041,2386,1215,1591,1206],
"line11":[850,689],
"line13":[2839,1206,1829,4966,1036,2364,3797,1423,2110,4786,2272,6720,2152,1110,1135,1769],
"line14":[1345,4073,1236,2044,1579,845,2000,2000,2000,2000,2000,2000,887,1063,1119,1025,1486,1618,1147,1276,1128,897,1780,708,894,1085,1221,2173,1600,1171,676,1168,903,1283,1100,1364],
"line15":[2441,1332,2712,4567,3354,1616,3387,3309,2009,2295,1652,1759,2039,1087,938,1369,1999,1337,1145],
"line16":[2653,2310,2352,1961,3423,2196,1517,2690,2000,2000,2000,2000,2000,2000],
"fangShan":[1137,1793,1668,1138,1405,6466,4042,2150,1474,2003,1188,1739,1333,1331,2200],
"yiZhuang":[2631,1275,2366,1982,993,1538,1280,1354,2338,2265,2086,1281,1334],
"yanFang":[1541,1210,1649,1929,2087,984,1777,2076],
"daXing_airport":[13028,25303],
"capital_airport":[1622,3022,20738,18322]}
#
#地铁平均速度(单位:m/s)
average_speed={"changPing":13.9,"line1":10.4,"line2":11.5,"line4":12.5,"line5":11.1,"line6":13.9,"line7":11.5,"line8":11.5,"line9":11.5,"line10":11.5,"line11":13.8,"line13":10.4,"line14":10.4,"line15":11.5,"line16":11.5,"fangShan":13.9,"yiZhuang":11.5,"yanFang":11.5,"daXing_airport":22.2,"capital_airport":15.3}
# 创建一个图
G = nx.Graph()
# 添加节点
for value in AllLine.values():
for node in value:
G.add_node(node)
# # 添加边
# for value in AllLine:
# for j,k in enumerate(value):
# G.add_edges_from([j,value[k+1]])
#
#
# # 输出所有路径
# for path in paths:
# print(path)
#添加边
for value1,value2 in zip(AllLine.values(),distance.values()):#对两个字典进行循环
numb=range(len(value2))#定义numb数组,用于遍历
for i,j,k in zip(value1,value2,numb):
G.add_edge(value1[k], value1[k+1], weight=j)
#单独添加环线的终点到起点的边
G.add_edge("积水潭","西直门",weight=1899)
G.add_edge("火器营","巴沟",weight=778)
paths = list(nx.all_simple_paths(G, source="沙河", target="知春里"))#这里是用于调试输出,这个地方paths一直没有结果
for path in paths:
print(paths)
# 添加节点和边,附带权值
# G.add_edge('A', 'B', weight=1)
# G.add_edge('B', 'C', weight=2)
# G.add_edge('C', 'D', weight=3)
# G.add_edge('D', 'A', weight=4)
#选择操作
n=input("请输入对应数字选择您需要进行的操作:\n 1 添加路线\n 2 删除路线\n 3 获取路线\n")
choice=int(n)
#选1,添加线路
if choice==1:
name=input("请输入需要添加的线路名称")
vertex_numb=input("请输入站点个数")
numb1=int(vertex_numb)#站点个数
Numb1 = range(numb1)#用于遍历数组
vertex_name=input("请输入各个站点名称(站点间使用空格分离)").split()#站点名称数组
new_distance=input("请输入每两个相邻站点之间的距离").split()
speed=input("请输入该线路地铁的平均时速")
Speed=int(speed)
line_name=np.zeros(numb1)#初始化该线路数组
# #将vertex_name右字符串数组转化为数字数组
# for i,j,k in zip(vertex_name,Numb1,line_name):
# line_name[j]=intvertex_name[j]
#将new_distance数组转化为数字数组
Distance=np.zeros(numb1-1)#初始化边数组
for ele,i in enumerate(new_distance):#使边数组转化为数字数组
Distance[i] = int(ele)
#添加站点
AllLine[name]=vertex_name
G.add_nodes_from(vertex_name)
#添加边
for i,j,k in zip(vertex_name,Numb1,distance):
G.add_edge(i,vertex_name[j+1],weight=k)
# #添加站点及距离
# for a,b,c in zip(vertex_name,numb1,Distance):
# G.addVertex(a)
# G.addEdge(a,vertex_name[b+1],Distance[b])
print("线路添加完毕")
#选2,删除线路
if choice==2:
name2 = input("请输入需要删除的线路名称,名称要求为:line+序号或者拼音(后一个音节第一个字母大写)")
# numb2=len(name2)
# Numb = range(numb2) # 用于遍历数组
del average_speed[name2]
del AllLine[name2]
print("线路删除完毕")
#选3,获取路线
if choice==3:
start_station=input("请输入起始站点:\n")
destination_station=input("请输入目的地站点:\n")
choose_path=input("请选择您需要的方案\n 1 最短路线\n 2 最少换乘路线\n")
# 找到所有路径
paths = list(nx.all_simple_paths(G, source=start_station, target=destination_station,cutoff=None))
for path in paths:
print(paths)
path_weight=[]#用于储存权值,以计算时间
weighted_paths = []
# shortest_path=[]#最短路线
# 对于每个路径,计算并储存其总权值
for path in paths:
weight = sum(G[path[i]][path[i + 1]]['weight'] for i in range(len(path) - 1))
weighted_paths.append((path, weight))
# for i in path:
# path_weight.append(path,weight)
# 输出结果
for path, weight in weighted_paths:
print(f"Path: {path}, Weight: {weight}")
#求每条路径所用的时间
time = []
if choose_path == 1:
path_numb=range(len(paths))
for path, k in zip(paths,path_numb): # 遍历路径
for station, i in enumerate(path): # 遍历path路径中的节点
for key, value in AllLine.items(): # 遍历线路站点(字典)
for ele, j in enumerate(value): # 遍历站点,找到节点所在线路
if path[i] == ele and path[i + 1] == value[j + 1]: # 如果这条边在这条线路,找到当前对应下标,去寻找路程和速度
# print(key)#显示线路
for key1, value1 in distance.items(): # 遍历权值数组
if key1 == key: # 找到当前对应路线的权值
for line_name, speed in average_speed.items(): # 遍历平均速度数组
if line_name == key: # 找到当前对应路线的速度
time[k] += (AllLine[key] / speed)
#定义 count_cost()函数,用于计算费用
def count_cost(length, cost):
if length <= 6000:
cost = 3
if 6000 < length <= 12000:
cost = 4
if 12000 < length <= 22000:
cost = 5
if 22000 < length <= 32000:
cost = 6
if length > 32000:
cost = 6 + ((length - 32000) / 2000)
return cost
#选择最短路线(权值除以速度,时间相加最短)
if choose_path==1:
def find_min_indices(lst): # 定义找到最小值及其下标函数
min_value = min(lst)
min_indices = [i for i, x in enumerate(lst) if x == min_value]
return min_value,min_indices
find_min_indices(time)
min_time=min(time)
min_index = [i for i, x in enumerate(time) if x == min_time]
# for order in time:
# min_time=min(time)
# min_index=[i for i, x in enumerate(time) if x == min_time]
print("最短路线:")
for i,ind in enumerate(min_index):
print(f"第{ind+1}条")
print(f"距离:{path_weight[i]}")
print(f"时间:{time[i]}")
cost=0
count_cost(path_weight[i],cost)
print(f"费用:{cost}")
for path in paths:
if path==paths[i]:
for point,k in enumerate(path):
for key, value in AllLine.items(): # 遍历线路站点(字典)
for ele, j in enumerate(value): # 遍历站点,找到节点所在线路
if path[k] == ele and path[k + 1] == value[j + 1]: # 如果这条边在这条线路
print(f"{key}:{point}\n")
#选择换乘次数最少路线
transfer_numb=[]#换乘最少路线
tip=None
time=[]
if choose_path == 2:
print("换乘最少路线:")
path_numb = range(len(paths))
for path, k in zip(paths, path_numb): # 遍历路径
for station, i in enumerate(path): # 遍历path路径中的节点
for key, value in AllLine.items(): # 遍历线路站点(字典)
for ele, j in enumerate(value): # 遍历站点,找到节点所在线路
if path[i] == ele and path[i + 1] == value[j + 1]: # 如果这条边在这条线路,得到当前对应下标
if tip==None or tip!=key:
tip=key # 用于统计换乘次数
transfer_numb[k]+=1
# for key1, value1 in distance.items(): # 遍历权值数组
# if key1 == key: # 找到当前对应路线的权值
# for line_name, speed in average_speed.items(): # 遍历平均速度数组
# if line_name == key: # 找到当前对应路线的速度
# time[k] += (AllLine[key] / speed)
def find_min_indices(lst): # 定义找到最小值及其下标函数
min_value = min(lst)
min_indices = [i for i, x in enumerate(lst) if x == min_value]
return min_indices
find_min_indices(transfer_numb)
min_trans=min(transfer_numb)
indexes=[i for i, x in enumerate(time) if x == min_trans]
for i, x in enumerate(indexes):
print(f"第{x + 1}条")
print(f"距离:{path_weight[i]}")
print(f"时间:{time[i]}")
cost = 0
count_cost(path_weight[i], cost)
print(f"费用:{cost}")
for path in paths:
if path == paths[i]:
for point, k in enumerate(path):#遍历当前路径的元素及下标
for key, value in AllLine.items(): # 遍历线路站点(字典)
for ele, j in enumerate(value): # 遍历站点,找到节点所在线路
if path[k] == ele and path[k + 1] == value[j + 1]: # 如果这条边在这条线路
print(f"{key}:{point}\n")
```
把下面这些问题解决了再看看
for path in paths 应该改成 for path in paths:。
在循环中使用 enumerate 时,应该用 i, ele 来获取枚举的元素,而不是 ele, i。
对于换乘最少路线的计算,需要考虑换乘站点。目前的代码中似乎没有考虑站点是否为换乘站点,导致计算的换乘次数可能不准确。
另外,计算换乘最少路线的逻辑也有问题,需要重新考虑如何实现。
count_cost 函数中的条件判断语句应该用 if-elif 来处理,确保只有一个条件被满足。
在计算时间时,应该考虑等待时间,即从一条线路换乘到另一条线路需要等待的时间。
在计算路径权重时,需要将路径上的每一段权重相加,而不是仅仅考虑起点和终点的权重。
用方法all_simple_paths找出所有线路,采用的深度搜索,因节点太多,一直在计算,没得到结果。
你应该加上cutoff参数来控制路径节点的最大长度数。或者用shortest_simple_paths找最短线路。
比如all_simple_paths(G,source='沙河',target='知春里',cutoff =20)
则结果如下:
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '清河站', '上地', '五道口', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '清河站', '上地', '五道口', '知春路', '大钟寺', '西直门', '车公庄', '车公庄西', '白石桥南', '国家图书馆', '魏公村', '人民大学', '海淀黄庄', '知春里']
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '清河站', '上地', '五道口', '知春路', '大钟寺', '西直门', '动物园', '国家图书馆', '魏公村', '人民大学', '海淀黄庄', '知春里']
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '清河站', '上地', '五道口', '知春路', '大钟寺', '西直门', '新街口', '平安里', '车公庄', '车公庄西', '白石桥南', '国家图书馆', '魏公村', '人民大学', '海淀黄庄', '知春里']
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '龙泽', '回龙观', '霍营', '育新', '西小口', '永泰庄', '林萃桥', '森林公园南门', '奥林匹克公园', '奥体中心', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '龙泽', '回龙观', '霍营', '立水桥', '立水桥南', '北苑路北', '大屯路东', '惠新西街北口', '惠新西街南口', '安贞门', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '生命科学园', '西二旗', '龙泽', '回龙观', '霍营', '立水桥', '北苑', '望京西', '芍药居', '惠新西街南口', '安贞门', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '育知路', '平西府', '回龙观东大街', '霍营', '育新', '西小口', '永泰庄', '林萃桥', '森林公园南门', '奥林匹克公园', '奥体中心', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '育知路', '平西府', '回龙观东大街', '霍营', '回龙观', '龙泽', '西二旗', '清河站', '上地', '五道口', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '育知路', '平西府', '回龙观东大街', '霍营', '立水桥', '立水桥南', '北苑路北', '大屯路东', '惠新西街北口', '惠新西街南口', '安贞门', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '育知路', '平西府', '回龙观东大街', '霍营', '立水桥', '北苑', '望京西', '芍药居', '惠新西街南口', '安贞门', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
['沙河', '巩华城', '朱辛庄', '育知路', '平西府', '回龙观东大街', '霍营', '立水桥', '北苑', '望京西', '关庄', '大屯东路', '安立路', '奥林匹克公园', '奥体中心', '北土城', '健德门', '牡丹园', '西土城', '知春路', '知春里']
代码挺乱的,在有问题的代码处增加一些日志输出,看下逻辑是否存在问题。
直接贴问题,会好点,代码太多了
结合GPT给出回答如下请题主参考
根据你提供的信息,无法准确判断出为什么all_simple_paths
方法没有返回结果。以下是几个可能的原因:
all_simple_paths
方法会返回一个空列表。all_simple_paths
方法不能返回结果。推荐你按照以下步骤逐个排查:
nx.shortest_path
)检查是否能够找到这样的路径。all_simple_paths
方法,例如nx.all_simple_paths(G, source="沙河", target="知春里", cutoff=10)
,其中cutoff
参数限制了路径长度。如果这种情况下程序能够返回结果,说明存在从"沙河"到"知春里"的简单路径,但是路径长度过长。networkx
库,并且图G被正确定义。引用 皆我百晓生 小程序回复内容作答:
根据您提供的代码,我发现您在使用networkx库的all_simple_paths
函数来获取两个站点之间的所有路径。然而,根据您提供的代码,我们无法确定您如何构建了图G的数据结构。可能的原因是您没有正确地构建图G,导致无法找到任何路径。
请确认以下几点:
networkx
库中的方法正确构建了图G,并且图G中包含了所有的站点和它们之间的连接关系。如果您能提供更多关于如何构建图G的代码,我可以帮助您进一步分析和解决问题。
【以下回答由 GPT 生成】
首先,通过观察给出的代码,我们可以看到其中使用了networkx
库来进行路径搜索。然而,在这段代码中,我们并没有看到图对象G的定义和构建。所以,我们需要首先构建地铁线路的图。
我们可以使用networkx
库中的Graph()
函数来创建一个图对象G,并使用add_edge()
方法来添加站点之间的边。
下面是根据提供的地铁线路,修改并完善代码的具体步骤:
import networkx as nx
import numpy as np
# 创建一个空的图对象
G = nx.Graph()
# 添加地铁线路上的所有站点
for line, stations in AllLine.items():
for i in range(len(stations)-1):
# 添加相邻站点之间的边
G.add_edge(stations[i], stations[i+1])
# 打印地铁线路图的节点数和边数
print("节点数:", G.number_of_nodes())
print("边数:", G.number_of_edges())
修改路径搜索部分的代码,首先确认图对象G是否正确构建。如果图对象G构建正确,可以尝试使用all_simple_paths()
函数来查找路径。
# 调试路径搜索部分的代码
paths = list(nx.all_simple_paths(G, source="沙河", target="知春里"))
print("找到的路径数量:", len(paths))
print("其中一个路径:", paths[0])
如果上述步骤成功找到路径,则说明路径搜索问题已解决。
如果你想继续改进代码,可以尝试以下几个方向:
networkx
库中提供了其他的搜索算法,如A*算法等,可以根据实际需求选择更适合的算法来进行路径搜索。希望以上解答对你有帮助,如果还有任何疑问,请随时向我提问。
【相关推荐】
现在我添加了一个time字典,创建了一个time_G图,其它的操作和原来的G一样,但是我用nx.shortest_path(G,source,target)(已赋值)时,报错说我没有路,为什么
time={
"changPing":[6,6,4,4,3,3,5,4,2,3,4,2],
"line1":[3,3,2,3,3,3,2,2,3,1,3,2,2,2,2,2,3,2,3,3,3,8,3,3,3,3,3,2,3,2,2,1,2,2],
"line2":[4,2,3,2,2,2,2,3,2,2,3,2,2,4,2,2,3],
"line4":[1,2,3,3,1,2,3,1,3,3,2,2,3,2,2,2,2,2,2,3,3,2,2,4,5,3,2,2,2,3,2,3,3,2],
"line5":[2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,4,2,3,2,2,1],
"line6":[2,2,3,3,3,3,2,3,3,2,2,2,3,2,4,2,3,2,3,3,2,4,2,3,2,3,3,5,2,2,2,2],
"line7":[2,2,3,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
"line8":[3,3,3,2,3,3,2,3,4,2,2,2,3,2,2,2,3,2,2,2,4,2,2,4,2,1,4,3,2,3,2,3,2],
"line9":[2,2,2,2,3,3,3,3,3,3,2,2],
"line10":[2,2,2,2,2,2,2,2,2,3,3,2,2,3,2,2,2,2,2,2,2,2,2,3,2,3,2,2,2,2,4,2,2,3,3,2,3,3,2,3,3,2,2,2],
"line11":[3,2],
"line13":[3,2,3,5,1,2,5,2,3,5,3,7,3,2,2,2],
"line14":[1,6,2,3,3,2,3,2,3,2,2,3,1,2,2,3,2,3,2,2,2,2,3,2,2,2,2,4,2,2,2,2,2,3,2,2],
"line15":[3,3,3,5,4,2,4,3,3,2,3,4,3,2,2,3,3,2,2],
"line16":[3,3,4,3,7,3,3,5,3,5,3,3,4,2],
"fangShan":[2,3,2,3,3,6,8,5,2,3,3,2,1,5,3],
"yiZhuang":[3,2,4,2,2,3,2,2,4,3,2,2,2],
"yanFang":[2,2,3,3,3,2,3,2],
"daXing_airport":[7,12],
"capital_airport":[4,4,16,16]
}
shortest_path = nx.shortest_path(time_G, source=start_station, target=destination_station)
print(shortest_path)
先检查下networkx库中构建图G的是否成功,图中的站点名称是否有效。
建议百度网上看看吧,这里回答都是ai生成的
代码有点乱
直接参考案例吧
# 地铁站点列表
station_list = [
"朝阳公园",
"大葆台",
"T3航站楼",
"草房",
"T2航站楼",
"朱辛庄",
"回龙观",
"海淀五路居",
"东直门",
"北京站",
"西二旗",
"九龙山",
"天安门东",
"北京南站",
"广安门内",
"苏州街",
"亦庄火车站",
"天通苑南"
]
# 地铁线路列表
line_list = [
{"name": "1号线", "stations": ["苹果园", "古城", "八角游乐园", "八宝山", "玉泉路", "五棵松", "万寿路", "公主坟", "军事博物馆",
"木樨地", "南礼士路", "复兴门", "西单", "天安门西", "天安门东", "王府井", "东单", "建国门",
"永安里", "国贸", "大望路", "四惠", "四惠东"]},
{"name": "2号线", "stations": ["西直门", "车公庄", "阜成门", "复兴门", "长椿街", "宣武门", "和平门", "前门", "崇文门",
"北京站", "建国门", "朝阳门", "东四十条", "东直门", "雍和宫", "安定门", "鼓楼大街", "积水潭"]},
{"name": "4号线", "stations": ["天宫院", "生物医药基地", "义和庄", "黄村火车站", "黄村西大街", "清源路", "枣园", "高米店南",
"高米店北", "西红门", "新宫", "公益西桥", "角门西", "马家堡", "北京南站", "陶然亭", "菜市口",
"宣武门", "西单", "灵境胡同", "西四", "平安里", "新街口", "西直门"]},
{"name": "5号线", "stations": ["宋家庄", "刘家窑", "蒲黄榆", "天坛东门", "磁器口", "崇文门", "东单", "灯市口", "东四",
"张自忠路", "北新桥", "雍和宫", "和平里北街", "和平西桥", "惠新西街南口", "惠新西街北口",
"大屯路东", "北苑路北", "立水桥南", "立水桥", "天通苑南", "天通苑"]},
{"name": "6号线", "stations": ["海淀五路居", "慈寿寺", "花园桥", "白石桥南", "车公庄西", "车公庄", "平安里", "北海北",
"南锣鼓巷", "东四", "朝阳门", "东大桥", "呼家楼", "金台路", "十里堡", "青年路", "褡裢坡",
"黄渠", "常营", "草房", "物资学院路", "通州北关", "通运门", "北运河西", "北运河东"]},
{"name": "7号线", "stations": ["北京西站", "湾子", "达官营", "广安门内", "菜市口", "虎坊桥", "珠市口", "桥湾", "磁器口",
"广渠门内", "广渠门外", "九龙山", "大郊亭", "百子湾", "化工", "南楼梓庄", "欢乐谷景区"]},
{"name": "8号线", "stations": ["朱辛庄", "育知路", "平西府", "回龙观东大街", "霍营", "育新", "西小口", "永泰庄", "林萃桥",
"森林公园南门", "奥林匹克公园", "奥体中心", "北土城", "安华桥", "安德里北街", "鼓楼大街",
"什刹海", "南锣鼓巷"]},
{"name": "9号线", "stations": ["国家图书馆", "白石桥南", "白堆子", "军事博物馆", "北京西站", "六里桥东", "六里桥",
"七里庄", "丰台东大街", "丰台南路", "科怡路", "丰台科技园", "郭公庄"]},
{"name": "10号线", "stations": ["车道沟", "长春桥", "火器营", "巴沟", "苏州街", "海淀黄庄", "知春里", "知春路", "西土城",
"牡丹园", "健德门", "北土城", "安贞门", "惠新西街南口", "芍药居", "太阳宫", "三元桥", "亮马桥",
"农业展览馆", "团结湖", "呼家楼", "金台夕照", "国贸", "双井", "劲松", "潘家园", "十里河",
"分钟寺", "成寿寺", "石榴庄", "大红门", "角门东", "角门西", "草桥", "纪家庙", "首经贸", "丰台站",
"泥洼", "西局", "六里桥", "莲花桥", "公主坟", "西钓鱼台", "慈寿寺", "车道沟"]},
{"name": "13号线", "stations": ["西直门", "大钟寺", "知春路", "五道口", "上地", "西二旗", "龙泽", "回龙观", "霍营",
"立水桥", "北苑", "望京西", "芍药居", "光熙门", "柳芳", "东直门"]},
{"name": "14号线西段", "stations": ["张郭庄", "园博园", "大瓦窑", "郭庄子", "大井", "七里庄", "西局"]},
{"name": "14号线东段", "stations": ["北京南站", "陶然亭", "永定门外", "景泰", "蒲黄榆", "方庄", "十里河", "北工大西门",
"平乐园", "九龙山", "大望路", "金台路", "朝阳公园", "枣营", "东风北桥", "将台", "望京南",
"阜通", "望京", "东湖渠", "来广营", "善各庄"]},
```java
```
该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。
在代码中,关于路径计算部分有以下几个问题:
在添加新路线时,边的权值应该由新添加的距离数据构成,而不是从原有的distance
字典中读取。
在计算路径时间时,没有对该路径进行初始化,需要在计算之前对其进行初始化,例如:time[k]=0
。
在遍历路径节点时,应该使用enumerate
遍历,而不是直接使用节点本身。
在计算路径时间时,应该使用该路径经过的所有线路的平均速度的平均值,而不是只使用其中一个。
修改后的部分代码如下:
#选1,添加线路
if choice==1:
name=input("请输入需要添加的线路名称")
vertex_numb=input("请输入站点个数")
numb1=int(vertex_numb)#站点个数
Numb1 = range(numb1)#用于遍历数组
vertex_name=input("请输入各个站点名称(站点间使用空格分离)").split()#站点名称数组
new_distance=input("请输入每两个相邻站点之间的距离").split()
speed=input("请输入该线路地铁的平均时速")
Speed=float(speed)
line_name=np.zeros(numb1)#初始化该线路数组
#将new_distance数组转化为数字数组
Distance=[int(d) for d in new_distance]
#添加站点
AllLine[name]=vertex_name
G.add_nodes_from(vertex_name)
#添加边
for i,j,k in zip(vertex_name,Numb1,Distance):
G.add_edge(i,vertex_name[j+1],weight=k/Speed)
print("线路添加完毕")
#选3,获取路线
if choice==3:
start_station=input("请输入起始站点:\n")
destination_station=input("请输入目的地站点:\n")
choose_path=input("请选择您需要的方案\n 1 最短路线\n 2 最少换乘路线\n")
# 找到所有路径
paths = list(nx.all_simple_paths(G, source=start_station, target=destination_station,cutoff=None))
path_weight=[]#用于储存权值,以计算时间
weighted_paths = []
# shortest_path=[]#最短路线
# 对于每个路径,计算并储存其总权值
for path in paths:
weight = sum(G[path[i]][path[i + 1]]['weight'] for i in range(len(path) - 1))
weighted_paths.append((path, weight))
path_weight.append(weight)
# 输出结果
for path, weight in weighted_paths:
print(f"Path: {path}, Weight: {weight}")
#求每条路径所用的时间
time = []
if choose_path == 1:
path_numb=range(len(paths))
for path, k in zip(paths,path_numb): # 遍历路径
time.append(0)
for point, station in enumerate(path[:-1]): # 遍历path路径中的节点
for key, value in AllLine.items(): # 遍历线路站点(字典)
if station in value and path[point+1] in value: # 如果这条边在这条线路,找到当前对应下标,去寻找路程和速度
speed_list = [average_speed[line] for line in AllLine.keys() if station in AllLine[line]] # 当前线路的速度
speed = sum(speed_list) / len(speed_list) # 平均速度
distance = G[station][path[point+1]]['weight'] # 距离
time[k] += (distance / speed)
#选择最短路线(权值除以速度,时间相加最短)
if choose_path==1:
total_time = [path_weight[i]/sum([G[path[i]][path[i + 1]]['weight'] for i in range(len(path) - 1)]) for path in paths]
min_time, min_index = min((val, idx) for (idx, val) in enumerate(total_time))
print("最短路线:")
print(f"第{min_index+1}条")
print(f"距离:{path_weight[min_index]}")
print(f"时间:{sum([G[paths[min_index][i]][paths[min_index][i + 1]]['weight'] for i in range(len(paths[min_index]) - 1)])}")
cost = count_cost(path_weight[min_index])
print(f"费用:{cost}")
for point, station in enumerate(paths[min_index]):
flag = False
for key, value in AllLine.items(): # 遍历线路站点(字典)
if station in value and flag == False: # 如果这条边在这条线路
flag = True
print(f"{key}:{point}\n")
#选择换乘次数最少路线
if choose_path == 2:
for path in paths:
transfer_numb = 0
for i, station in enumerate(path[:-1]): # 遍历path路径中的节点
for key, value in AllLine.items(): # 遍历线路站点(字典)
if station in value and path[i+1] in value: # 如果这条边在这条线路,找到当前对应下标,去寻找路程和速度
if key != AllLine[path[i-1]][-1]:
transfer_numb += 1
time.append(sum([G[path[i]][path[i + 1]]['weight'] for i in range(len(path) - 1)]) / sum([average_speed[line] for line in AllLine.keys() if path[0] in AllLine[line] or path[-1] in AllLine[line]]))
transfer_numb.append(transfer_numb)
min_trans, min_index = min((val, idx) for (idx, val) in enumerate(transfer_numb))
print("换乘最少路线:")
print(f"第{min_index+1}条")
print(f"距离:{path_weight[min_index]}")
print(f"时间:{time[min_index]}")
cost = count_cost(path_weight[min_index])
print(f"费用:{cost}")
for point, station in enumerate(paths[min_index]):
flag = False
for key, value in AllLine.items(): # 遍历线路站点(字典)
if station in value and flag == False: # 如果这条边在这条线路
flag = True
print(f"{key}:{point}\n")