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模块学习 datetime介绍
Aug 27 Python
Python多线程实例教程
Sep 06 Python
Python决策树分类算法学习
Dec 22 Python
浅析python继承与多重继承
Sep 13 Python
python 获取键盘输入,同时有超时的功能示例
Nov 13 Python
将python文件打包成EXE应用程序的方法
May 22 Python
python安装scipy的方法步骤
Jun 26 Python
python挖矿算力测试程序详解
Jul 03 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
利用Python发送邮件或发带附件的邮件
Nov 12 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
PHP中常用的转义函数
2014/02/28 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
php把数组值转换成键的方法
2015/07/13 PHP
PHP操作mysql数据库分表的方法
2016/06/09 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
JavaScript国旗变换效果代码
2008/08/13 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
表演方阵解说词
2014/02/08 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
市政管理求职信范文
2014/05/07 职场文书
关于责任的演讲稿
2014/05/20 职场文书
工作检讨书大全
2015/01/26 职场文书
给学校的建议书400字
2015/09/14 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫