9月上旬準備數模國賽,提前準備了一些智慧型演算法,當時沒時間總結,現在比賽結束了抽空總結一下~
思想:在一片濕地中生活著一群青蛙。濕地內離散的分布著許多石頭,青蛙通過尋找不同的石頭進行跳躍去找到食物較多的地方。每只青蛙個體之間通過文化的交流實現資訊的交換。每只青蛙都具有自己的文化。每只青蛙的文化被定義為問題的乙個解。濕地的整個青蛙群體被分為不同的子群體,每個子群體有著自己的文化,執行區域性搜尋策略。在子群體中的每個個體有著自己的文化,並且影響著其他個體,也受其他個體的影響,並隨著子群體的進化而進化。當子群體進化到一定階段以後,各個子群體之間再進行思想的交流(全域性資訊交換)實現子群體間的混合運算,一直到所設定的條件滿足為止。
過程:a.輸入
f:蛙群數量,m:種群數量,n:子族群中青蛙的數量,ls:區域性進化次數,g:迭代次數(蛙群思想交流次數)
b.蛙群初始化
px:全域性最好蛙
也就是產生問題的初始解(這裡乙個比較棘手的問題是如何產生具有複雜約束條件的初始解)。然後計算相應的適應度函式。將適應度較好的個體排在前面。適應度越大越好就採用降序,反之採用公升序。
記錄全域性最優解px。
c.分組
通過取模的方法對蛙群進行劃分,也即劃分子族群。
第1隻蛙分入第 1模因組, 第2隻蛙分入第2模因組, 第?隻蛙分入第 ?模因組, 第? + 1隻蛙重新分入第1模因組, 依次類推.
d.區域性進化
對於每乙個子族群進行區域性進化也就是跳躍。即更新每乙個子族群中適應度最差的青蛙。
pb:區域性最好解;pw:區域性最差解;rand():介於0-1之間的隨機數
青蛙更新距離 ds=rand()*(pb-pw) (1)
更新後的青蛙 newdw=oldpw+ds(-dmax≦ds≦dmax) (2)
更新後的青蛙適應度較差,則使用全域性最好解px去替換區域性最優解pb,再次使用(1)(2)產生新蛙,若新蛙的適應度依舊較差,隨機產生乙隻蛙去取代最差的青蛙。
這裡需要注意需要控制生成的新蛙也需要滿足問題的約束條件。
%如果適應度函式增大,就替換
if aimfun(newdw)>fs(idmin,1)
fs(idmin,2:end) = newdw;
fs(idmin,1) = aimfun(newdw);
f=0;
else
%用全域性最優來替換pb
pb=px;
newdw = (pw+ds)./((sqrt(sum((pw+ds).^2))));
if aimfun(newdw)>fs(idmin,1)
fs(idmin,2:end) = newdw;
fs(idmin,1) = aimfun(newdw);
f=0;
else
f=2;
endend
%隨機生成乙隻蛙來替換最差的
if f==2
frog = rand(1,8);
frog = frog./(sqrt(sum(frog.^2)));
y = aimfun(frog);
frog = [y,frog];
fs(idmin,:)=frog;
end
e.全域性思想交流
每個子族群的青蛙進化之後,對蛙群進行混合。依舊根據青蛙的適應度高低進行排序。記錄最好蛙px。繼續進行步驟c,d,e。
在每次進行了思想交流之後需要記錄最好蛙,以及相關的適應度值。儲存在矩陣中。
f.停止條件
(1)在最近的k次全域性思想交流過程之後,全域性最好解沒有得到明顯的改進;(可以設定|本次最好解-上次最好解|《某個閾值就停止)
(2)演算法預先定義的函式評價次數已經達到。
(3)已有標準測試結果。
思想pso模擬鳥群的捕食行為。一群鳥在隨機搜尋食物,在這個區域裡只有一塊食物。所有的鳥都不知道食物在那裡。但是他們知道當前的位置離食物還有多遠。那麼找到食物的最優策略是什麼呢。最簡單有效的就是搜尋離食物最近的鳥的周圍區域
過程a.輸入
w :慣性因子 c1:自我認知學習因子 c2:社會認知學習因子 gbest:種群當前最好位置 n = 20:種群中粒子數量 iter_n :迭代次數 dimension:解的維度
b.粒子群初始化
生成符合約束條件的初始解,計算粒子的適應度,並記錄每個粒子的最優位置
c.對粒子的速度和位置進行更新
% 速度更新
vi = obj.w*obj.pop(1,i).vi+obj.c1*rand*(obj.pop(1,i).pbestiobj.pop(1,i).xi)+obj.c2*rand*(obj.gbest-obj.pop(1,i).xi);
% 位置更新
xi = obj.pop(1,i).xi+vi;
根據更新後的粒子位置,計算對應的適應度函式,如果適應度更好就替換粒子的最優位置。同時每次迭代也要記錄全域性最優位置
d.停止條件
1.迭代次數達到gmax
2.最佳適應度增量小於某個閾值
思想:模擬退火演算法**於固體退火原理,是一種基於概率的演算法,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫公升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。(其實本質上就是在一定程度上接受較差解,從而避免陷入區域性最優值)
過程a.初始化
輸入alpha:降溫係數,currenttmp:當前溫度,mintmp:最小溫度。
b.產生新解
這裡也是乙個難點,模擬退火演算法產生新解的方式還是要結合具體的問題分析的,這種形式只是一種,delta是擾動係數.
%隨機擾動
delta = (rand()-0.5)*0.3;
x_new = x_new - 2*delta;
產生了新解之後自然要計算適應度。然後判斷是否接受新解。判斷函式如下:
這裡的de要根據實際情況確定,如是適應度越大越好de = f_old-f_new,如果是越小越好就是de=f_new-f_old
function flag = judge(obj,de,t)
if(de<0)
flag = 1;
else
d = exp(-(de/t));
if d>rand
flag=1;
else
flag=0;
endend
end
c.停止條件
1.當前溫度小於最小溫度,tmp_current = tmp_init*alpha.
2.迭代了若干次後依然找不到較好的解
思想遺傳演算法(genetic algorithm)是模擬達爾文
生物演化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜尋最優解的方法。
過程a.編碼
這個要根據實際問題分析,這裡用比較著名的旅行商問題舉例:編碼就是路徑如:927863451
b.交叉
同樣要根據實際問題,對於旅行商問題而言,因為編碼的數字不能重複。有很多交叉方法,可以查查相關文獻。
c.變異
可以選擇兩個染色體位交換交換,或者交換兩個染色體位兩端部分。
ok,那麼總結一下吧,其實智慧型演算法或者說是啟發是演算法並沒有多麼高達上,只是因為不能通過窮舉來解決問題,因為時間複雜度較高。通過一種隨機搜尋的思想,無論是混合蛙跳的思想交流,粒子群的群體學習,模擬退火的退火,還是遺傳演算法交叉變異,都是希望搜尋的方向可以向著較好的地方。關於如何產生符合條件的新解,可以通過產生新解之後,看看是否符合條件,如果不符合就把適應度函式返回值設定成inf或者-inf,根據實際情況定。
智慧型優化演算法
智慧型優化演算法分類總結 蟻群演算法,1991 年 粒子群演算法,1994年 細菌覓食優化演算法,bacterial foraging optimization algorithm,2002年 混合蛙跳演算法,shuffled frog leaping algorithm,2003年 人工蜂群演算法...
系統優化方法與智慧型優化演算法
系統優化方法與智慧型優化演算法 系統優化方法在各種工程系統 經濟系統,乃至社會系統中得到了廣泛的應用。最優化理論的研究也一直是乙個十分活躍的領域,出版了許多最優化理論 方法和應用的著作和譯作。梯度為基礎的傳統優化演算法具有較高的計算效率 較強的可靠性 比較成熟等優點,是一類最重要的 應用最廣泛的優化...
《集體智慧型程式設計》 優化演算法
隨機搜尋domain是序列,costf是定義的成本函式 defrandomoptimize domain,costf best 999999999 bestr none for i in range 0 1000 建立乙個隨機解 r float random.randint domain i 0 d...