程序已通过检测:  https://www.dotcpp.com/oj/problem1640.html

问题描述
  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
  第一行为4个实数D1、C、D2、P与一个非负整数N;
  接下来N行,每行两个实数Di、Pi。
输出格式
  如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
样例输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
样例输出
26.95

贪心算法:

1、贪心算法,就像它的名字一样,在每个状态都表现出一种贪心的心理,希望得到当前状态的最优策略,一点儿也不想吃亏,不愿从长远上去考虑。显然,这种策略是一种局部的最优解,它可能是整体最优,也可能不是,这类似于数学中的极值一样。不过贪心算法仍是非常有用的,因为它可以简化问题,把一个大问题分解成若干个小问题,降低了问题的复杂度,通过一步一步求解,逐步逼近最终结果,因为每一步都是当前的最优解,而最终得到的结果要么就是整体最优,要么接近整体最优解。

2、理论上来说,要想得到整体最优解,只有遍历所有情况。当要考虑的情况比较多时,我们会借助其它算法减少选择空间。但是如果可选择空间及其复杂时,计算机需要做大量运算,当然耗时也更多。此时,如果我们对结果准确度要求场合不是非常精确的场合,即允许计算结果在一定程度下偏离整体最优解,最优解贪心算法是非常简洁而又高效的。

3、贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。换句话说,贪心算法会一直向前走,不会回头,直到解决问题。

分析问题:

设第i个加油站的加油量为ai(i=0,1,2……N),设第i个加油站到起点的距离为Di(i=0,1,2……N+1),设第i个加油站的油价为Pi(i=0,1,2……N+1),Di和Pi是已知量。旅行家目的是花最少的钱到达终点,也就求ai的组合,一共N+1个变量,显然,这是一个多元线性规划问题。

(1)遍历法

要想到达目的地,且在每一站车上的油量都不超过满油量C,是需要满足一定条件的,即达到当前站的所有加油量,应大于或等于刚好要到达下一站需要的油量,小于或等于刚好到达当前站需要的油量加上满油量C,用公式描述就是

因此每一站的加油量就要满足下面的不等式:

        其中,

这样,当旅行家输入Di、Pi、D2、C、N后,a0的范围就已经确定了,当a0的值确定时,a1的范围也就确定了,当a1的值确定时,a2的范围也就确定了,一直循环下去,直到确定aN的值。显然这是一个N+1层的循环嵌套。然而这个程序并不好写,因为N是一个输入的量,输入的N不同,循环层数也就不同,同时下一次的循环范围是和当前ai的取值有关的。笔者水平有限,对递归掌握不深,写了两天也未完成。可以知道的是,这种程序的循环次数非常大,而且随着加油量精度的提高,循环次数以10的N+1次方的量级提升,以样例输入数据为例,当加油量精度为0.1升时,循环次数为616968,精度为0.01升时,循环次数为614219840。有兴趣的可以尝试用递归写一下,或者使用matlab的矩阵运算,不过这似乎意义不太大,因为我们有更好的贪心算法。

(2)贪心法

核心思想就是每次都尽量去更便宜的油站加油,除非在能到达的油站内没有更便宜的油站了。

一共有N个油站,约定Di[0]=0,Pi[N +1]=0,即起点的距离为0,终点的油价为0

假设旅行家当前处于第 i (0=< i <=N)个油站,车上剩余油量为remain,已经花费cost,

先判断满油下能否到达下一站,假如不能达到,得出结论:此问题无解,输出 No Solution。如果能到达,则从当前油站开始,寻找下一个比当前站更便宜的油站,记为k站(k>=i)。i依次加1,只要油价比当前站便宜即找到k站,因为终点的油价为0,所以一定会找到k站,有可能还没到达终点就找到k,也可能k就是终点。找到k站后有两种情况

1、能到达k站

(1)剩油量能去k站>>>直接去k站

(2)剩油量不能去k站>>>加油到刚好去k站

2、不能到达k站(也就是说在能到达的所有站点中,当前站油价最便宜)

(1)加满油去下一站

python实现代码如下:

D1,C,D2,P,N = input().split()
D1 = float(D1)   #两城市间距离
C = float(C)       # 汽车油箱容量
D2 = float(D2)   #每升汽油能行驶的距离
P= float(P)        #出发点每升汽油价格
N = int(N)        #沿途油站数
Di = [0,]     #每个加油站到起点的距离
Pi = [P,]       #每个加油站的油价
a = [ ]        #用来存储在n个加油站的加油量
remain = 0 #剩余油量
cost = 0     #花费油钱
Solution = 0 #问题是否有解的标志,0有解,1无解
full = C * D2
for i in range(N):d,p= input().split()d = float(d)p = float(p)Di.append(d)Pi.append(p)
Di.append(D1)
Pi.append(0)
# 初始化每个加油站的加油量
for k in range(N + 1) : a.append(0)
i = 0
while i <= N :To_next = Di[i + 1] - Di[i]   #当前站点到下一站的距离if   To_next > full  :      #不能够到达下一站Solution = 1breakelse :           #能去下一站k = i + 1while k <= N + 1 :if Pi[i] >= Pi[k] :   #搜索油价小于或等于i站的下一个油站kbreakk += 1To_cheap = Di[k] - Di[i]               #当前站点到k站点的距离if full >= To_cheap :              #能到达k站use_cheap = To_cheap/D2a[i] = use_cheap - remainif  a[i] > 0 :      #剩下的油不能直接到达k站cost += a[i] * Pi[i]remain = 0           else :              #剩下的油能直接到达k站a[i] = 0remain -= use_cheapi = kelse :#不能达到k站  #加满油去下一个站点'''a[i] = C - remaincost += a[i] * Pi[i]           remain = C - To_next/D2       i += 1
if Solution == 0:print('%.2f'% cost)
else :print('No Solution')
##    print(a)  #打印每个油站的加油量

测试结果如下:

基于python程序利用贪心算法解决旅行家的预算问题相关推荐

  1. Python项目:The Ship Rendezvous Problem,利用贪心算法解决船舶交会问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Python利用贪心算法解决船舶交会问题 1 Introduction 2 Python Task Greedy Heuristic ...

  2. 贪心算法解旅行家的预算问题

    贪心算法解旅行家的预算问题 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2 ...

  3. 神经进化算法——利用NEAT算法解决迷宫导航问题(基于NEAT-Python)

    神经进化算法--利用NEAT算法解决迷宫导航问题(基于NEAT-Python) 迷宫导航问题 迷宫环境模拟 迷宫导航智能体 迷宫环境实现 传感器数据生成 导航智能体 智能体位置更新 智能体记录存储 智 ...

  4. 贪心算法解决活动安排-Python实现(排序+贪心选择)

    贪心算法解决活动安排 问题 问题概述 分析问题 解决问题 编程 编程流程以及数据类型选择 发现问题以及解决 最终实现 总结 程序缺陷以及完善 解题心路历程 问题 问题概述 设有n个活动的集合E={1, ...

  5. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题

    前面我们分享了关于js使用贪心算法解决找零问题,本文我们接着为大家介绍JS基于贪心算法解决背包问题. 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做 ...

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

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

  7. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题示例

    本文实例讲述了JS基于贪心算法解决背包问题.分享给大家供大家参考,具体如下: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局 ...

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

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

  9. Python利用A*算法解决八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. OpenCV安装 问题总结以及相关注意事项
  2. 【数据库】关系型数据库优化操作
  3. boost::gil模块临界点threshold的测试程序
  4. 使用 RxJs Observable 来避免 Angular 应用中的 Promise 使用
  5. python字典获取关联值_【Python实战12】使用字典关联数据
  6. js验证家庭住址_手摇充电电筒、多功能组合剪刀……官方清单建议上海家庭储备13种应急物资...
  7. PHP笔记-用户登录例子
  8. python清除输出内容_jupyter notebook清除输出方式
  9. MNIST手写数字数据集格式,如何读取MNIST数据集?
  10. Python项目实践:文本词频统计、软文的诗词风
  11. python标签打印工具_NiceLabel Designer 2017条码标签打印软件
  12. 汉堡王 VS 麦当劳营销对战
  13. Vmware虚拟机win10详细安装之典型安装
  14. MySQL数据库【习题训练】②
  15. 1076: 三位数求解
  16. 数据同步项目总结1-数据实时同步的要点
  17. 能预防及治疗癌症?哈佛研发出可侦测基因缺陷的人工智能系统
  18. java实现条形图_java – 使用Apache POI在Excel中创建条形图
  19. 一维卷积处理时间序列
  20. 物联网导论【刘云浩】-笔记总结

热门文章

  1. Evita Full-Medium-Light与SHE差异
  2. marlin2.0 的使用过程记录。skr v1.3
  3. WIN7下使用超级终端
  4. 对抗熵增 耗散结构 个人成长
  5. 《牛奶可乐经济学》---成本效益原则
  6. ix | pandas读取表格后的行列取值改值操作
  7. POJ 1845 【数论】
  8. npm run build 打包爬坑记(2)生产、测试打包
  9. 杰奇python采集器_极速杰奇采集器
  10. 数字化转型的幕后英雄,希捷存储 40 年