%簡單一元函式優化:計算函式最小值
% f(x)=sin(10*pi*x)/x,x∈[1,2]
clcclear all
close all %close what?
%%畫出函式圖
figure(1); % 畫圖指令
hold on;
lb = 1; ub = 2; %函式自變數範圍
ezplot('sin(10*pi*x)/x',[lb, ub]); %畫出函式曲線
xlabel('自變數/x')
ylabel('函式值/y')
%%定義遺傳演算法引數
nind = 40; %種群大小
maxgen = 20; %最大迭代次數
preci = 20; %染色體長度
ggap = 0.95; %代溝,選擇95%的個體
px = 0.7; %交叉概率
pm = 0.01; %變異概率
trace = zeros(2, maxgen); %尋優結果的初始值(一行自變數,一行值)
fieldd = [preci;lb;ub;1;0;1;1]; %區域描述器todo
%fieldd = [len;lb;ub;code;scale;lbin;ubin] 一般用於二進位制串到實值的轉換;
%len代表包含在chrom中每個字串的長度;lb和ub是行向量,指明每個變數的下界和上界,code表明如何編碼(code=1二進位制,code=0是格雷),scale指明刻度(scale=0算數,scale=1對數)lbin和ubin表示是否包含邊界,0表示去掉,1代表包含
chrom = crtbp(nind, preci); %建立基於二進位制的種群,一行代表乙個個體
%%優化
gen = 0;
x = bs2rv(chrom,fieldd); %子代個體的十進位制表達,第二個引數是什麼意思?
objv = sin(10*pi*x)/x; %求目標函式的值,儲存在objv向量裡面
while genfitnv = ranking(objv); %為種群排序
selch = select('sus', chrom, fitnv, ggap); %todo被選擇之後的種群
selch = recombin('xovsp',selch,px); %xovsp是什麼?經過交叉之後的種群
selch = mut(selch, pm) %變異
x = bs2rv(selch, fieldd); %
objvsel = sin(10*pi*x)/x; %
[chrom, objv] = reins(chrom, selch,1,1,objvsel); %重插入子代到父代,得到新種群
x = bs2rv(selch, fieldd); %
gen = gen + 1; %
%獲取每代的最優解及其序號,y為最優解,i為個體的序號
[y, i] = min(objv);
trace(1, gen) = x(i); %把個體的序號存入第一行
trace(2, gen) = y; %第二行放第一行對應的適應值
endplot(trace(1,:),trace(2,:),'bo'); %第三個引數是什麼?某種線型
grid on %開啟網格
plot(x, objv,'b*'); %和上乙個有沒有區別
hold off %與hold on相對,hold表示在當前圖(座標系,可能是figure)中畫了一張圖,再畫其他的時候保持原圖還在.
%%畫進化圖
figure(2);
plot(1:maxgen,trace(2,:)); %
grid on
xlabel('遺傳代數')
ylabel('解的變化')
title('進化過程')
besty = trace(2,end);
bestx = trace(1,end);
fprintf(['最優解:\nx = ',num2str(bestx),'\ny=',num2str(besty),'\n'])
利用棧求解迷宮問題
利用棧求解迷宮問題 源 include include define m 8 define n 8 define maxsize m n typedef struct box typedef struct sttype int mg m 2 n 2 bool mgpath int xi,int yi...
利用PSO求解TSP問題
pso 粒子群演算法 是群智慧型演算法的一種,其他的群智慧型演算法還有蟻群演算法,遺傳演算法等。其他的智慧型演算法還有模擬退火。之前看過一段時間的pso,商務智慧型課程最後的大作業便想用一下,剛好在github上看到有人用模擬退火解決tsp問題,而且效果不錯,於是便萌生了利用pso求解tsp問題的想...
LeetCode 利用雜湊表求解
python的dict採用了雜湊表,最低能在 o 1 時間內完成搜尋。下面幾道題就是利用dict來解答 簡單 存在重複元素 給定乙個整數陣列,判斷是否存在重複元素。如果任意一值在陣列 現至少兩次,函式返回true。如果陣列中每個元素都不相同,則返回false。示例 1 輸入 1,2,3,1 輸出 t...