日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

项目中要使用到动态规划该怎么应用,怎么说?

發(fā)布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 项目中要使用到动态规划该怎么应用,怎么说? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

因為前一段接了個項目,所以呢,其實(shí)在前一段時間我就有寫過關(guān)于動態(tài)規(guī)劃的一篇文章——淺談一下這個所謂的特殊算法——動態(tài)規(guī)劃!鏈接如下:

https://blog.csdn.net/qq_41946557/article/details/104704964

但是在項目的講述中,如果我要使用到它,我怎么講述?忽的這樣一想,好像對其算法好像并沒有自己想的那個隨意。所以再來說到說到這個動態(tài)規(guī)劃!

我們在一些搜索引擎上搜索——基于動態(tài)規(guī)劃時,你會發(fā)現(xiàn)關(guān)于使用動態(tài)規(guī)劃的領(lǐng)域,可謂是各行各業(yè)。比如:基于動態(tài)規(guī)劃的資源分配問題,基于動態(tài)規(guī)劃的路徑規(guī)劃方法等等等。其實(shí)早在最初的淺談動態(tài)規(guī)劃中,我就提出過DP實(shí)際意義上說是一個方法,并非一個算法!!

下面我先主要針對于動態(tài)編程進(jìn)行一定的解釋說明:

維基百科的意思大致是:動態(tài)編程既是數(shù)學(xué)優(yōu)化方法又是計算機(jī)編程方法。該方法是由理查德·貝爾曼(Richard Bellman)在1950年代開發(fā)的,并且已在從航空工程到經(jīng)濟(jì)學(xué)的許多領(lǐng)域中得到應(yīng)用。在這兩種情況下,它都是指通過以遞歸方式將其分解為更簡單的子問題來簡化一個復(fù)雜的問題。盡管無法以這種方式解決某些決策問題,但是跨越多個時間點(diǎn)的決策通常會遞歸拆分。同樣,在計算機(jī)科學(xué)中,如果可以通過將問題分解為子問題然后遞歸地找到子問題的最優(yōu)解來最佳地解決問題,則可以說它具有最優(yōu)子結(jié)構(gòu)。

動態(tài)編程的介紹

動態(tài)編程是解決優(yōu)化問題的最強(qiáng)大的設(shè)計技術(shù)。

分而治之算法將問題劃分為不相交的子問題,然后遞歸地解決子問題,然后結(jié)合其解決方案來解決原始問題。

當(dāng)子問題不是獨(dú)立的時,例如當(dāng)它們共享相同的子問題時,使用動態(tài)編程。在這種情況下,分治法可能會做比必要的更多的工作,因為它可以多次解決同一個子問題。

動態(tài)編程僅解決每個子問題一次,并將結(jié)果存儲在表中,以便在需要時可以重復(fù)檢索它。

動態(tài)編程是一種**自下而上的方法-**我們解決所有可能的小問題,然后結(jié)合以獲得更大問題的解決方案。

動態(tài)規(guī)劃是一種算法設(shè)計的范式,其中,通過實(shí)現(xiàn)子問題解決方案以及出現(xiàn)“ 最優(yōu)原理 ” 的組合來解決優(yōu)化問題。

動態(tài)編程的特點(diǎn)

當(dāng)問題具有以下特征時,動態(tài)編程將起作用:

  • **最優(yōu)子結(jié)構(gòu):**如果最優(yōu)解決方案包含最優(yōu)子解決方案,那么問題將表現(xiàn)出最優(yōu)子結(jié)構(gòu)。
  • **子問題重疊:**當(dāng)遞歸算法將重復(fù)訪問相同的子問題時,則問題將具有子問題重疊。

如果問題具有最佳子結(jié)構(gòu),則可以遞歸定義最佳解決方案。如果問題有重疊的子問題,那么我們可以通過僅計算每個子問題一次來改進(jìn)遞歸實(shí)現(xiàn)。

如果問題沒有最佳子結(jié)構(gòu),則沒有基礎(chǔ)來定義遞歸算法以找到最佳解決方案。如果一個問題沒有重疊的子問題,那么使用動態(tài)編程就無濟(jì)于事。

如果子問題的空間足夠大(即輸入大小為多項式),則動態(tài)編程比遞歸更有效。

動態(tài)編程的要素

基本上,三個要素是動態(tài)編程算法的特征:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-SWAX3nC3-1584971186276)(https://static.javatpoint.com/tutorial/daa/images/elements-of-dynamic-programming.png)]

  • **子結(jié)構(gòu):**將給定問題分解為較小的子問題。用較小問題的解決方案來表達(dá)原始問題的解決方案。
  • **表結(jié)構(gòu):**解決了子問題后,將結(jié)果存儲到表中的子問題中。這樣做是因為子問題解決方案已被多次重用,并且我們不想一遍又一遍地重復(fù)解決相同的問題。
  • **自下而上的計算:**使用表格,將較小的子問題的解決方案組合起來以解決較大的子問題,并最終得出解決問題的解決方案。
  • 注意:自下而上是指:-

  • 從最小的子問題開始。
  • 結(jié)合他們的解決方案,可以解決規(guī)模越來越大的子問題。
  • 直到解決原始問題為止。
  • 動態(tài)編程的組成部分

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Lzi92vLo-1584971186276)(https://static.javatpoint.com/tutorial/daa/images/components-of-dynamic-programming.png)]

  • **階段:**問題可以分為幾個子問題,稱為子階段。階段是給定問題的一小部分。例如,在最短路徑問題中,它們是由圖的結(jié)構(gòu)定義的。
  • 狀態(tài)**:**每個階段都有幾個與之相關(guān)的狀態(tài)。最短路徑問題的狀態(tài)是到達(dá)的節(jié)點(diǎn)。
  • **決策:**在每個階段,可以有多個選擇,應(yīng)從中做出最好的決定之一。在每個階段做出的決定都應(yīng)該是最佳的;這稱為階段決策。
  • **最優(yōu)政策:**這是一個決定每個階段決策的規(guī)則;如果策略是全局最優(yōu)的,則稱為最優(yōu)策略。這就是最佳貝爾曼原理。
  • 給定當(dāng)前狀態(tài),其余每個狀態(tài)的最佳選擇均不取決于先前的狀態(tài)或決策。在最短路徑問題中,沒有必要僅知道我們?nèi)绾潍@得節(jié)點(diǎn)。
  • 鑒于已經(jīng)解決了階段j + 1,存在一種遞歸關(guān)系,該關(guān)系確定階段j的最佳決策。
  • 最后階段必須自己解決。
  • 動態(tài)規(guī)劃算法的發(fā)展

    它可以分為四個步驟:

  • 表征最佳解決方案的結(jié)構(gòu)。
  • 遞歸定義最佳解決方案的值。像“分而治之”一樣,將問題遞歸分為兩個或多個最佳部分。這有助于確定解決方案的外觀。
  • 從下至上計算最佳解決方案的值(從最小的子問題開始)
  • 從較小的子問題的計算值構(gòu)造整個問題的最佳解決方案。
  • 動態(tài)編程的應(yīng)用

  • 0/1背包問題
  • 數(shù)學(xué)優(yōu)化問題
  • 所有對最短路徑問題
  • 可靠性設(shè)計問題
  • 最長公共子序列(LCS)
  • 飛行控制和機(jī)器人控制
  • 分時:它計劃作業(yè)以最大化CPU使用率
  • 簡單舉一個動態(tài)編程的例子

    太少寫算法的東西,所以這里以斐波那契做一個例子。后面舉幾個其他的例子,自行演示吧

    斐波那契數(shù)是以下整數(shù)序列中的數(shù)字。

    0,1,1,2,3,5,8,13,21,34,55,89,144,…

    用數(shù)學(xué)術(shù)語來說,斐波納契數(shù)的序列Fn由遞歸關(guān)系定義

    F n = F n-1 + F n-2

    具有種子值

    F 0 = 0和F 1 = 1。

    給定數(shù)字n,打印第n個斐波那契數(shù)。
    例子:

    輸入:n = 2 輸出1輸入:n = 9 輸出:34

    方法1(使用遞歸)

    一種簡單的方法,它是上面給出的直接遞歸實(shí)現(xiàn)數(shù)學(xué)遞歸關(guān)系。

    //Fibonacci Series using Recursion class fibonacci { static int fib(int n) { if (n <= 1) return n; return fib(n-1) + fib(n-2); } public static void main (String args[]) { int n = 9; System.out.println(fib(n)); } } /* This code is contributed by Rajat Mishra */

    輸出量

    34

    時間復(fù)雜度: T(n)= T(n-1)+ T(n-2)是指數(shù)的。
    我們可以觀察到該實(shí)現(xiàn)做了很多重復(fù)的工作(請參見下面的遞歸樹)。因此,對于第n個斐波那契數(shù),這是一個錯誤的實(shí)現(xiàn)。

    fib(5) / \ fib(4)fib(3) / \ / \ fib(3)fib(2)fib(2)fib(1)/ \ / \ / \ fib(2)fib(1)fib( 1)fib(0)fib(1)fib(0)/ \ fib(1)fib(0)

    *額外空間:*如果考慮函數(shù)調(diào)用堆棧的大小,則為O(n),否則為O(1)。

    方法2(使用動態(tài)編程)
    通過存儲到目前為止計算出的斐波那契數(shù),我們可以避免方法1的重復(fù)工作。

    // Fibonacci Series using Dynamic Programming class fibonacci { static int fib(int n) { /* Declare an array to store Fibonacci numbers. */int f[] = new int[n+2]; // 1 extra to handle case, n = 0 int i; /* 0th and 1st number of the series are 0 and 1*/f[0] = 0; f[1] = 1; for (i = 2; i <= n; i++) { /* Add the previous 2 numbers in the series and store it */f[i] = f[i-1] + f[i-2]; } return f[n]; } public static void main (String args[]) { int n = 9; System.out.println(fib(n)); } } /* This code is contributed by Rajat Mishra */

    當(dāng)然這只是使用動態(tài)規(guī)劃進(jìn)行的優(yōu)化,具體優(yōu)化還有比如優(yōu)化空間、使用矩陣等方式。

    其他高深的關(guān)于動態(tài)規(guī)劃的算法自行百度吧。或者關(guān)注一下,等我下次有空專門來一篇。哈哈

    其實(shí)根據(jù)上述的例子,你或許就有了一些想法和思路,沒錯在整體的數(shù)據(jù)分析中,比如最近開展的智慧交通,我們難免在大量的數(shù)據(jù)中分析各種TopN,那么每次的查詢我們都要進(jìn)行重新的在大量的數(shù)據(jù)中進(jìn)行去取TopN嗎?我們能不能使用一個動態(tài)規(guī)劃對程序進(jìn)行優(yōu)化,對每次的TopN進(jìn)行存儲,避免每次的重復(fù)工作。當(dāng)然不僅僅限于TopN的問題。在編程和計算中均可以進(jìn)行應(yīng)用,這也是目前我覺得最簡單的引用DP的方式。至于其他的后續(xù)再聊了。

    我有一壺酒,足以慰風(fēng)塵。感覺對你有點(diǎn)幫助的話,給個關(guān)注唄!或者點(diǎn)個贊再走嘍!

    參考資料:https://www.javatpoint.com/dynamic-programming-introduction

    總結(jié)

    以上是生活随笔為你收集整理的项目中要使用到动态规划该怎么应用,怎么说?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。