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 能振兴 Python的原因分析
Nov 28 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
用python实现k近邻算法的示例代码
Sep 06 Python
对python中的高效迭代器函数详解
Oct 18 Python
详解用Python实现自动化监控远程服务器
May 18 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
python3调用windows dos命令的例子
Aug 14 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
python3下pygame如何实现显示中文
Jan 11 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python 获取字典键值对的实现
Nov 12 Python
python BeautifulSoup库的安装与使用
Dec 17 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笔记之:数据类型与常量的使用分析
2013/05/14 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
JavaScript中实现异步编程模式的4种方法
2014/09/24 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
JavaScript中的&quot;=、==、===&quot;区别讲解
2019/01/22 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Python开发常用的一些开源Package分享
2015/02/14 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
服务行业个人求职的自我评价
2013/12/12 职场文书
美术专业自荐信
2014/07/07 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
家长意见书
2015/06/04 职场文书