现在想起大二的时候的离散数学仍是心有余悸。现已时隔多年,依稀记得邮差问题还有一个贪婪算法。主要是简单易懂吧。但是一说起来,难度刚好的把才学的matplotlib库拿来练习。国安民乐,岂不美哉?

首先准备一下贪婪算法的基本思想:

在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

贪婪算法不是对所有问题都能得到整体最优解,关键是贪婪策略的选择,选择的贪婪策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

接着自己给自己设计题目:

要求26个地点,要求最短路径走完所有的点,并绘制路线图。太难了不敢做,先从简单做起吧。

one出题

那么首先我们首先随机生成26个点吧,不然手写得到啥时候去。还要出题的时候偷懒了。26个点,就26个字母表示吧

import random

name = 'abcdefghijklmnopqrstuvwxyz'

points = {}

for i in name:

x = random.randint(0, 100)

y = random.randint(0, 100)

points[i] = (x, y)

这里随机生成0-100的xy坐标,记录到points中去,这个字典我们打印出来就是这个样子。

{'a': (90, 65), 'b': (15, 12)...

two距离计算函数

现在,有一个动作会重复计算,那就是计算两点距离,那就写一个函数,这样每次用就方便了

def len_point(x, y):

a = (y[0] - x[0]) ** 2

b = (y[1] - x[1]) ** 2

c = a + b

length = round(c ** 0.5, 2)

return length

这应该是初中内容,那就没啥说的了。只是要注意这是针对我们的坐标格式写的,要针对不同情况不同写。

three开始计算距离

首先我们要走几次肯定是知道的

times = len(points) - 1

复制一个列表方便我们瞎折腾,可不能把这个表搞乱了。

建一个列表存路径,一个列表存每次走的距离。

然后第一步还是要我们确定的,那就定A点吧。

points_c = points.copy()

min_p_group = ["a"] # 给出一个列表存路径

min_d_group = [] # 储存每次走的距离

first_p = points_c["a"] # 给出第一个点

del points_c['a'] # 删除第一个点

那么方法就是循环26次,每一次计算该点与剩下点的距离,找到最小值。把该点记录到路径中,再从原列表删除该点。

for i in range(0, times):

key_points = []

for key in points_c.keys():

key_points.append(key) # 计算还要走几个点

min_p = len_point(first_p, points[key_points[0]]) # 第一步

p_number = 0 # 重置点位置

for i in range(0, len(points_c)):

length = len_point(first_p, points[key_points[I]])

if length < min_p:

min_p = length # 储存最短路径

p_number = i # 储存最短路径的位置

min_p_group.append(key_points[p_number]) # 将最短路径的位置保存

min_d_group.append(min_p)

first_p = points_c[key_points[p_number]] # 将最短路径位置保存下一个开始

del points_c[key_points[p_number]] # 从字典里删除这个点

好了,现在最短路径已经存在min_p_group中了,顺便我也记了下每次的距离在min_d_group ,就是这样

['a', 'v', 'd', 'p', 'j', 'x'...

[6.08, 12.53, 9.06, 8.54...

four画图

再复制个列表画图用。

准备搞两张图,一张光画点,一张连起来。

因为知道matplotlib是要用到xy坐标的,所以先见p_x,p_y两个列表准备用。

import matplotlib.pyplot as plt

points_d = points.copy()

p_x = [] # 储存x坐标

p_y = [] # 储存y坐标

第一张图我们就随便画了只要把所有点画上去就好了所以画图的参数用‘o',顺便也把尺寸啊,名字什么的定一下,

for value in points_d.values():

x = value[0]

p_x.append(x)

y = value[1]

p_y.append(y)

plt.subplots(2,2,figsize=(10,5))#规定两张图的尺寸

plt.subplot(121) # 第一张图

for key in points_d.keys():

plt.annotate(key, xy=points_d[key])#给每个点标注

plt.plot(p_x, p_y, 'o')

第二张图呢就稍微复杂一点,每两点之间画一次。

plt.subplot(122) # 第二张图

plt.title("TPS routes")

for key in points_d.keys():

plt.annotate(key, xy=points_d[key])

for i in range(0, times):

plt.plot([points_d[min_p_group[i]][0], points_d[min_p_group[i + 1]][0]],

[points_d[min_p_group[i]][1], points_d[min_p_group[i + 1]][1]], '-o')

five大功告成

plt.show()

这样我们就得到了一张路线图,感觉还是可以的哈。

路线路

six总结

这次用到代码的都是很基础的东西,用到的理论也实在是令我一个数学系的产品狗汗颜,自然代码的写法也是相当稚嫩。

这算是我第一篇关于代码的文字,是沿着前面的登山者留下来的帐篷和继续向上延伸的脚印。当我可能到达某个高度时再回首这个标记可能哑然失笑,不过那肯定是会心的。

c语言邮递员问题算法,用贪婪算法解决邮差问题相关推荐

  1. 用贪婪算法解决背包问题_解决主要算法问题的贪婪策略

    用贪婪算法解决背包问题 Introduction: 介绍: Let's start the discussion with an example that will help to understan ...

  2. 装箱问题c语言函数,C语言基于贪心算法解决装箱问题的方法

    本文实例讲述了C语言基于贪心算法解决装箱问题的方法.分享给大家供大家参考,具体如下: 问题描述: 有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中 ...

  3. c语言装箱问题思路,C语言基于贪心算法解决装箱问题的方法

    本文实例讲述了C语言基于贪心算法解决装箱问题的方法.分享给大家供大家参考,具体如下: 问题描述: 有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中 ...

  4. 教你一步一步用C语言实现sift算法、上

    原文:http://blog.csdn.net/v_july_v/article/details/6245939 引言:     在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的 ...

  5. C语言实现寻找极值点,九之再续:教你一步一步用c语言实现sift算法、上

    教你一步一步用c语言实现sift算法.上 作者:July.二零一一年三月十二日 出处:http://blog.csdn.net/v_JULY_v 参考:Rob Hess维护的sift 库 环境:win ...

  6. python做算法题优势_Python语言在科学算法中的优势

    2019 年第 4 期 信息与电脑 China Computer & Communication 算法语言 Python 语言在科学算法中的优势 刘 瑞 (辽宁师范大学海华学院,辽宁 沈阳 1 ...

  7. c语言编程算法精选,c语言经典程序算法【DOC精选】.doc

    c语言经典程序算法[DOC精选] c语言经典程序算法 浏览次数:47017次悬赏分:15 | 解决时间:2007-9-14 10:02 | 提问者:liyufei05j3 最佳答案 经典C源程序100 ...

  8. r语言 不同长度 list 转 dataframe_解决R效率问题—parallel多线程启动

    很多用R的小伙伴可能会抱怨R的效率问题,尤其是处理海量数据的时候.如果你确实这样认为,那是因为你大概不知道R也有多线程之说... R 提供各种各样的包以解决并行处理问题,其中snow包是最典型的之一. ...

  9. c语言 最大公约数 最小公倍数的编程,C语言三种算法求解最大公约数与最小公倍数...

    C语言三种算法求解最大公约数与最小公倍数 最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实 ...

最新文章

  1. 七个最流行的Python神经网络库
  2. Flutter切换tab后保留tab状态
  3. request.getServletPath()和request.getPathInfo()用法
  4. 改变循环执行的状态,循环程序举例
  5. Ubuntu使用——11(thinkPHP 5在Ubuntu上学习总结)
  6. java大数据开发工程师,面试题附答案
  7. jsp和html的作用域,JSP(二):JSP九大内置对象、四个作用域对象
  8. iOS开发之结构体底层探索
  9. python可以处理什么文件_第十五篇 Python之文件处理
  10. windows server 2000系统安装
  11. excel转pdf排版怎么不变
  12. 参考文献标号字体_参考文献标号字体 参考文献标准格式字体
  13. python计算无穷级数求和_[探求无穷级数求和的几种常用方法]无穷级数求和常用公式...
  14. 云队友丨张朝阳不再狂妄,搜狐的艰难复苏路
  15. 请问为什么DSP需要Q格式? q31、q15、q7和f32是什么意思?
  16. 有缓震功能的舒缓拖鞋能给运动后带来什么样的减压效果?
  17. 题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
  18. oa项目经验描述_(完整版)简历中的项目经验范文
  19. 数据分析报告怎么写(四)
  20. 千纸鹤(小纸片)全套源码

热门文章

  1. 使用PlotNeuralNet绘制深度学习网络图
  2. 李开复给中国大学生的第四封信——大学四年应是这样度过
  3. Codeforces 1086 简要题解
  4. 分布式.RPC-WebService三要素,三个规范, Soap协议(理解原理 才是事半功倍)
  5. html弹窗隐藏,js弹窗window.open 隐藏地址栏的问题location
  6. 2023全国特种作业操作证高处安装、维护、拆除模拟一[安考星]
  7. SqlServer2005 AMD8450 三核CPU安装Sql Server 2000 SP4 补丁的办法
  8. IDEA的校园邮箱激活方式
  9. Android 适配 64 位架构
  10. 黑进腾讯内部系统,攻破论坛服务器,揭晓16岁天才黑客背后的真相