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实现2014火车票查询代码分享
Jan 10 Python
详解 Python 读写XML文件的实例
Aug 02 Python
numpy排序与集合运算用法示例
Dec 15 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
python绘制分布折线图的示例
Sep 24 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 Python
python xlwt模块的使用解析
Apr 13 Python
基于tensorflow权重文件的解读
May 26 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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
晶体管来复再生式二管收音机
2021/03/02 无线电
PHP中文汉字验证码
2007/04/08 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
php开发环境配置记录
2011/01/14 PHP
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Django中的Model操作表的实现
2018/07/24 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
两年的个人工作自我评价
2014/01/10 职场文书
好邻里事迹材料
2014/01/16 职场文书
审计主管岗位职责
2014/01/31 职场文书
人力资源总监工作说明
2014/03/03 职场文书
2014年党建工作总结
2014/11/11 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
网络管理员岗位职责
2015/02/12 职场文书
出国留学英文自荐信
2015/03/25 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers