2301_76836628 2023-09-10 23:14 采纳率: 100%
浏览 57
已结题

python编写地铁问题

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")


```

  • 写回答

13条回答 默认 最新

  • Java毕设王 2023-09-11 11:32
    关注

    把下面这些问题解决了再看看
    for path in paths 应该改成 for path in paths:。
    在循环中使用 enumerate 时,应该用 i, ele 来获取枚举的元素,而不是 ele, i。
    对于换乘最少路线的计算,需要考虑换乘站点。目前的代码中似乎没有考虑站点是否为换乘站点,导致计算的换乘次数可能不准确。
    另外,计算换乘最少路线的逻辑也有问题,需要重新考虑如何实现。
    count_cost 函数中的条件判断语句应该用 if-elif 来处理,确保只有一个条件被满足。
    在计算时间时,应该考虑等待时间,即从一条线路换乘到另一条线路需要等待的时间。
    在计算路径权重时,需要将路径上的每一段权重相加,而不是仅仅考虑起点和终点的权重。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 9月25日
  • 已采纳回答 9月17日
  • 创建了问题 9月10日