解決Matlab(R2016a) Sheffield GATBX遺傳工具箱的一些問題
阿新 • • 發佈:2019-01-23
簡介:學習遺傳演算法並用Matlab實現演算法的時候碰到了如下問題:
解決辦法:Google了一下解決辦法,就是說Matlab自帶的Toolbox裡面的是GA(另一個),所以我們用的gadst沒用balabala…然後呢,當然就是去下載Sheffield的GATBX工具箱咯。然而,下好再配置好後測試一下,又報錯:
開啟資料夾看看:
納尼 ????WTF!!!!!!!
雖然Matlab給出瞭解決辦法(要更改副檔名,請將目錄改變為檔案的資料夾,鍵入:
movefile crtbp.M crtbp.m_bad; movefile crtbp.m_bad crtbp.m,然後改變目錄返回。),但是這麼多檔案怎麼改呢??好吧,我直接給 改好後的檔案吧。重新新增一下路徑,然後讓我們來測試一下吧!
目標是求 y = x.*cos(5*pi*x) + 3.5 在[-1,2.5]區間上的最大值。
目標函式檔案: fun_sigv.m
% filename: fun_sigv.m
function y = fun_sigv(x)
y = x.*cos(5*pi*x) + 3.5;
end
演算法實現指令碼檔案:yichuan.m
% filename: yichuan.m
% 遺傳演算法的測試
opt_minmax = 1; %目標優化型別:1 最大化, -1最小化
num_ppu = 50; %種群規模:個體個數
num_gen = 60 ; %最大遺傳代數
len_ch = 20; %基因長度
gap = 0.9; % 代溝
sub = -1; %變數取值下限
up = 2.5; %變數取值上限
cd_gray = 1; % 是否選擇格雷編碼方式: 1 是; 0 否
sc_log = 0; % 是否選擇對數標度: 1 是; 0 否
trace = zeros(num_gen, 2); % 遺傳迭代效能跟蹤器
fieldd = [len_ch; sub; up; 1-cd_gray; sc_log; 1; 1]; %區域描述器
chrom = crtbp(num_ppu, len_ch); % 初始化生成種群
k_gen = 0;
x = bs2rv(chrom, fieldd); % 翻譯初始化種群為十進位制
fun_v = fun_sigv(x); % 計算目標函式值
tx = sub:.01:up;
plot(tx, fun_sigv(tx)), xlabel('x'), ylabel('y'), title('一元函式優化結果'), hold on;
while k_gen < num_gen
fit_v = ranking(-opt_minmax*fun_v); % 計算目標函式的適應度(基於秩的適應度計算)
selchrom = select('rws', chrom, fit_v, gap); % 使用輪盤賭方式選擇
selchrom = recombin('xovsp', selchrom); % 交叉(單點交叉)
selchrom = mut(selchrom); % 變異(離散變異)
x = bs2rv(selchrom, fieldd); % 子代個體翻譯
fun_v_sel = fun_sigv(x); % 計運算元代個體對應目標函式值
[chrom, fun_v] = reins(chrom, selchrom, 1, 1, opt_minmax*fun_v,...
opt_minmax*fun_v_sel); % 根據目標函式值將子代個體插入新群種
[f, id] = max(fun_v); % 尋找當前種群最優解
x = bs2rv(chrom, fieldd); %二進位制串到實值的轉換
f = f* opt_minmax;
fun_v = fun_v * opt_minmax;
k_gen = k_gen + 1;
trace(k_gen, 1) = f; % 矩陣的秩,即對角元素之和
trace(k_gen, 2) = mean(fun_v);
end
plot(x(id), f, 'r*'), figure, plot(trace(:, 1), 'r-*'), hold on;
plot(trace(:, 2), 'b-o'), legend('各子代種群最優解', '各子代種群平均值'),...
xlabel('迭代次數'), ylabel('目標函式優化情況'), title('一元函式優化過程');
在命令列裡面輸入yichuan.m
,就會出現結果:
問題終於解決了!