1. 程式人生 > >解決Matlab(R2016a) Sheffield GATBX遺傳工具箱的一些問題

解決Matlab(R2016a) Sheffield GATBX遺傳工具箱的一些問題

  • 簡介:學習遺傳演算法並用Matlab實現演算法的時候碰到了如下問題:
    未找到 'gadst'

  • 解決辦法:Google了一下解決辦法,就是說Matlab自帶的Toolbox裡面的是GA(另一個),所以我們用的gadst沒用balabala…然後呢,當然就是去下載Sheffield的GATBX工具箱咯。然而,下好再配置好後測試一下,又報錯:
    error
    開啟資料夾看看:

error2

納尼 ????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,就會出現結果:

result

問題終於解決了!