一道物流运输规划题目的求解

本文由 大侠(AhcaoZhu)原创,转载请声明。
链接: https://blog.csdn.net/Ahcao2008

Alt

前言

本文源起于,在CSDN 问答题中,有这样一道题,原题目见:
链接: 请问这个代码该怎么改,大佬帮帮我!
我尝试着在原问答处,作了解答;但是基于两点原因:一是感觉意犹未尽,还想借题发挥一下;二是对于过程,需要详细说明,特别是还有一些图,一些引申的想法,也许对于一些做项目的朋友有所帮助,所以,借此写一篇文章吧。
此外,也正好是接触、学习python 快满百天了,借此篇文章纪念吧。真不知道我对此的兴趣还能持续多久。

题目

  • 利用复合数据类型表达有向图,要求每条边同时具有空间距离和时间距离。
  • 编写Path类表示路径。该类应包括用复合数据类型表示的具体路径和费用,应具有增加节点产生新路径的方法。产生路径后,费用同步更新,且为只读属性。
  • 编写有向图类DirectedGraph。该类应具有存储有向图数据的属性,具有产生所有可行路径的私有方法,具有从所有可行路径中搜索出空间和时间最短路径并打印到控制台的方法。
  • 对于任意两个节点,输出空间和时间最短路径和费用。

原题的代码

class DirectedGraph(object):
#构造函数,利用原始图初始化有向图类
    def __init__(self, d):
        if isinstance(d, dict):
            self.__graph = d
        else:
            self.__graph = dict()
            print('Sth error')
#通过递归生成所有可能的路径
    def __generatePath(self, graph, path, end, results):
        current = path[-1]
        if current == end:
            results.append(path)
        else:
            for n in graph[current]:
                if n not in path:
                    self.__generatePath(graph, path + [n], end, results)
#搜索start到end之间最短的路径,并输出
    def searchPath(self, start, end):
        self.__results = []
        self.__generatePath(self.__graph, [start], end, self.__results)
        self.__results.sort(key = lambda x:len(x))    #按所有路径的长度进行排序
        print('The path from ',self.__results[0][0], ' to ', self.__results[0][-1], ' is:')
        for path in self.__results:
            print(path)
 
d = {
   'A':{
   'B':(3,6), 'C':(3,8), 'D':(5,2)},
     'B':{
   'E':(5,8)},
     'C':{
   'D':(6,1), 'F':(8,3)},
     'D':{
   'B':(7,4), 'E':(11,4), 'G':(4,9)},
     'E':{
   'D':(9,2)},
     'F':{
   'D':(3,1), 'G':(2,7)},
     'G':{
   'E':(5,8)}}
g = DirectedGraph(d)
g.searchPath
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AhcaoZhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值