常用的設計方法有哪些
本文已影響7.27K人
本文已影響7.27K人
常用的設計方法有哪些,每一種算法設計方法都有自己的優點,使用也不同的場合,因此在學習的時候還是需要全部都融會貫通,下面小編帶大家簡單瞭解一下常用的設計方法有哪些。
常用的設計方法有哪些1
一、迭代法
迭代法是用於求方程或方程組近似根的一種常用的算法設計方法。
二、窮舉搜索法
窮舉搜索法是對可能是解的衆多候選解按某種順序進行逐一枚舉和檢驗,並從衆找出那些符合要求的候選解作爲問題的解。
三、遞推法
遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。
四、遞歸
採用遞歸描述的算法通常有這樣的特徵:爲求解規模爲N的問題,設法將它分解成規模較小的問題,然後從這些小問題的解方便地構造出大問題的解,並且這些規模較小的問題也能採用同樣的分解和綜合方法,分解成規模更小的問題,並從這些更小問題的解構造出規模較大問題的解。特別地,當規模N=1時,能直接得解。
五、回溯法
回溯法也稱爲試探法,該方法首先暫時放棄關於問題規模大小的限制,並將問題的候選解按某種順序逐一枚舉和檢驗。
回溯法的實質是在包含問題的所有解的解空間樹中,按照深度優先的策略,從根節點出發搜索解空間樹。若進入某子節點的子樹後沒有找到解(或者需要找出全部解),則需要從子節點回退(回溯)至父節點,從而可以選擇其他子節點進行搜索。回溯法有“通用的解題法”之稱,用它可以系統地搜索一個問題的所有解或任一解。
六、貪婪法
貪婪法是一種不追求最優解,只希望得到較爲滿意解的方法。貪婪法一般可以快速得到滿意的解,因爲它省去了爲找最優解要窮盡所有可能而必須耗費的大量時間。貪婪法常以當前情況爲基礎作最優選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。
七、分治法
1、分治法的基本思想
任何一個可以用計算機求解的問題所需的計算時間都與其規模N有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。
分治法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
如果規模爲n的問題可分解成k個子問題,1<k≤n,這些子問題互相獨立且與原問題相同。
如:
斐波那契(Fibonacci)數列可以遞歸地定義爲:
2、分治法的適用條件
分治法所能解決的問題一般具有以下幾個特徵:
(1)該問題的規模縮小到一定的程度就可以容易地解決;
(2)該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質;
(3)利用該問題分解出的子問題的解可以合併爲該問題的解;
(4)該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。
3、分治法的基本步驟
分治法在每一層遞歸上都有三個步驟:
(1)分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題;
(2)解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題;
(3)合併:將各個子問題的解合併爲原問題的解。
八、動態規劃法
爲了節約重複求相同子問題的時間,引入一個數組,不管它們是否對最終解有用,把所有子問題的解存於該數組中,這就是動態規劃法所採用的基本方法。
動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。
與分治法不同的是,適合於用動態規劃法求解的問題,經分解得到的子問題往往不是獨立的。若用分治法來解這類問題,則相同的子問題會被求解多次,以至於最後解決原問題需要耗費指數級時間。動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解,每個解都對應於一個值,我們希望找到具有最優值(最大值或最小值)的那個解。
常用的設計方法有哪些2
一、【分治法】
在計算機科學中,分治法是一種很重要的算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效算法的基礎,如排序算法(快速排序,歸併排序),傅立葉變換(快速傅立葉變換)……等。任何一個可以用計算機求解的問題所需的計算時間都與其規模有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。例如,對於n個元素的排序問題,當n=1時,不需任何計算。n=2時,只要作一次比較即可排好序。n=3時只要作3次比較即可,…。而當n較大時,問題就不那麼容易處理了。要想直接解決一個規模較大的問題,有時是相當困難的。
分治法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
分治策略是:對於一個規模爲n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,否則將其分解爲k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞歸地解這些子問題,然後將各子問題的解合併得到原問題的解。這種算法設計策略叫做分治法。
如果原問題可分割成k(1<k≤n)個子問題, 且這些子問題都可解並可利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。由分治法產生的子問題往往是原問題的較小模式,這就爲使用"遞歸技術"提供了方便。在這種情況下,反覆應用分治手段,可以使子問題與原問題類型一致而其規模卻不斷縮小,最終使子問題縮小到很容易直接求出其解,這自然導致遞歸過程的產生。"分治"與"遞歸"像一對孿生兄弟,經常同時應用在算法設計之中,並由此產生許多高效算法。
分治法的複雜性分析
一個分治法將規模爲n的問題分成k個規模爲n/m的子問題去解。設分解閥值n0=1,且adhoc解規模爲1的問題耗費1個單位時間。再設將原問題分解爲k個子問題以及用merge將k個子問題的解合併爲原問題的解需用f(n)個單位時間。用T(n)表示該分治法解規模爲|P|=n的問題所需的計算時間,則有:
通過迭代法求得方程的解:
遞歸方程及其解只給出n等於m的方冪時T(n)的值,但是如果認爲T(n)足夠平滑,那麼由n等於m的方冪時T(n)的值可以估計T(n)的增長速度。通常假定T(n)是單調上升的,從而當mi≤n<mi+1時,T(mi)≤T(n)<T(mi+1)。
二、【動態規劃法】
最優化原理
1951年美國數學家R.Bellman等人,根據一類多階段問題的特點,把“多階段決策”問題變換爲一系列互相聯繫的“單階段問題”,然後逐個加以解決。而且一些靜態模型,只要人爲地引進“時間”因素,分成時段,就可以轉化成多階段的動態模型,用動態規劃方法去處理。與此同時,他提出瞭解決這類問題的“最優化原理”(Principle of optimality):“一個過程的最優決策具有這樣的性質:即無論其初始狀態和初始決策如何,其今後諸策略對以第一個決策所形成的狀態作爲初始狀態的過程而言,必須構成最優策略”。簡言之,一個最優策略的子策略,對於它的初態和終態而言也必是最優的。這個“最優化原理”如果用數學化一點的語言來描述的話,就是:假設爲了解決某一優化問題,需要依次作出n個決策D1,D2,…,Dn,如若這個決策序列是最優的,對於任何一個整數k,1 < k < n,不論前面k個決策是怎樣的,以後的最優決策只取決於由前面決策所確定的當前狀態,即以後的決策Dk+1,Dk+2,…,Dn也是最優的。
最優化原理是動態規劃的基礎,任何一個問題,如果失去了這個最優化原理的支持,就不可能用動態規劃方法計算。能採用動態規劃求解的問題都需要滿足一定的條件:
(1) 問題中的狀態必須滿足最優化原理;
(2) 問題中的狀態必須滿足無後效性。
所謂的無後效性是指:“下一時刻的狀態只與當前狀態有關,而和當前狀態之前的狀態無關,當前的狀態是對以往決策的總結”。
問題求解模式
動態規劃所處理的問題是一個多階段決策問題,一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了一個決策序列,同時確定了完成整個過程的一條活動路線(通常是求最優的活動路線)。如圖所示。動態規劃的設計都有着一定的模式,一般要經歷以下幾個步驟。
初始狀態→│決策1│→│決策2│→…→│決策n│→結束狀態
圖1 動態規劃決策過程示意圖
(1)劃分階段:按照問題的時間或空間特徵,把問題分爲若干個階段。在劃分階段時,注意劃分後的階段一定要是有序的或者是可排序的,否則問題就無法求解。
(2)確定狀態和狀態變量:將問題發展到各個階段時所處於的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無後效性。
(3)確定決策並寫出狀態轉移方程:因爲決策和狀態轉移有着天然的聯繫,狀態轉移就是根據上一階段的狀態和決策來導出本階段的狀態。所以如果確定了決策,狀態轉移方程也就可寫出。但事實上常常是反過來做,根據相鄰兩段各狀態之間的關係來確定決策。
(4)尋找邊界條件:給出的狀態轉移方程是一個遞推式,需要一個遞推的終止條件或邊界條件。
動態規劃法的應用:1、動態規劃求0/1揹包問題 2、最長公共子串問題的實現 3、用動態規劃實現導彈攔截 4、最大化投資回報問題的實現
算法實現
動態規劃的主要難點在於理論上的設計,也就是上面4個步驟的確定,一旦設計完成,實現部分就會非常簡單。使用動態規劃求解問題,最重要的就是確定動態規劃三要素:問題的階段,每個階段的狀態以及從前一個階段轉化到後一個階段之間的遞推關係。遞推關係必須是從次小的問題開始到較大的問題之間的轉化,從這個角度來說,動態規劃往往可以用遞歸程序來實現,不過因爲遞推可以充分利用前面保存的子問題的解來減少重複計算,所以對於大規模問題來說,有遞歸不可比擬的優勢,這也是動態規劃算法的核心之處。確定了動態規劃的這三要素,整個求解過程就可以用一個最優決策表來描述,最優決策表是一個二維表,其中行表示決策的階段,列表示問題狀態,表格需要填寫的數據一般對應此問題的在某個階段某個狀態下的最優值(如最短路徑,最長公共子序列,最大價值等),填表的過程就是根據遞推關係,從1行1列開始,以行或者列優先的順序,依次填寫表格,最後根據整個表格的數據通過簡單的取捨或者運算求得問題的最優解。下面分別以求解最大化投資回報問題和最長公共子序列問題爲例闡述用動態規劃算法求解問題的`一般思路。
三、【貪心算法】
所謂貪心算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。心算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
貪心算法的基本思路如下:
1、建立數學模型來描述問題。
2、把求解的問題分成若干個子問題。
3、對每一子問題求解,得到子問題的局部最優解。
4、把子問題的解局部最優解合成原來解問題的一個解。
實現該算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步 do
求出可行解的一個解元素;
由所有解元素組合成問題的一個可行解;
下面是一個可以使用貪心算法解的題目,貪心解的確不錯,可惜不是最優解:
例題分析:
[揹包問題]有一個揹包,揹包容量是M=150。有7個物品,物品可以分割成任意大小。
要求儘可能讓裝入揹包中的物品總價值最大,但不能超過總容量。
物品: A B C D E F G
重量: 35 30 60 50 40 10 25
價值: 10 40 30 50 35 40 30
分析:
目標函數: ∑pi最大
約束條件是裝入的物品總重量不超過揹包容量:∑wi<=M( M=150)
(1)根據貪心的策略,每次挑選價值最大的物品裝入揹包,得到的結果是否最優?
(2)每次挑選所佔重量最小的物品裝入是否能得到最優解?
(3)每次選取單位重量價值最大的物品,成爲解本題的策略。
值得注意的是,貪心算法並不是完全不可以使用,貪心策略一旦經過證明成立後,它就是一種高效的算法。貪心算法還是很常見的算法之一,這是由於它簡單易行,構造貪心策略不是很困難。可惜的是,它需要證明後才能真正運用到題目的算法中。
一般來說,貪心算法的證明圍繞着:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。
對於例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下:
(1)貪心策略:選取價值最大者。反例:
W=30
物品:A B C
重量:28 12 12
價值:30 20 20
根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。
(2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。
(3)貪心策略:選取單位重量價值最大的物品。反例:
W=30
物品:A B C
重量:28 20 10
價值:28 20 10
根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。
貪心算法應用:1、最小生成樹之Prim算法 2、最小生成樹之kruskal算法
3、貪心算法在揹包中的應用 4、汽車加油問題之貪心算法
四、【回溯法】
回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術爲回溯法,而滿足回溯條件的某個狀態的點稱爲“回溯點”。
1、回溯法的一般描述
可用回溯法求解的問題P,通常要能表達爲:對於已知的由n元組(x1,x2,…,xn)組成的一個狀態空間E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},給定關於n元組中的一個分量的一個約束集D,要求E中滿足D的全部約束條件的所有n元組。其中Si是分量xi的定義域,且 |Si| 有限,i=1,2,…,n。我們稱E中滿足D的全部約束條件的任一n元組爲問題P的一個解。
解問題P的最樸素的方法就是枚舉法,即對E中的所有n元組逐一地檢測其是否滿足D的全部約束,若滿足,則爲問題P的一個解。但顯然,其計算量是相當大的。
我們發現,對於許多問題,所給定的約束集D具有完備性,即i元組(x1,x2,…,xi)滿足D中僅涉及到x1,x2,…,xi的所有約束意味着j(jj。因此,對於約束集D具有完備性的問題P,一旦檢測斷定某個j元組(x1,x2,…,xj)違反D中僅涉及x1,x2,…,xj的一個約束,就可以肯定,以(x1,x2,…,xj)爲前綴的任何n元組(x1,x2,…,xj,xj+1,…,xn)都不會是問題P的解,因而就不必去搜索它們、檢測它們。回溯法正是針對這類問題,利用這類問題的上述性質而提出來的比枚舉法效率更高的算法。
回溯法首先將問題P的n元組的狀態空間E表示成一棵高爲n的帶權有序樹T,把在E中求問題P的所有解轉化爲在T中搜索問題P的所有解。樹T類似於檢索樹,它可以這樣構造:設Si中的元素可排成xi(1) ,xi(2) ,…,xi(mi-1) ,|Si| =mi,i=1,2,…,n。從根開始,讓T的第I層的每一個結點都有mi個兒子。這mi個兒子到它們的雙親的邊,按從左到右的次序,分別帶權xi+1(1) ,xi+1(2) ,…,xi+1(mi) ,i=0,1,2,…,n-1。照這種構造方式,E中的一個n元組(x1,x2,…,xn)對應於T中的一個葉子結點,T的根到這個葉子結點的路徑上依次的n條邊的權分別爲x1,x2,…,xn,反之亦然。另外,對於任意的0≤i≤n-1,E中n元組(x1,x2,…,xn)的一個前綴I元組(x1,x2,…,xi)對應於T中的一個非葉子結點,T的根到這個非葉子結點的路徑上依次的I條邊的權分別爲x1,x2,…,xi,反之亦然。特別,E中的任意一個n元組的空前綴(),對應於T的根。
因而,在E中尋找問題P的一個解等價於在T中搜索一個葉子結點,要求從T的根到該葉子結點的路徑上依次的n條邊相應帶的n個權x1,x2,…,xn滿足約束集D的全部約束。在T中搜索所要求的葉子結點,很自然的一種方式是從根出發,按深度優先的策略逐步深入,即依次搜索滿足約束條件的前綴1元組(x1i)、前綴2元組(x1,x2)、…,前綴I元組(x1,x2,…,xi),…,直到i=n爲止。
在回溯法中,上述引入的樹被稱爲問題P的狀態空間樹;樹T上任意一個結點被稱爲問題P的狀態結點;樹T上的任意一個葉子結點被稱爲問題P的一個解狀態結點;樹T上滿足約束集D的全部約束的任意一個葉子結點被稱爲問題P的一個回答狀態結點,它對應於問題P的一個解、
用回溯法解題的一般步驟:
(1)針對所給問題,定義問題的解空間;
(2)確定易於搜索的解空間結構;
(3)以深度優先方式搜索解空間,並在搜索過程中用剪枝函數避免無效搜索。
回溯法應用:
1、回溯法之數的劃分
2、回溯法求解 運動員最佳配對問題
3、回溯法解決汽車加油次數最少問題
4、用回溯法找出n個自然數中取r個數的全排列
五、【分支限界法】
基本思想 :分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜索問題的解空間樹。
在分支限界法中,每一個活結點只有一次機會成爲擴展結點。活結點一旦成爲擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優解的兒子結點被捨棄,其餘兒子結點被加入活結點表中。 此後,從活結點表中取下一結點成爲當前擴展結點,並重覆上述結點擴展過程。這個過程一直持續到找到所需的解或活結點表爲空時爲止。
常見的兩種分支限界法:
(1)隊列式(FIFO)分支限界法
按照隊列先進先出(FIFO)原則選取下一個節點爲擴展節點。
(2)優先隊列式分支限界法
按照優先隊列中規定的優先級選取優先級最高的節點成爲當前擴展節點。
分支限界法與回溯法的不同:
(1)求解目標:回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優解。
(2)搜索方式的不同:回溯法以深度優先的方式搜索解空間樹,而分支限界法則以廣度優先或以最小耗費優先的方式搜索解空間樹。
解空間樹的動態搜索
(1)回溯求解0/1揹包問題,雖剪枝減少了搜索空間,但整個搜索按深度優先機械進行,是盲目搜索(不可預測本結點以下的結點進行的如何)。
(2)回溯求解TSP也是盲目的(雖有目標函數,也只有找到一個可行解後纔有意義)
(3)分支限界法首先確定一個合理的限界函數,並根據限界函數確定目標函數的界[down, up];然後按照廣度優先策略遍歷問題的解空間樹,在某一分支上,依次搜索該結點的所有孩子結點,分別估算這些孩子結點的目標函數的可能取值(對最小化問題,估算結點的down,對最大化問題,估算結點的up)。如果某孩子結點的目標函數值超出目標函數的界,則將其丟棄(從此結點生成的解不會比目前已得的更好),否則入待處理表。
分支限界法的設計思路
設求解最大化問題,解向量爲X=(x1,…,xn),xi的取值範圍爲Si,|Si|=ri。在使用分支限界搜索問題的解空間樹時,先根據限界函數估算目標函數的界[down, up],然後從根結點出發,擴展根結點的r1個孩子結點,從而構成分量x1的r1種可能的取值方式。
對這r1個孩子結點分別估算可能的目標函數bound(x1),其含義:以該結點爲根的子樹所有可能的取值不大於bound(x1),即:
bound(x1)≥bound(x1,x2)≥…≥ bound(x1,…,xn)
若某孩子結點的目標函數值超出目標函數的下界,則將該孩子結點丟棄;否則,將該孩子結點保存在待處理結點表PT中。
再取PT表中目標函數極大值結點作爲擴展的根結點,重複上述。
直到一個葉子結點時的可行解X=(x1,…,xn),及目標函數值bound(x1,…,xn)。
分支限界法應用:
1、分支限界法之裝載問題
2、分支限界法之佈線問題
3、分支限界法之0 1揹包問題
4、分支限界法之旅行售貨員問題
廣告設計常用創意方法有哪些 廣告設計常用創意方法有什麼
日常瘦腿方法有哪些
控制情緒的常見方法有哪些
常見的說明方法有哪些
常見的教學方法有哪些
體育鍛煉常用的方法有哪幾種
常見的錯誤洗臉方法有哪些
常見避孕方法有哪些
工作設計的重要方法有
日常美白的方法有哪些
日常皮膚美白的方法有哪些
常見的攝影構圖方法有哪些
日常淡斑的方法有哪些
常見的決策方法有哪些
櫥櫃設計的技巧有哪些
妊娠咳嗽的常用食療方有哪些
日常美白方法有哪些
室內設計裝修風格介紹 家居設計有哪些風格
常見的胎教方法有哪些
日常體育鍛煉的方法有哪些
女性減肥常見的方法有哪些
設計大門時要注意哪些方面
楊桃的日常保存方法有哪些
小衆設計師品牌有哪些?小衆設計師品牌推薦
男士常用的祛痘方法有哪些
日常祛斑美白的方法有哪些
日常護膚的正確方法有哪些
染髮褪紅色的方法有哪些(這三種方法很實用)
日常生活中男戒的保養方法有哪些
日常收縮毛孔的方法有哪些
日常打理捲髮的方法有哪些
女生最實用的減肥方法有哪些以及需要注意哪些
有哪些日常美白方法