python 贪心算法的实现


Posted in Python onSeptember 18, 2020

贪心算法

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

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

基本思路

思想

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止 。

步骤

  1. 遍历初始集合X中的备选元素
  2. 利用贪心策略在X中确定一个元素,并将其加入到可行解S中
  3. 得到可行解S

python 贪心算法的实现

P即为贪心策略,用来选择符合条件的元素。

例子——硬币找零

假设某国硬币面值有1,5,10,25,100元五种面额,若店员为顾客找零时,需要给顾客找零a=36元,求硬币数最少的情况。

python 贪心算法的实现

这里我们的贪心策略为:

先找到最接近a的值,然后对a进行更新,然后进行循环。

代码实现

def shortNum(a):
  coins = [1,5,10,25,100]
  out = []
  coins = coins[::-1]

  for i in coins:
    num = a//i
    out=out+[i,]*num
    a = a-num*i
    if a<=0:
      break
  return out
a = 36
print(shortNum(a))

例子——任务规划

问题描述:

输入为任务集合X= [r1,r2,r3,...,rn],每个任务ri,都对应着一个起始时间ai与结束时间bi

要求输出为最多的相容的任务集。

python 贪心算法的实现

 如上图,r1与r2相容,r3与r1和r2都不相容。

那么这里的贪心策略我们可以设为:

  1. 先将结束时间最短的任务加入到S中,
  2. 再从剩下的任务的任务中选择结束时间最短的,且判断与S集合中的任务是否相容
  3. 若不相容,则换下一个时间最短的任务,并进行比较
  4. 循环,直至X为空。

代码实现

# 任务规划
from collections import OrderedDict
task = OrderedDict()
task['r1'] = [0,4]
task['r2'] = [5,8]
task['r3'] = [10,13]
task['r4'] = [15,18]
task['r5'] = [7,11]
task['r6'] = [2,6]
task['r7'] = [2,6]
task['r8'] = [2,6]
task['r9'] = [12,16]
task['r10'] = [12,16]
task['r11'] = [12,16]
task['r12'] = [0,3]


listTask = list(task.items())
# 根据bi进行排序,结束时间早的在前面(冒泡排序)
for i in range(len(listTask)-1):
  for j in range(len(listTask)-i-1):
    if listTask[j][1][1] > listTask[j+1][1][1]:
      listTask[j],listTask[j+1]=listTask[j+1],listTask[j]
print(listTask)
out = []
out.append(listTask.pop(0))
def isValid(temp,out):
  for k in range(len(out)):
    if temp[1][0]<out[k][1][1]:
      # 相交
      return False
  return True

for j in range(len(listTask)):
  temp = listTask.pop(0)
  # 判断是否相交
  #   相交则continue
  #   不相交则out.append(temp)
  for k in range(len(out)):
    if isValid(temp,out):
      out.append(temp)
    # else:continue 语句可以不写
    else:
      continue
print(out)

以上就是python 贪心算法的实现的详细内容,更多关于python 贪心算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
Python生成随机数组的方法小结
Apr 15 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
Python多线程扫描端口代码示例
Feb 09 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 Python
详解KMP算法以及python如何实现
Sep 18 #Python
python实现二分查找算法
Sep 18 #Python
Python自定义sorted排序实现方法详解
Sep 18 #Python
python爬虫爬取网页数据并解析数据
Sep 18 #Python
Python实现迪杰斯特拉算法过程解析
Sep 18 #Python
Python 操作 MySQL数据库
Sep 18 #Python
python实现人工蜂群算法
Sep 18 #Python
You might like
PHP 高手之路(一)
2006/10/09 PHP
简单采集了yahoo的一些数据
2007/02/14 PHP
php 移除数组重复元素的一点说明
2008/11/27 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
一个收集图片的bookmarlet(js 刷新页面中的图片)
2010/05/27 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
vue给组件传递不同的值方法
2018/09/29 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
Python松散正则表达式用法分析
2016/04/29 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
工伤死亡理赔协议书
2014/10/20 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript