現代演算法 一 基因演算法

2022-09-10 19:33:14 字數 4500 閱讀 6815

2019-03-10 16:37:59

轉眼間就到了第三週,剛考完python二級,江蘇省的題目有點太那個了吧,什麼都有,第一道程式題給的最後結果都是錯的?

花了我好長時間在那裡,一直在找設定精度的函式,然鵝,回到宿舍用matlab計算也是python上跑的結果.呵呵,今天終於開始看演算法了

第乙個演算法就是基因演算法.話不多說開始.

基因演算法原理就不重述了,直接上**

程式設計中選擇的二進位制編碼,種群規模二 20,染色體雜交時的概率為 0.25,變異時概 率為 0.01,適應度函式為函式本身,終止條件為達到預定最大迭代次數。 

objfunction & initial group

%n -繁衍n代 不加上第一代,初始化父代

function gene(n)

f = @(x1,x2)21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2);

%initial group

%種群數為20個

v =cell(1,20

);for i = 1:20

temp1 = round(rand(1,33

)); %33 = 18+15=5+13+2+13

temp2 =vec2str(temp1);

v =temp2;

endclear temp1 temp2

record =adapt(v,f);

maxrec =maxrecord(record,v);

%自然選擇,儲存最適合

ticfor i=1

:n v =chfather(v,record);

v =opcrossover(v);

v =variation(v);

record =adapt(v,f);

temp =maxrecord(record,v);

if (temp(1,1)>maxrec(1,1

)) maxrec =temp;

mark =i;

endendtime =toc;

format

long

fprintf(

'x1: %f\n

',maxrec(2

));fprintf(

'x2: %f\n

',maxrec(3

));fprintf(

'f(x1,x2) : %f\n

',maxrec(1

));fprintf(

'from: %1.0f(th) generation \n

',mark);

fprintf(

'time: %f s\n

',time);

vec2str

%char2str

%將向量轉化成字串

%bin2dec()中的引數為字串!

function str =vec2str(vec)

len =length(vec);

str = ''

;for i=1

:len

temp =num2str(vec(i));

str =strcat(str,temp);

endend

adapt

function record =adapt(v,f)

record = zeros(20,1,'

double');

for i=1:20

temp1 =v;

temp2 = temp1(1:18

); te*** = temp1(19

:end);

record(i,

1) = f(bin_x(temp2,1),bin_x(te***,2

));end

end

maxrecord

function maxrec =maxrecord(record,v)

[m,i] =max(record);

maxrec(

1,1) =m;

temp1 =v;

temp2 = temp1(1:18

);te*** = temp1(19

:end);

maxrec(

2,1) = bin_x(temp2,1

);maxrec(

3,1) = bin_x(te***,2

);end

chfather

%選擇父代,似乎染色體進行了異位

function v =chfather(v,record)

f =sum(record);

%pk-平均,qk-累計

pk = record/f;

qk = zeros(20,1,'

double');

for i=1:20

qk(i) = sum(pk(1

:i));

end%模擬轉盤轉動20次

r = rand(20,1

);for i = 1:20

k = 1

;

while(r(i)>qk(k))

k = k+1

; end

r(i) =k;

endtemp =v;

for i =1:20

v =temp;

endend

opcorssover

function v =opcorssover(v)

%交換概率?pc?

%one point corssover

pc = 0.25

;l = 1

;while(l==1

) r = rand(20,1

); mk = find(r

l =numel(mk);

endif mod(numel(mk),2) == 1

mk = mk(1:end-1

);end

ri = randi([1,32],1,numel(mk)/2

);for i = 1:numel(mk)/2

[v,v] = onecross(v,...

v,ri(i));

endend

variation

function v =variation(v)

pm = 0.01

;for i = 1:20

r = rand(33,1

); k = find(r

for j = 1

:numel(k)

v =vari(v,k(j));

endendend

vari

function gnew =vari(g_old,pos)

gnew =g_old;

if gnew(pos) =='1'

gnew(pos) ='0'

;else

gnew(pos) ='1'

;end

end

onecorss

function [g1,g2]=onecross(gen1,gen2,pos)

len =numel(gen1);

g1 = gen1(1

:pos);

g2 = gen2(1

:pos);

g1(pos+1:len) = gen2(pos+1

:end);

g2(pos+1:len) = gen1(pos+1

:end);

end

bin_x

function num =bin_x(bin,opt)

switch

opt

case

1num = -3.0+bin2dec(bin)*((12.1-(-3.0))/(2^18-1

)); %12+3.0 = 16 ,0,1,2,3,4

%6-4 = 2 ,0,1,2

, %精度為0.5^13

case

2num = 4.1+bin2dec(bin)*((5.8-4.1)/(2^15-1

));end

end

現代優化演算法之蟻群演算法

參考一篇 an ant colony optimization algorithm for image edge detection 來嘗試說清楚蟻群優化演算法的大概流程。蟻群演算法是一種群體智慧型演算法,這類演算法主要是依靠隨機選擇加上 目標函式 引導來拓寬解的搜尋能力。我個人覺得這一類的群體演算...

現代優化演算法(五) 蟻群演算法

組合優化演算法系列 現代優化演算法 一 模擬退火演算法 及應用舉例 現代優化演算法 二 遺傳演算法 及應用舉例 現代優化演算法 三 禁忌搜尋演算法 現代優化演算法 四 改進的遺傳演算法 現代優化演算法 五 蟻群演算法 目錄 1 蟻群演算法簡介 2 解決tsp 問題的蟻群演算法描述 人工蟻群演算法的求...

現代啟發式演算法

啟發式演算法 heuristic algorithm 是相對於最優化演算法提出的。乙個問題的最優演算法求得該問題每個例項的最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般...