在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    4622

    瀏覽量

    93057
  • 模型
    +關注

    關注

    1

    文章

    3267

    瀏覽量

    48924
  • 代碼
    +關注

    關注

    30

    文章

    4802

    瀏覽量

    68743

原文標題:貪心算法詳解

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求LabVIEW程序代做,關于噪聲測量方面,需要matlab與labview混合編程,涉及優化算法、PID控制等,可帶價聯系

    求LabVIEW程序代做,關于噪聲測量方面,需要matlab與labview混合編程,涉及優化算法、PID控制等,可帶價聯系QQ2789223947
    發表于 12-11 17:27

    詳解MySQL多實例部署

    詳解MySQL多實例部署
    的頭像 發表于 11-11 11:10 ?279次閱讀

    詳解kubectl常用命令

    詳解kubectl常用命令
    的頭像 發表于 11-05 15:39 ?276次閱讀
    <b class='flag-5'>詳解</b>kubectl常用命令

    常用的ADC濾波算法有哪些

    ADC(模數轉換器)濾波算法在信號處理中起著至關重要的作用,它們能夠幫助我們提取出有用的信號,同時濾除噪聲和干擾。以下是常用的ADC濾波算法詳解,這些算法各具特色,適用于不同的應用場景
    的頭像 發表于 10-08 14:35 ?427次閱讀

    PRU開發詳解

    電子發燒友網站提供《PRU開發詳解.pdf》資料免費下載
    發表于 09-05 11:27 ?0次下載
    PRU開發<b class='flag-5'>詳解</b>

    深度學習的基本原理與核心算法

    處理、語音識別等領域取得了革命性的突破。本文將詳細闡述深度學習的原理、核心算法以及實現方式,并通過一個具體的代碼實例進行說明。
    的頭像 發表于 07-04 11:44 ?2215次閱讀

    神經網絡反向傳播算法的優缺點有哪些

    是一種模擬人腦神經元網絡的計算模型,具有強大的非線性映射能力和泛化能力。反向傳播算法是訓練神經網絡的核心算法,通過梯度下降法優化網絡權重,使網絡輸出盡可能接近目標值。然而,反向傳播算法也存在一些局限性和問題,需要在實際應用中加以
    的頭像 發表于 07-03 11:24 ?1086次閱讀

    機器學習算法原理詳解

    機器學習作為人工智能的一個重要分支,其目標是通過讓計算機自動從數據中學習并改進其性能,而無需進行明確的編程。本文將深入解讀幾種常見的機器學習算法原理,包括線性回歸、邏輯回歸、支持向量機(SVM)、決策樹和K近鄰(KNN)算法,探討它們的理論基礎、
    的頭像 發表于 07-02 11:25 ?1136次閱讀

    BLDC電機控制算法詳解

    算法。本文將詳細介紹BLDC電機的控制算法,包括電速算法、電流環控制算法、磁場導向控制算法等,并探討其原理、特點和應用。
    的頭像 發表于 06-14 10:49 ?1126次閱讀

    AI智算中心算力服務商探索智造完成A輪融資

    近日,領先的AI智算中心算力服務商探索智造宣布成功完成A輪融資。本輪融資由無錫云林產業發展投資基金領投,旨在為公司提供強大的資金支持,助力其業務的進一步拓展和升級。
    的頭像 發表于 05-30 09:33 ?445次閱讀

    機器學習六大核心算法深度解析

    算法歷程:線性回歸是一種古老的統計方法,它試圖找到最佳擬合數據的直線或超平面,最早可以追溯到19世紀初的高斯最小二乘法理論。
    發表于 04-23 16:25 ?1869次閱讀
    機器學習六大核<b class='flag-5'>心算法</b>深度解析

    VC++串口通信詳解

    電子發燒友網站提供《VC++串口通信詳解.doc》資料免費下載
    發表于 03-24 09:36 ?0次下載

    陀螺儀芯片+傳感器定制

    本人想開發一套摔倒瞬間的觸發系統,目前缺主程序核心算法。有懂的大神求指教
    發表于 03-21 10:36

    詳解pcb粗糙度測量,分享測量技巧

    詳解pcb粗糙度測量,分享測量技巧
    的頭像 發表于 03-12 11:28 ?1313次閱讀

    DCDC原理詳解

    電子發燒友網站提供《DCDC原理詳解.pptx》資料免費下載
    發表于 03-05 17:18 ?97次下載
    主站蜘蛛池模板: 午夜色视频在线观看| 四虎在线观看一区二区| 8844aa在线毛片| h在线观看免费| 久久亚洲精品成人综合| 农村妇女野外一级毛片| 五月婷婷婷婷婷| 添人人躁日日躁夜夜躁夜夜揉| 26uuu影院亚洲欧美综合| avbobo官网在线入口| 日本在线观看一区| 在线免费观看视频你懂的| 亚洲a影院| 怡红院最新网址| 男女刺激性视频大片| 粗又长好猛好爽| 天堂资源在线播放| 青草99| 三级不卡| 老色批| 免费一级大毛片a一观看不卡| 日韩三级在线免费观看| 免费看一级大片| 藏经阁在线| 成年人一级片| 射久久| 国产h在线观看| 亚洲4区| 一色屋免费视频| 日本欧美色图| 国产成人一区二区三中文| 丁香六月婷婷在线| 天天操天天摸天天射| 天天爽天天干天天操| 天天挨操| 免费人成网ww777kkk手机| 69xxx日本| 午夜三级国产精品理论三级| 免费色视频网站| 午夜欧美精品久久久久久久| 天天操天天摸天天碰|