在matlab中利用遺傳演算法(GA)求取函式全域性最大值
遺傳演算法的簡單實現
今天學習了遺傳演算法,其最大的特點就是能求取全域性最優值,但是演算法隨機性高,對連續定義域很難求得精確解,本文僅參考遺傳演算法的思想,在整數範圍內,來求取函式全域性最大值
首先回顧一下演算法流程
(b)方法在(a)的基礎上,選擇保留一部分父代個體,防止優秀基因的丟失,我在這裡使用的是經典遺傳演算法,在下面這種簡單的二次函式方面效果不錯
clc;
clear;
%設定起始計時器
tic;
%定義群體個數num(設為偶數),定義自變數數n,定義自變數取值範圍[1,top],
num=160;n=4;top=12;
%定義用來儲存目標結果的向量
F_result=zeros(1,num);
%定義種群最大值,平均值
F_max=[];F_mean=[];F_min=[];
%隨機生成num個個體,即生成初始種群
for i=1:num
for j=1:n
X{i}(j)=unidrnd(top);
end
F_result(i)=f(X{i}); %請先自定義f函式
end
i=1;
%選擇使函式f較大的前一半個體隨機組合,隨機交換基因,產生下一代,直到群體數復原
while(1)
%取群體最大值,平均值,最小值作為觀察物件
F_max(i)=max(F_result);F_mean(i)=mean(F_result);F_min(i)=min(F_result);
if (F_max(i)==F_mean(i))
break;
end
%選擇前一半表現優秀的個體雜交產生下一代
F_tem=F_result; %臨時儲存F的結果用於排序
[result,coo]=sort(F_tem);
t=unidrnd(num/2); %基因交換迴圈過程中發生變異的某時刻
for j=1:num/2 %基因交換迴圈過程,子代將完全取代老一代
a=unidrnd(num/2)+num/2; %隨機選擇兩個表現優秀的不同個體
b=unidrnd(num/2)+num/2;
if(a==b)
j=j-1;
continue;
end
%選擇與重組
X{coo(j)}=[X{coo(a)}(1) X{coo(a)}(2) X{coo(b)}(3) X{coo(b)}(4)];
F_result(coo(j))=f(X{coo(j)});
X{coo(j+num/2)}=[X{coo(b)}(1) X{coo(b)}(2) X{coo(a)}(3) X{coo(a)}(4)];
F_result(coo(j+num/2))=f(X{coo(j+num/2)});
%變異
if(j==t)
c=unidrnd(n); %任選一位變異
d=unidrnd(top); %任變異成定義域內某值
X{coo(j)}(c)=d;
F_result(coo(j))=f(X{coo(j)});
X{coo(j+num/2)}(c)=d;
F_result(coo(j+num/2))=f(X{coo(j+num/2)});
end
end
i=i+1;
end
plot(F_max,'r');
hold on;
plot(F_mean,'g');
hold on;
plot(F_min,'b');
toc;
下面是執行結果
相關文章
- 遺傳演算法(一):Basic GA演算法
- MATLAB實戰系列(十一)-多種群遺傳演算法的函式優化演算法(附MATLAB程式碼)Matlab演算法函式優化
- 【演算法】遺傳演算法GA中幾種交叉運算元小結演算法
- Unity中利用遺傳演算法訓練MLPUnity演算法
- 遺傳演算法解決函式最佳化問題演算法函式
- laravel 自定義全域性函式Laravel函式
- matlab最優化問題的函式(fminbnd),fmincon,globalsearch,multistart(全域性區域性最優)Matlab優化函式
- MATLAB中linspace函式使用Matlab函式
- 【MATLAB】利用size()函式輸出陣列大小Matlab函式陣列
- 利用遺傳學演算法求解工作分配問題演算法
- 利用遺傳演算法庫DEAP優化交易策略演算法優化
- Matlab中erf函式的用法Matlab函式
- 遺傳演算法演算法
- 基於GA遺傳最佳化的PID控制器最優控制引數整定matlab模擬Matlab
- 基於GA遺傳最佳化的CNN-GRU的時間序列迴歸預測matlab模擬CNNMatlab
- matlab表示函式Matlab函式
- vue 全域性函式的 定義與任意呼叫Vue函式
- PHP 到底該怎麼定義全域性函式?PHP函式
- 說說在 Python 中如何向函式傳參Python函式
- 彙編眼中的函式呼叫引數傳遞以及全域性與區域性變數與“基址”函式變數
- Laravel-自定義全域性函式-ChinaCircle 優化版Laravel函式優化
- uniapp 全域性檢查登陸並跳轉函式APP函式
- 透過MATLAB分別對比二進位制編碼遺傳最佳化演算法和實數編碼遺傳最佳化演算法Matlab演算法
- m基於GA-GRU遺傳最佳化門控迴圈單元網路的電力負荷資料預測演算法matlab模擬演算法Matlab
- 遺傳演算法的基本框架演算法框架
- python遺傳演算法(詳解)Python演算法
- 基於遺傳最佳化的協同過濾推薦演算法matlab模擬演算法Matlab
- 函式中引數傳值函式
- 利用CORDIC演算法計算三角函式演算法函式
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- MATLAB巢狀函式練習Matlab巢狀函式
- 如何學習python遺傳演算法?Python演算法
- 人工智慧 (13) 遺傳演算法人工智慧演算法
- 10分鐘搞懂遺傳演算法演算法
- 元啟發式演算法庫 MEALPY 初體驗-遺傳演算法為例演算法
- nodejs在typescript專案中申明全域性變數NodeJSTypeScript變數
- matlab中的產生隨機數的rand函式Matlab隨機函式
- .Net MVC中定義全域性過濾器及在Action中排除全域性過濾器MVC過濾器