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