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读取安卓手机的屏幕分辨率方法
Mar 31 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
Python处理session的方法整理
Aug 29 Python
Python 日志logging模块用法简单示例
Oct 18 Python
python颜色随机生成器的实例代码
Jan 10 Python
Python tornado上传文件的功能
Mar 26 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
详解python tkinter 图片插入问题
Sep 03 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 Python
Python学习之异常中的finally使用详解
Mar 16 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
php在线打包程序源码
2008/07/27 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
JavaScript中输出标签的方法
2014/08/27 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
毕业生应聘求职信
2014/07/10 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
会议简讯范文
2015/07/20 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
2016年情人节广告语
2016/01/28 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
解析目标检测之IoU
2021/06/26 Python
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技