0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于贪心算法详解

新机器视觉 来源:CSDN 作者:一叶执念 2022-04-07 09:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


															

顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。

如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

基本思路:

1. 建立数学模型来描述问题。

⒉.把求解的问题分成若干个子问题。

⒊.对每一子问题求解,得到子问题的局部最优解。

⒋.把子问题的解局部最优解合成原来解问题的一个解。

实现该算法的过程:

⒈.从问题的某一初始解出发;

2. while 能朝给定总目标前进一步 do

3.求出可行解的一个解元素;

4.由所有解元素组合成问题的一个可行解。从问题的某一初始解出发

背包问题

有一个背包,最多能承载150斤的重量,现在有7个物品,重量分别为[35, 30, 60, 50, 40, 10, 25],它们的价值分别为[10, 40, 30, 50, 35, 40, 30],应该如何选择才能使得我们的背包背走最多价值的物品?

把物品一个个的往包里装,要求装入包中的物品总价值最大,要让总价值最大,就可以想到怎么放一个个的物品才能让总的价值最大,因此可以想到如下三种选择物品的方法,即可能的局部最优解:

1:每次都选择价值最高的往包里放。

2:每次都选择重量最小的往包里放。

3:每次都选择单位重量价值最高的往包里放。

4:选择价值最高的,按照制订的规则(价值)进行计算,顺序是:4 2 6 5 。

最终的总重量是:130;最终的总价值是:165。

2:选择重量最小的,按照制订的规则(重量)进行计算,顺序是:6 7 2 1 5 。

最终的总重量是:140;最终的总价值是:155。可以看到,重量优先是没有价值优先的策略更好。

3:选择单位密度价值最大的,按照制订的规则(单位密度)进行计算,顺序是:6 2 7 4 1。

最终的总重量是:150;最终的总价值是:170。

可以看到,单位密度这个策略比之前的价值策略和重量策略都要好。

单源最大路径问题

给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其它各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。

Dijkstra算法是解单源最短路径问题的贪心算法。

其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。

初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。

Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。

例如,对下图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下表中。

018a7ffe-b606-11ec-aa7f-dac502259ad0.png

Dijkstra算法的迭代过程:

01a2dcd4-b606-11ec-aa7f-dac502259ad0.png

算法的正确性和计算复杂性

(1)贪心选择性质

(2)最优子结构性质

(3)计算复杂性

对于具有n个顶点和e条边的带权有向图,如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体需要O(n)时间。这个循环需要执行n-1次,所以完成循环需要O(n)时间。算法的其余部分所需要时间不超过O(n^2)。

代码实现(来自于第四个参考链接):

#include #include #include using namespace std ;
class BBShortestDijkstra{public:  BBShortestDijkstra (const vector<vector<int> >& vnGraph)     :m_cnMaxInt (numeric_limits<int>::max())   {    m_vnGraph = vnGraph ;    m_stCount = vnGraph.size () ;    m_vnDist.resize (m_stCount) ;    for (size_t i = 0; i < m_stCount; ++ i) {      m_vnDist[i].resize (m_stCount) ;    }  }    void doDijkatra (){    int nMinIndex = 0 ;    int nMinValue = m_cnMaxInt ;    vector<bool> vbFlag (m_stCount, false) ;    for (size_t i = 0; i < m_stCount; ++ i) {      m_vnDist[0][i] = m_vnGraph[0][i] ;      if (nMinValue > m_vnGraph[0][i]) {        nMinValue = m_vnGraph[0][i] ;        nMinIndex = i ;      }    }
    vbFlag[0] = true ;    size_t k = 1 ;    while (k < m_stCount) {      vbFlag[nMinIndex] = true ;      for (size_t j = 0; j < m_stCount ; ++ j) {        // 没有被选择        if (!vbFlag[j] && m_vnGraph[nMinIndex][j] != m_cnMaxInt ) {          if (m_vnGraph[nMinIndex][j] + nMinValue            < m_vnDist[k-1][j]) {            m_vnDist[k][j] = m_vnGraph[nMinIndex][j] + nMinValue ;          }          else {            m_vnDist[k][j] = m_vnDist[k-1][j] ;          }        }        else {          m_vnDist[k][j] = m_vnDist[k-1][j] ;        }      }      nMinValue = m_cnMaxInt ;      for (size_t j = 0; j < m_stCount; ++ j) {        if (!vbFlag[j] && (nMinValue > m_vnDist[k][j])) {          nMinValue = m_vnDist[k][j] ;          nMinIndex = j ;        }      }      ++ k ;    }
    for (int i = 0; i < m_stCount; ++ i) {      for (int j = 0; j < m_stCount; ++ j) {        if (m_vnDist[i][j] == m_cnMaxInt) {          cout << "maxint " ;        }        else {          cout << m_vnDist[i][j] << " " ;        }      }      cout << endl ;    }  }private:   vector<vector<int> >  m_vnGraph ;  vector<vector<int> >  m_vnDist ;  size_t m_stCount ;  const int m_cnMaxInt ;} ;
int main(){  const int cnCount = 5 ;  vector<vector<int> > vnGraph (cnCount) ;  for (int i = 0; i < cnCount; ++ i) {    vnGraph[i].resize (cnCount, numeric_limits<int>::max()) ;  }  vnGraph[0][1] = 10 ;  vnGraph[0][3] = 30 ;  vnGraph[0][4] = 100 ;  vnGraph[1][2] = 50 ;  vnGraph[2][4] = 10 ;  vnGraph[3][2] = 20 ;  vnGraph[3][4] = 60 ;
  BBShortestDijkstra bbs (vnGraph) ;  bbs.doDijkatra () ;}

贪心算法三个核心问题

第一个问题:为什么不直接求全局最优解?

1.原问题复杂度过高;

2.求全局最优解的数学模型难以建立;

3.求全局最优解的计算量过大;

4.没有太大必要一定要求出全局最优解,“比较优”就可以。

第二个问题:如何把原问题分解成子问题?

1、按串行任务分

时间串行的任务,按子任务来分解,即每一步都是在前一步的基础上再选择当前的最优解。

2、按规模递减分

规模较大的复杂问题,可以借助递归思想(见第2课),分解成一个规模小一点点的问题,循环解决,当最后一步的求解完成后就得到了所谓的“全局最优解”。

3、按并行任务分

这种问题的任务不分先后,可能是并行的,可以分别求解后,再按一定的规则(比如某种配比公式)将其组合后得到最终解。

第三个问题:如何知道贪心算法结果逼近了全局最优值?

这个问题是不能量化判断的,正是因为全局最优值不能够知道,所以才求的局部最优值。追求过程需要考虑以下几个问题:

1.成本

耗费多少资源,花掉多少编程时间。

2.速度

计算量是否过大,计算速度能否满足要求。

3.价值

得到了最优解与次优解是否真的有那么大的差别,还是说差别可以忽略。

审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4803

    浏览量

    98521
  • 模型
    +关注

    关注

    1

    文章

    3816

    浏览量

    52265
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74370

原文标题:贪心算法详解

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    端子电流循环寿命试验机核心算法解析:温升预测模型与寿命衰减曲线拟合

    端子电流循环寿命试验机的核心算法,是实现端子寿命精准预测、测试过程智能管控的关键,其中温升预测模型与寿命衰减曲线拟合两大核心算法,分别解决了测试过程中的温度动态调控与寿命趋势研判问题,共同构建起科学
    的头像 发表于 04-02 09:21 153次阅读
    端子电流循环寿命试验机核<b class='flag-5'>心算法</b>解析:温升预测模型与寿命衰减曲线拟合

    【硬核拆解】别被“吹膜”标签骗了!深扒海纳张力变频器的全场景控制算法

    自适应惯量辨识,深度解析海纳如何凭借一套核心算法,通吃锂电、印刷、纺织等全场景卷绕控制。 一、引言:是“专用机”还是“通用平台”? 很多工程师在选型时,看到海纳在吹膜机上的高占有率,便下意识认为它只适合塑料薄膜行业。
    的头像 发表于 03-25 10:22 128次阅读

    深入浅出GMSSL:掌握SM2、SM3、SM4国密算法的高效实践

    将带你从零开始,深入理解这三大核心算法在GMSSL中的高效使用方式,帮助你在实际项目中快速落地国密安全方案。 本文将以通信定位二合一系列Air780EGH核心板为例,带你快速上手GMSSL国密算法SM2、SM3、SM4相关示例。 一、SM2:椭圆曲线公钥密码
    的头像 发表于 12-12 18:20 881次阅读
    深入浅出GMSSL:掌握SM2、SM3、SM4国密<b class='flag-5'>算法</b>的高效实践

    蓝牙信标、UWB等主流室内定位无线技术的参数对比、核心算法和选型指南详解(二)

    本文系统解析室内定位无线技术,涵盖蓝牙、Wi-Fi、UWB、RFID、超声波、可见光等主流技术的原理、参数对比与核心算法(RSSI、TDOA、AoA),并提供按精度、成本、场景匹配的选型指南,助力民用、工业、资产盘点及特殊环境下的最优技术选择。
    的头像 发表于 12-12 16:28 1924次阅读
    蓝牙信标、UWB等主流室内定位无线技术的参数对比、核<b class='flag-5'>心算法</b>和选型指南<b class='flag-5'>详解</b>(二)

    芯片专家精准赋能:超声切割技术迎来核心算法突破新契机

    算法与硬件平台的协同挑战在技术对接过程中,固特超声技术总监坦言面临的三大技术难题:"虽然我们已构建基于DSP或FPGA的全数字控制平台,实现了超声电源系统的数字
    的头像 发表于 11-11 18:18 930次阅读
    芯片专家精准赋能:超声切割技术迎来核<b class='flag-5'>心算法</b>突破新契机

    SM4算法实现分享(一)算法原理

    SM4分组加密算法采用的是非线性迭代结构,以字为单位进行加密、解密运算,每次迭代称为一轮变换,每轮变换包括S盒变换、非线性变换、线性变换、合成变换。加解密算法与密钥扩展都是采用32轮非线性迭代结构
    发表于 10-30 08:10

    Camellia算法的实现二(基于开源蜂鸟E203协处理器)

    115200波特率向FPGA发送数据或密钥数据,UART_RX模块接收到数据后,进行串并转换,并将转换后的数据传给Camellia的核心算法模块进行处理。经过处理后的数据,并进行并串转换后,通过UART_TX
    发表于 10-30 06:35

    商品价格动态调整接口技术详解

    ​  在电商或零售系统中,商品价格需根据市场动态(如供需变化、竞争环境)实时调整,以最大化利润和竞争力。本文将从接口设计、核心算法、实现代码到优化策略,逐步解析如何构建一个高效的“商品价格动态调整
    的头像 发表于 10-13 15:49 526次阅读
    商品价格动态调整接口技术<b class='flag-5'>详解</b>

    数据滤波算法的具体实现步骤是怎样的?

    (高频电磁、瞬时脉冲等),选择适配的滤波算法并落地。以下以电能质量监测中最常用的 IIR 低通滤波(抗高频干扰)、滑动平均滤波(抗瞬时脉冲)、卡尔曼滤波(抗动态波动) 为例,详解具体实现步骤: 一、前置准备:明确滤波目标与硬件基
    的头像 发表于 10-10 16:45 1000次阅读

    液态金属电阻率测试仪的核心算法与信号处理技术

    液态金属电阻率测试仪之所以能在科研与工业领域精准捕捉液态金属的电学特性,背后离不开核心算法与信号处理技术的协同支撑。这两大技术如同测试仪的“智慧大脑” 与 “敏锐感官”,前者负责将原始测量数据转化
    的头像 发表于 09-01 09:21 739次阅读
    液态金属电阻率测试仪的核<b class='flag-5'>心算法</b>与信号处理技术

    DFT算法与FFT算法的优劣分析

    一概述 在谐波分析仪中,我们常常提到的两个词语,就是DFT算法与FFT算法,那么一款功率分析仪/谐波分析仪采用DFT算法或者FFT算法,用户往往关注的是能否达到所要分析谐波次数的目的,
    的头像 发表于 08-04 09:30 1763次阅读

    三坐标测量机路径规划与补偿技术:核心算法解析

    三坐标测量的微米级精度背后,是精密的路径规划算法与实时补偿技术在保驾护航。三坐标测量机的智能避撞算法保障了测量的安全与高效;温度补偿技术消除了环境的无形干扰;点云智能处理则让海量数据蜕变为精准的工程
    的头像 发表于 08-01 14:15 1796次阅读
    三坐标测量机路径规划与补偿技术:核<b class='flag-5'>心算法</b>解析

    shimetapi:开源RGB+EVS视觉融合相机事件相机工具链与算法

    的接口控制和算法处理。 一、shimetapi_Hybrid_vision_algo (算法层 SDK) 定位: 这是 SDK 的核心算法处理层,位于架构的中间层(黄色部分)。 核心功能: 专注于处理来自
    的头像 发表于 06-26 13:52 836次阅读

    SVPWM的原理及法则推导和控制算法详解

    小,使得电机转矩脉动降低,旋转磁场更逼近圆形,而且使直流母线电压的利用率有了很大提高,且更易于实现数字化。下面将对该算法进行详细分析阐述。 1.1 SVPWM 基本原理 SVPWM 的理论基础
    发表于 06-16 17:11

    SSH常用命令详解

    SSH常用命令详解
    的头像 发表于 06-04 11:30 2181次阅读