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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
跟老齐学Python之编写类之二方法
Oct 11 Python
python中解析json格式文件的方法示例
May 03 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
利用python 读写csv文件
Sep 10 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
Python selenium的这三种等待方式一定要会!
Jun 10 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生成短网址的3种方法代码实例
2014/07/08 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
Python中用max()方法求最大值的介绍
2015/05/15 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
深入理解python多进程编程
2016/06/12 Python
python3安装speech语音模块的方法
2018/12/24 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
python实现猜数游戏
2020/03/27 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
殡葬服务心得体会
2014/09/11 职场文书
运动会入场词
2015/07/18 职场文书
合理化建议书范文
2015/09/14 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
Python装饰器详细介绍
2022/03/25 Python