當前位置:首頁 » 操作系統 » 貪心演算法matlab

貪心演算法matlab

發布時間: 2022-11-26 15:05:02

❶ PVOID是什麼數據類型呢,不太明白,請高手指點!!

小胖
回來查查MSDN
這是我從網上搜的

PVIOD 一個普通指針類型等價於(viod *)

還有一些對你有用

win api 編程中的數據類型很多,有沒有人能 具體講講啊?
CALLBACK 在應用程序的回調常式中取代FAR PASCAL
HANDLE 一個32位的無符號整數,用作句柄
HDC 設備描述句柄
HWND 一個32位的無符號整數用作窗口句柄
LONG 一個32位的帶符號整數
LPARAM 用於聲明lParam的類型
LPCSTR 與LPSTR類似,但用於只讀字元串指針
LPSTR 一個32位的指針
LPVIOD 一個普通指針類型等價於(viod *)
LRESULT 子窗口過程的返回值
NULL 一個整型的0值,常常用於激活函數的預設動作和參數
UINT 一種無符號的整數類型,其大小取決於主機環境;在NT下是32位
WCHAR 一種16位的UNICODE字元,用於表示世界上所有語言的符號。
WINAPI 在API的定義中取代FAR PASCAL
WPARAM 關於wParam的聲明

❷ 高分求修改或者化簡一個matlab code,最好是熟悉英文的

1、首先,你上傳的文件不全,至少缺Sample_Data3.xls。至於還有沒有其他問題現在還不好說。

2、你只是泛泛地說「修改或者化簡」,有什麼具體要求?比如說,加一個多餘的空格也算是修改?

==================================================

上面的內容回答於2014-02-04 10:20,經樓主補充後簡單說明如下:

我看了一下,這個問題可以算是一類特殊的旅行商問題(TSP)。題目並未要求得到最優解,只要求滿意解即可。現有代碼的思路是,總尋找最近的bolt然後送到同類型最近的hole,應該屬於貪心演算法( Greedy algorithm),總體上是可行的(雖然得到的解未必最優)。

樓主要求修改代碼,那麼修改的標準是什麼?

改動可大可小,改動大的話,可以重新設計路徑規劃演算法(那樣工作量會大很多),例如採用窮舉法得到最優解(需枚舉6!*3!*3!=25920種可能,規模不算大,可以接受);而改動小的話,可以只對現有代碼進行微調(例如修正小BUG,改變輸出信息的方式)。請把要求明確一些。

另外,如果有補充說明或存在疑問,建議樓主採用追問的方式。

順便上一幅圖,把初始時刻bolt、hole以及機械臂的位置展示一下。

❸ 優化演算法筆記(十八)灰狼演算法

(以下描述,均不是學術用語,僅供大家快樂的閱讀)
灰狼演算法(Grey Wolf Algorithm)是受灰狼群體捕獵行為啟發而提出的演算法。演算法提出於2013年,仍是一個較新的演算法。目前為止(2020)與之相關的論文也比較多,但多為演算法的應用,應該仍有研究和改進的餘地。
灰狼演算法中,每隻灰狼的位置代表了解空間中的一個可行解。群體中,占據最好位置的三隻灰狼為狼王及其左右護法(衛)。在捕獵過程中這三隻狼將帶領著狼群蛇皮走位,抓捕獵物,直至找到獵物(最優解)。當然狼王不會一直是狼王,左右護法也是一樣,每一輪走位後,會根據位置的優劣重新選出新的狼王和左右護法。狼群中的每一隻灰狼會向著(也可能背向)這三隻位置最優的灰狼移動一定的距離,來決定這一步自己將如何走位。簡單來說, 灰狼個體會向則群體中最優的三個個體移動

很明顯該演算法的主角就是灰狼了。

設定目標灰狼為
,當前灰狼的為 ,則該灰狼向著目標灰狼移動後的位置 可以由一下公式計算得出:

灰狼群體中位置最好的三隻灰狼編號為1,2,3,那麼當前的灰狼i通過觀察灰狼1、灰狼2和灰狼3,根據公式(1)得出的三個位置為Xi1,Xi2,Xi3。那麼灰狼i將要移動到的位置可以根據以下供述計算得出:

可以看出該灰狼的目標位置是通過觀察三隻頭狼得到的三個目標位置的所圍成的區域的質心。(質心超出邊界時,取值為邊界值)。

灰狼演算法的論文描述很多,但是其公式和流程都非常簡單,主要對其參數A和C的作用效果進行了詳細描述。
C主要決定了新位置相對於目標灰狼的方位,而A則決定新位置向目標靠近還是遠離目標灰狼。當|A|>=1時,為遠離目標,表現出更強的全局搜索能力,|A|<1時靠近目標,表現出更強的局部搜索能力。

適應度函數 。
實驗一:

看看這圖像和結果,效果好極了。每當我這么認為時,總會出現意想不到的轉折。
修改一下最優解位置試一試, 。
實驗二 : 。

其結果比上面的實驗差了不少,但我覺得這才是一個優化演算法應有的搜索圖像。其結果看上去較差只是因為迭代次數較少,收斂不夠迅速,這既是優點也是缺點,收斂慢但是搜索更細致。
仔細分析灰狼演算法的流程,它並沒有向原點靠近的趨勢,那隻能理解為演算法群體總體上向著群體的中心移動。 猜想 :當初始化群體的中心恰好是正解時,演算法的結果將會非常的好。
下面使用 ,並將灰狼的初始位置限定在(50,100)的范圍內,看看實驗圖像是否和實驗二的圖像一致。

實驗三 . ,初始種群取值范圍為(50,100)

這圖像和結果跟實驗一的不是一樣的嗎?這說明從實驗二中得出的猜想是錯誤的。

從圖像和結果上看,都和實驗二非常相似,當解在解空間的中心時但不在原點時,演算法的結果將差一些。
為什麼會這樣呢?從演算法的流程上看,灰狼演算法的各個行為都是關於頭狼對稱的,當最優解在原點且頭狼在附近時,公式(1)將變為如下:

實驗五 . ,三隻頭狼添加貪心演算法。

從圖像可以看出中心的三個點移動的頻率要比其他點的移動頻率低。從結果上可以看出其結果相對穩定了不少,不過差距非常的小,幾乎可以認為是運氣好所導致。如果所有的個體都添加貪心演算法呢?顯然,演算法的全局搜索能力將進一步減弱,並且更容易向群體中心收斂,這並不是一個好的操作。

實驗六 . ,
在實驗五的基礎上為狼群添加一個統一的步長,即每隻狼每次向著目標狼移動的距離不能大於其步長,將其最大步長設為1,看看效果。

從圖像可以看出,受到步長的約束每隻狼的移動距離較小,在結束時還沒有收斂,其搜索能力較強但收斂速度過慢且極易陷入局部最優。現在將最大步長設置為10(1/10解空間范圍)使其搜索能力和收斂速度相對平衡,在看看效果。

從圖像可以看出,演算法的收斂速度快了不少,但從結果可知,相較於實驗五,演算法的提升並不太大。
不過這個圖像有一種似曾相識的感覺,與螢火蟲演算法(FireFly Algorithm)差不多,仔細對比這兩個演算法可以發現, 灰狼演算法相當於螢火蟲演算法的一個簡化 。實驗六種對灰狼演算法添加步長的修改,讓其離螢火蟲演算法更近了一步。

實驗七 . ,
在實驗六的基礎上讓最大步長隨著迭代次數增加遞減。

從實驗七的圖像可以看出,種群的收斂速度好像快了那麼一點,結果也變好了不少。但是和改進後的螢火蟲演算法相比仍然有一定的差距。
灰狼演算法在全局搜索和局部搜索上的平衡已經比較好了,嘗試過對其進行改進,但是修改使搜索能力更強時,對於局部最優的函數求解效果很差,反之結果的精度較低,總體而言修改後的演算法與原演算法相差無幾。

灰狼演算法是根據灰狼群體的捕獵行動而提出的優化演算法,其演算法流程和步驟非常簡單,數學模型也非常的優美。灰狼演算法由於沒有貪心演算法,使得其有著較強的全局搜索能力同時參數A也控制了演算法的局部搜索范圍,演算法的全局搜索能力和局部搜索能力比較平衡。
從演算法的優化圖像可以看出,灰狼演算法和螢火蟲演算法非常的相似。可以認為,灰狼演算法是對螢火蟲演算法的一種改進。螢火蟲演算法向著由於自己的個體飛行,而灰狼演算法則的條件更為苛刻,向著群體前三強前進,螢火蟲演算法通過步長控制搜索范圍,而灰狼演算法則直接定義搜索范圍參數A,並令A線性遞減。
灰狼演算法的結構簡單,但也不容易改進,數次改進後只是改變了全局搜索能力和局部搜索能力的比例,綜合能力並沒有太大變化。
由於原點對於灰狼演算法有著隱隱的吸引力,當測試函數目標值在原點時,其結果會異常的好。因此,灰狼演算法的實際效果沒有論文中的那麼好,但也不差,算是一個中規中矩的優化演算法。
參考文獻
Mirjalili S , Mirjalili S M , Lewis A . Grey Wolf Optimizer[J]. Advances in Engineering Software, 2014, 69:46-61. 提取碼:wpff

以下指標純屬個人yy,僅供參考

目錄
上一篇 優化演算法筆記(十七)萬有引力演算法
下一篇 優化演算法筆記(十九)頭腦風暴演算法

優化演算法matlab實現(十八)灰狼演算法matlab實現

❹ 霍夫曼編程採用的是哪種編程原理

霍夫曼編碼的matlab實現一、實驗內容:用Matlab語言編程實現霍夫曼(Huffman)編碼。二、實驗原理及編碼步驟:霍夫曼(Huffman)編碼演算法是滿足前綴條件的平均二進制碼長最短的編-源輸出符號,而將較短的編碼碼字分配給較大概率的信源輸出。演算法是:在信源符號集合中,首先將兩個最小概率的信源輸出合並為新的輸出,其概率是兩個相應輸出符號概率之和。這一過程重復下去,直到只剩下一個合並輸出為止,這個最後的合並輸出符號的概率為1。這樣就得到了一張樹圖,從樹根開始,將編碼符號1和0分配在同一節點的任意兩分支上,這一分配過程重復直到樹葉。從樹根到樹葉途經支路上的編碼最後就構成了一組異前置碼,就是霍夫曼編碼輸出。

❺ ACM進階指南

大一上學期:
必學:
1.C語言基礎語法必須全部學會
a)推薦「語言入門」分類20道題以上
b)提前完成C語言課程設計
2.簡單數學題(推薦「數學」分類20道以上)
需要掌握以下基本演算法:
a)歐幾里德演算法求最大公約數
b)篩法求素數
c)康托展開
d)逆康托展開
e)同餘定理
f)次方求模
3.計算幾何初步
a)三角形面積
b)三點順序
4.學會簡單計算程序的時間復雜度與空間復雜度
5.二分查找法
6.簡單的排序演算法
a)冒泡排序法
b)插入排序法
7.貪心演算法經典題目
8.高等數學
以下為選修:
9.學會使用簡單的DOS命令(較重要)
a)color/dir//shutdown/mkdir(md)/rmdir(rd)/attrib/cd/
b)知道什麼是絕對路徑與相對路徑
c)學會使用C語言調用DOS命令
d)學會在命令提示符下調用你自己用C語言編寫的程序,並使用命令行參數給自己的程序傳參(比如自己製作一個file.exe實現與命令基本功能一致的功能)
e)學會編寫bat批處理文件
10.學會Windows系統的一些小知識,如設置隱藏文件,autoRun.inf的設置等。
11.學會編輯注冊表(包括使用注冊表編輯器regedit和使用DOS命令編輯注冊表)
12.學會使用組策略管理器管理(gpedit.msc)組策略。
大一下學期:
1.掌握C++部分語法,如引用類型,函數重載等,基本明白什麼是類。
2.學會BFS與DFS
a)迷宮求解(最少步數)
b)水池數目(NYOJ27)
c)圖像有用區域(NYOJ92)
d)樹的前序中序後序遍歷
3.動態規劃(15題以上),要學會使用循環的方法寫動態規劃,同時也要學會使用記憶化搜索的方法。
a)最大子串和
b)最長公共子序列
c)最長單調遞增子序列(O(n)與O(n log n)演算法都需要掌握)
d)01背包
e)RMQ演算法
4.學會分析與計算復雜程序的時間復雜度
5.學會使用棧與隊列等線性存儲結構
6.學會分治策略
7.排序演算法
a)歸並排序
b)快速排序
c)計數排序
8.數論
a)擴展歐幾里德演算法
b)求逆元
c)同餘方程
d)中國剩餘定理
9.博弈論
a)博弈問題與SG函數的定義
b)多個博弈問題SG值的合並
10.圖論:
a)圖的鄰接矩陣與鄰接表兩種常見存儲方式
b)歐拉路的判定
c)單最短路bellman-ford演算法dijkstra演算法。
d)最小生成樹的kruskal演算法與prim演算法。
11.學會使用C語言進行網路編程與多線程編程
12.高等數學
13.線性代數
a)明確線性代數的重要性,首先是課本必須學好
b)編寫一個Matrix類,進行矩陣的各種操作,並求編寫程序解線性方程組。
c)推薦做一兩道「矩陣運算」分類下的題目。
以下為選修,隨便選一兩個學學即可:
14.(較重要)使用C語言或C++編寫簡單程序來調用一些簡單的windows API,或者在linux下進行linux系統調用,其目的是明白什麼是API(應用程序介面)。
15.網頁設計
a)學習靜態網頁技術(html+css+javascript)
b)較具有藝術細胞的可以試試Photoshop
c)php或其它動態網頁技術
16.學習matlab,如果想參加數學建模大賽的話,需要學這個軟體。
大一假期(如果留校集訓)
1.掌握C++語法,並熟練使用STL
2.試著實現STL的一些基本容器和函數,使自己基本能看懂STL源碼
3.圖論
a)使用優先隊列優化Dijkstra和Prim
b)單源最短路徑之SPFA
c)差分約束系統
d)多源多點最短路徑之FloydWarshall演算法
e)求歐拉路(圈套圈演算法)
4.進行復雜模擬題訓練
5.拓撲排序
6.動態規劃進階
a)完全背包、多重背包等各種背包問題(參見背包九講)
b)POJ上完成一定數目的動態規劃題目
c)狀態壓縮動態規劃
d)樹形動態規劃
7.搜索
a)回溯法熟練應用
b)復雜的搜索題目練習
c)雙向廣度優先搜索
d)啟發式搜索(包括A*演算法,如八數碼問題)
8.計算幾何
a)判斷點是否在線段上
b)判斷線段相交
c)判斷矩形是否包含點
d)判斷圓與矩形關系
e)判斷點是否在多邊形內
f)判斷點到線段的最近點
g)計算兩個圓的公切線
h)求矩形的並的面積
i)求多邊形面積
j)求多邊形重心
k)求凸包
選修
9.可以學習一種C++的開發框架來編寫一些窗體程序玩玩(如MFC,Qt等)。
10.學習使用C或C++連接資料庫
大二一整年:
1.數據結構
a)單調隊列
b)堆
c)並查集
d)樹狀數組
e)哈希表
f)線段樹
g)字典樹
2.圖論
a)強連通分量
b)雙連通分量(求割點,橋)
c)強連通分量與雙連通分量縮點
d)LCA、LCA與RMQ的轉化
e)二分圖匹配
i.二分圖最大匹配
ii.最小點集覆蓋
iii.最小路徑覆蓋
iv.二分圖最優匹配
v.二分圖多重匹配
f)網路流
i.最大流的基本SAP
ii.最大流的ISAP或者Dinic等高效演算法(任一)
iii.最小費用最大流
iv.最大流最小割定理
3.動態規劃多做題提高(10道難題以上)
4.數論
a)積性函數的應用
b)歐拉定理
c)費馬小定理
d)威樂遜定理
5.組合數學
a)群論基礎
b)Polya定理與計數問題
c)Catalan數
6.計算幾何
a)各種旋轉卡殼相關演算法
b)三維計算幾何演算法
7.理解資料庫原理,學會SQL語句
8.學好計算機組成原理
9.學習Transact-SQL語言,學會使用觸發器,存儲過程,學會資料庫事務等。
10.圖論二
a)網路流的各種構圖訓練(重要)
b)最小割與最小點權覆蓋等的關系(詳見《最小割模型在信息學競賽中的應用》一文)
c)次小生成樹
d)第k短路
e)最小比率生成樹
11.線性規劃
12.動態規劃更高級進階
13.KMP演算法
14.AC自動機理論與實現
15.博弈論之Alpha-beta剪枝

❻ 貪心演算法中的matlab演算法怎麼做

1.數論演算法
求兩數的最大公約數
function gcd(a,b:integer):integer;
begin
if b=0 then gcd:=a
else gcd:=gcd (b,a mod b);
end ;

求兩數的最小公倍數
function lcm(a,b:integer):integer;
begin
if a< b then swap(a,b);
lcm:=a;
while lcm mod b >0 do inc(lcm,a);
end;

素數的求法
A.小范圍內判斷一個數是否為質數:
function prime (n: integer): Boolean;
var I: integer;
begin
for I:=2 to trunc(sqrt(n)) do
if n mod I=0 then
begin
prime:=false; exit;
end;
prime:=true;
end;

B.判斷longint范圍內的數是否為素數(包含求50000以內的素數表):
procere getprime;
var
i,j:longint;
p:array[1..50000] of boolean;
begin
fillchar(p,sizeof(p),true);
p[1]:=false;
i:=2;
while i< 50000 do
begin
if p then
begin
j:=i*2;
while j< 50000 do
begin
p[j]:=false;
inc(j,i);
end;
end;
inc(i);
end;
l:=0;
for i:=1 to 50000 do
if p then
begin
inc(l);
pr[l]:=i;
end;
end;{getprime}
function prime(x:longint):integer;
var i:integer;
begin
prime:=false;
for i:=1 to l do
if pr >=x then break
else if x mod pr=0 then exit;
prime:=true;
end;{prime}

2.

3.

4.求最小生成樹
A.Prim演算法:
procere prim(v0:integer);
var
lowcost,closest:array[1..maxn] of integer;
i,j,k,min:integer;
begin
for i:=1 to n do
begin
lowcost:=cost[v0,i];
closest:=v0;
end;
for i:=1 to n-1 do
begin
{尋找離生成樹最近的未加入頂點k}
min:=maxlongint;
for j:=1 to n do
if (lowcost[j]< min) and (lowcost[j]< >0) then
begin
min:=lowcost[j];
k:=j;
end;
lowcost[k]:=0; {將頂點k加入生成樹}
{生成樹中增加一條新的邊k到closest[k]}
{修正各點的lowcost和closest值}
for j:=1 to n do
if cost[k,j]< lwocost[j] then
begin
lowcost[j]:=cost[k,j];
closest[j]:=k;
end;
end;
end;{prim}
B.Kruskal演算法:(貪心)
按權值遞增順序刪去圖中的邊,若不形成迴路則將此邊加入最小生成樹。
function find(v:integer):integer; {返回頂點v所在的集合}
var i:integer;
begin
i:=1;
while (i< =n) and (not v in vset) do inc(i);
if i< =n then find:=i
else find:=0;
end;
procere kruskal;
var
tot,i,j:integer;
begin
for i:=1 to n do vset:=;{初始化定義n個集合,第I個集合包含一個元素I}
p:=n-1; q:=1; tot:=0; {p為尚待加入的邊數,q為邊集指針}
sort;
{對所有邊按權值遞增排序,存於e[I]中,e[I].v1與e[I].v2為邊I所連接的兩個頂點的序號,e[I].len為第I條邊的長度}
while p >0 do
begin
i:=find(e[q].v1);j:=find(e[q].v2);
if i< >j then
begin
inc(tot,e[q].len);
vset:=vset+vset[j];vset[j]:=[];
dec(p);
end;
inc(q);
end;
writeln(tot);
end;

5.最短路徑
A.標號法求解單源點最短路徑:
var
a:array[1..maxn,1..maxn] of integer;
b:array[1..maxn] of integer; {b指頂點i到源點的最短路徑}
mark:array[1..maxn] of boolean;

procere bhf;
var
best,best_j:integer;
begin
fillchar(mark,sizeof(mark),false);
mark[1]:=true; b[1]:=0;{1為源點}
repeat
best:=0;
for i:=1 to n do
If mark then {對每一個已計算出最短路徑的點}
for j:=1 to n do
if (not mark[j]) and (a[i,j] >0) then
if (best=0) or (b+a[i,j]< best) then
begin
best:=b+a[i,j]; best_j:=j;
end;
if best >0 then
begin
b[best_j]:=best;mark[best_j]:=true;
end;
until best=0;
end;{bhf}

B.Floyed演算法求解所有頂點對之間的最短路徑:
procere floyed;
begin
for I:=1 to n do
for j:=1 to n do
if a[I,j] >0 then p[I,j]:=I else p[I,j]:=0;
{p[I,j]表示I到j的最短路徑上j的前驅結點}
for k:=1 to n do {枚舉中間結點}
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[j,k]< a[i,j] then
begin
a[i,j]:=a[i,k]+a[k,j];
p[I,j]:=p[k,j];
end;
end;
C. Dijkstra 演算法:
類似標號法,本質為貪心演算法。
var
a:array[1..maxn,1..maxn] of integer;
b,pre:array[1..maxn] of integer; {pre指最短路徑上I的前驅結點}
mark:array[1..maxn] of boolean;
procere dijkstra(v0:integer);
begin
fillchar(mark,sizeof(mark),false);
for i:=1 to n do
begin
d:=a[v0,i];
if d< >0 then pre:=v0 else pre:=0;
end;
mark[v0]:=true;
repeat {每循環一次加入一個離1集合最近的結點並調整其他結點的參數}
min:=maxint; u:=0; {u記錄離1集合最近的結點}
for i:=1 to n do
if (not mark) and (d< min) then
begin
u:=i; min:=d;
end;
if u< >0 then
begin
mark:=true;
for i:=1 to n do
if (not mark) and (a[u,i]+d< d) then
begin
d:=a[u,i]+d;
pre:=u;
end;
end;
until u=0;
end;
D.計算圖的傳遞閉包
Procere Longlink;
Var
T:array[1..maxn,1..maxn] of boolean;
Begin
Fillchar(t,sizeof(t),false);
For k:=1 to n do
For I:=1 to n do
For j:=1 to n do
T[I,j]:=t[I,j] or (t[I,k] and t[k,j]);
End;

❼ 量子遺傳演算法的優勢在哪

優勢都是理論上說比較好 實際上都差不多的 沒有什麼好演算法 真的那麼好的話 就沒有必要研究別的演算法了

❽ 優化演算法筆記(十六)混合蛙跳演算法

(以下描述,均不是學術用語,僅供大家快樂的閱讀)
混合蛙跳演算法(Shuffled Frog Leaping Algorithm)是根據青蛙在石塊上覓食時的種群分布變化而提出的演算法。演算法提出於2003年,時間有點久遠,但相關的論文並不是特別多,仍有較大的研究和改進空間。
混合蛙跳演算法中,每個青蛙的位置代表了一個可行解。青蛙所在的池塘中有數塊石塊,每一代,青蛙們會被分配到石塊上。在這一代中,只有石塊上位置最差的青蛙會跳動。該青蛙首先會向著同一個石塊上的最優位置的青蛙跳動,如果新的位置比原位置差則向則全局最優位置跳動,若該位置仍舊比原位置差則在解空間內隨機跳動一次。可以看出每隻跳動青蛙在每代中至少跳動一次,至多跳動三次,但由於每次跳動的青蛙數量等於石塊數,故當石塊數<青蛙數/3時,每代總跳動次數小於青蛙總數。
(查找文獻追根溯源的時候看到了一個有趣的現象,原始的提出論文提出於2000年(Shuffled frog leaping algorithm:a memetic meta-heuristic for combinatorial optimization.)但是到2006年才出版,而2003年的論文(Optimization of Water Distribution Network Design Using the Shuffled Frog Leaping Algorithm)引用了2000年的原始論文,並標注為出版中。到了2006年出版時,原始論文引用了2003年發表的那篇論文,即這兩篇論文相互引用,真是奇妙。估計是原始論文被拒了後又修改了結果到2006年才發表。)

這次的主角就是青蛙了。(沒有石塊就用荷葉代替吧)。

每一隻青蛙只有兩個屬性:位置,當前位置的適應度值。
池塘中一共有m片荷葉,青蛙總數為n。
每一代中,將所有的青蛙按位置從優到劣排列,並依此放置在m個荷葉上。舉個栗子,有5片荷葉(m1-m5)和21隻青蛙(f1-f21,按適應度值從優到劣排列)。

即m1荷葉上的青蛙有{f1,f6,f11,f16,f21},m2荷葉上的青蛙有{f2,f7,f12,f17},依此類推。
每代中最差的青蛙會首先向著當前荷葉上最優位置的青蛙跳動,即該代中f21會向著f1跳動,f17向著f2跳動,f18向著f3跳動,f19向著f4跳動,f20向著f5跳動。
如果f21、f17、f18、f19、f20這五隻青蛙沒有找到優於自己當前位置的位置,則它們會向著全局最優位置的青蛙f1跳動,如果新的位置仍然差於自己的原位置,則該青蛙跳到一個隨機的位置。

在D維空間內青蛙f1的位置 ,其適應度值為 。

(1)青蛙f17向f2跳動後的新位置為 :

若 優於 則青蛙f17跳到 ,否則跳到(2)。

(2)由於f1在全局最優位置,故在這一步,f17會向f1跳動:

優於 則青蛙f17跳到 ,否則跳到(3)。

(3)f17會跳到解空間內的隨機位置:

若 優於 則青蛙f17跳到 。

可以看出混合蛙跳演算法的流程灰常的簡單,跳動的運算元也非常的簡單,而且每次跳動的青蛙的數量等於荷葉的數量,所有其迭代次數會快於多數其他的優化演算法。
我自己特別喜歡這個優化演算法,總能從中體會出分治的思想。下面我們來看看實驗,看看其效果如何。

適應度函數 。
實驗一:

荷葉數為1的圖像及結果如下:

荷葉數為2的圖像及結果如下:

荷葉數為3的圖像及結果如下:

荷葉數為4的圖像及結果如下:

從上述的四個實驗可以看出,隨著荷葉數的增加,演算法的收斂速度在不斷的加快。同時,隨著荷葉數的增加,每代青蛙跳動的次數也在不斷的增加。荷葉數為1時,每代青蛙總共會跳動1-3次,荷葉數為2時每代青蛙總共跳動2-6次,當荷葉數為10時,每代青蛙會跳動10-30次。由於每片荷葉上至少得有2隻青蛙,所以荷葉數最多為總群數的一半。
演算法的效果比較穩定,但好像沒有體現出其跳出局部最優能力,在種群收斂後其全搜索能力較弱,大多在進行局部搜索。
看了看演算法的結構,其跳出局部最優操作為第三段跳動,而這次跳動仍舊按照貪心演算法跳到優於當前位置的隨機位置。現在我將其增強為:如果進行了第三段跳動(隨機跳動),則無論該位置的好壞,青蛙都將跳到該隨機位置。

實驗二: 永遠接受公式(3)得到的隨機位置

可以看出在種群收斂後,仍然會有一些個體隨機出現在解空間內,並繼續收斂。比較結果可以看出實驗二的結果中的最優值不如實驗一,但是其均值和最差值均優於實驗一,說明對原演算法進行修改後演算法更加穩定,且演算法的性能和全局搜索能力有一定的提升,演算法跳出局部最優能力更強。

混合蛙跳演算法是提出近20年,其實現的方式與分治的思想有異曲同工之處。由於每次都更新的是每片荷葉上的最差位置的青蛙,故群體不容易集中於較小的范圍。同時由於「三段跳」的操作,讓混合蛙跳演算法有了一定的跳出局部最優能力。其全局搜索能力和局部搜索能力應該差不多,當最差的部分青蛙跳走後,次差的部分青蛙則會變成了最差的青蛙,此時群體不會過分集中。當群體相對分散時,為搜索范圍較大的全局搜索,反之為搜索范圍較小的局部搜索,由於收斂速度不算很快,所以進行全局搜索和局部搜索的時間相對均衡。
混合蛙跳演算法的流程非常簡單,幾乎可以說是流程最簡單的優化演算法。其中的運算元也很簡單,優化的能力由種群的結構提供。演算法的文章中比較了 「模因」 「基因」 ,模因類似與思想,其傳播可以在同代中快速傳播,比如音樂,幾分鍾就可以傳播給其他人,而基因則只能有父母輩傳遞給子女背,傳遞的時間比較久。這也決定了混合優化演算法的最重要的部分在於其群體的結構而不是其中的優化運算元,實驗說明這樣的效果也不錯,簡單明了的演算法也能有不錯的效果。

參考文獻
Eusuff M , Lansey K , Pasha F . Shuffled frog-leaping algorithm: a memetic meta-heuristic for discrete optimization[J]. Engineering Optimization, 2006, 38(2):129-154. 提取碼:ttgx

Eusuff, M.M. and Lansey, K.E., Optimization of water distribution network design using the shuffled frog leaping algorithm (SFLA). J.Water Resources Planning Mgmt,Am. Soc. Civ. Engrs, 2003, 129(3), 210–225. 提取碼:cyu8

以下指標純屬個人yy,僅供參考

目錄
上一篇 優化演算法筆記(十五)蝙蝠演算法
下一篇 優化演算法筆記(十七)萬有引力演算法

優化演算法matlab實現(十六)混合蛙跳演算法matlab實現

❾ 優化演算法筆記(十七)萬有引力演算法

(以下描述,均不是學術用語,僅供大家快樂的閱讀)
萬有引力演算法(Gravitational Search Algorithm)是受物體之間的萬有引力啟發而提出的演算法。演算法提出於2008(2009)年,時間不長,不過相關的文章和應用已經相對較多,也有不少的優化改進方案。
萬有引力演算法中,每一個物體的位置代表了一個可行解,而物體的質量則反映了該位置的好壞,位置越好的物體的質量越大,反之物體的質量越小(質量由適應度值計算出,不是直接相等)。物體在解空間中的運動方式由其他物體的引力決定,質量越大的物體,在同等引力作用下的加速度較小,所以單位時間內的速度也相對較小,位移距離較短,反之加速度和速度都較大,位移距離較長。故可以簡單的認為, 位置越優的個體的移動速度越慢,位置越差的個體的移動速度越快

萬物之間皆有萬有引力,不過在我們談到萬有引力之時,對象大多是天體,否則萬有引力太小可以忽略不計。所有這次我們的主角就是天體了。(總不可能是蘋果吧)。

每一個天體都有個屬性:位置X,質量M,加速度A,以及速度V,還有適應度值F。
在D維空間內有N個天體,其位置為

,加速度

,速度

,其適應度值為


第i個天體的質量則是根據其適應度值計算得出:

其中M為天體的質量在群體重質量中的佔比, 分別表示全局最差天體的適應度值和全局最優個體的適應度值。
可以看出,處於最優位置的天體的質量m為1,最差位置的天體的質量m為0。當最優天體和最差天體重合時,所有的天體的質量m都為1。

由萬有引力計算公式和加速度公式可以計算出當前天體收到另一個天體萬有引力而產生的加速度:

其中R表示第i個天體和第j個天體之間的歐式距離,aij為天體i在第d維上受到天體j的萬有引力而產生的加速度,ai為第i個天體受到的其他所有天體萬有引力的合力產生的加速度。G為萬有引力常量,可以根據一下公式計算:

其中G0為初始值,T為最大迭代次數。

計算出了天體的加速度,則可以根據當前速度計算出下一步天體的運行速度以及天體下一步的位置。

這一步比較簡單與粒子群、蝙蝠等有速度的演算法一致。

可以看出萬有引力演算法的流程異常的簡單,與經典的粒子群差不多。萬有引力演算法也可以看做是一個優化改進版的粒子群,不過設計比較巧妙,引入的質量、加速度等概念,但實現仍然很簡單。萬有引力演算法的效果如何,在下一節將會進行實驗測試。

適應度函數 。
實驗一:

從圖像中可以看出,各個天體都在不停的運動,由於沒有貪心演算法(優於當前值才改變位置)的加入,所以個天體有可能運動到比原先位置更差的地方,而且其收斂速度也比較快。
從結果上看,似乎還不錯,受到最差值的影響均值也相對較大,演算法結果的穩定性不是太好。
直覺上感覺演算法有點問題。根據物理得來的直覺告訴我,這些天體會相互靠近,所以,它們不會集中到它們所構成的凸包之外, 凸實心物體的質心不會跑到該物體的外部 。做個試驗驗證一下,將測試函數的最優解設置到一個極端的位置。
實驗二 : 適應度函數

這次最優解位置在(90,90)處,該點有很大概率出現在初始天體所圍成的凸多邊形外。

從圖像中可以看出,在天體們還沒有到達最優位置附近(右下角的紅點)時,它們已經收斂於一個點,之後則很難再次向最優解靠經。看結果可以發現幾乎每一次實驗的結果都不太好,演算法果然有點問題,不過問題不大。
萬有引力出現這種現象可能有兩個原因: 1.演算法收斂的太快 ,還未對全局進行充分搜索之時就收斂到了一點,收斂到一點後無法再運到。 2.演算法沒有跳出局部最優的策略 ,萬有引力作用下的天體慢慢聚集到奇點,形成黑洞,無法從中逃離。
那接下來,對萬有引力演算法的改進方向也比較明確了:1.減緩其收斂速度,2增加跳出局部最優操作,使之逃離黑洞。
看看萬有引力常量G的函數圖像

將萬有引力常量的值修改為隨著迭代次數線性下降,從圖像中可以看出,效果還是比較明顯的,天體在不斷的運動,最後才收斂、聚集於一起。從實驗結果也可以看出,演算法相對穩定。結合圖像可以知道,改進後,演算法的收斂性下降,但全局搜索能力有較大的提升,演算法的結果不會很差但是精度較低。

將萬有引力常量的下降趨勢放緩為原來的1/4,從圖像中可以看出,演算法的收斂速度非常快,也得到了較好的結果,相比線性下降,演算法有著更好的精度,不足之處則是沒有跳出局部最優的操作,收斂過快也容易陷入局部最優。
不知道原文為什麼讓萬有引力常量G的如此快的降到0,明明降的更慢能有更好的全局搜索能力,但精度可能較差。猜測如果精度較差則在測試函數結果和曲線上比不贏對比的其他演算法,論文沒法發了。其使用的測試函數的最優解大多處於解空間的中心位置附近,即很少出現最優解在天體所圍成的凸多面體之外的情況,而實際問題中我們是無法預知最優解在個位置的。
接下來,將試著為萬有引力演算法加入一點跳出局部最優的操作。

實驗四 :改進,新增以下規則及操作
在實驗二的條件下
1 . 處於最優位置的天體保持自己的位置不動.
2 . 如果某一個天體的運動後的位置優於當前全局最優個體的位置則將當前的最優個體初始化到解空間的隨機位置.(將被自己幹掉的大哥流放)。
3 . 如果觸發了規則2,將所有的個體的以迭代次數重置為0,即計算G=G0*e^(-20t/T)中的t置為0,重新計算萬有引力常量,若未觸發條件2則t=t+1。

從圖像上看,演算法的全局搜索能力有大幅的增強,並且已經集中到了最優解的附近,而且由於加入了「流放」這一跳出局部最優的操作,可以看出,不斷的有新的個體出現在距最優位置較遠的位置。不過收斂速度有所下降,因此局部搜索能力有一定減弱。
看結果,好像沒有實驗三那麼好,但與實驗二相比,已經有了很大的提升,而且有了跳出局部最優的操作,結果也相對穩定。
上述的實驗僅僅是對直觀猜想的實現,如果想以此為改進點,還要對其進行大量的調優,相信會有不錯的結果。

萬有引力演算法根據萬有引力提出,結合了牛頓第二定律,可以說其操作步驟與真實的物理規律非常的貼切。不過就像前文說過,受物理現象啟發而來的優化演算法其性能是未知的,因為它們不具備智能,只有著規律,有規律就會存在弱點,就會有搜索盲區。宇宙那麼大,肯定存在沒有任何天體到達過的空間。
不過由於萬有引力演算法流程簡單,理解方便,其優化方案和能改進的地方相對較多。萬有引力演算法的收斂速度過快,導致其全局搜索能力較弱而局部搜索能力很強,容易陷入局部最優。根據其特點,我們可以降低其收斂速度或者增加跳出局部最優操作,來平衡演算法的各個性能。

參考文獻
Rashedi E , Nezamabadi-Pour H , Saryazdi S . GSA: A Gravitational Search Algorithm[J]. Information Sciences, 2009, 179(13):2232-2248. 提取碼:xhpa

以下指標純屬個人yy,僅供參考

目錄
上一篇 優化演算法筆記(十六)混合蛙跳演算法
下一篇 優化演算法筆記(十八)灰狼演算法

優化演算法matlab實現(十七)萬有引力演算法matlab實現

熱點內容
我配置很高了ae為什麼卡 發布:2025-05-17 14:54:50 瀏覽:167
python數據分析實戰pdf 發布:2025-05-17 14:49:42 瀏覽:950
海瀾之家廣告腳本 發布:2025-05-17 13:56:06 瀏覽:30
手文件夾恢復 發布:2025-05-17 13:53:32 瀏覽:993
linux怎麼看進程 發布:2025-05-17 13:53:30 瀏覽:303
thinkphp欄位緩存 發布:2025-05-17 13:52:01 瀏覽:575
山靈app安卓版如何設置 發布:2025-05-17 13:51:49 瀏覽:388
帆布壓縮袋 發布:2025-05-17 13:26:27 瀏覽:460
c語言16進製表示方法 發布:2025-05-17 13:11:25 瀏覽:482
ftp單位 發布:2025-05-17 13:10:03 瀏覽:144