【優化求解】基於差分進化的正弦餘弦演算法matlab原始碼
一、差分進化演算法簡介
差分進化演算法包括三個基本的操作:變異操作、交叉(重組)操作和選擇操作。
1.1、演算法建模:
1、假設我們希望得到函式f(x)的最優解,這個函式有D個解。
2、為函式f(x)設定一個解的組數N,N至少為4。
3、這樣我們就得到了N組並且每組解的個數為D的集合,它可以使用N個D維引數向量來表示。
因為它類似於遺傳演算法進化一樣,是一代一代的進行進化,最終得到最優個體。所以上面G表示的就是代數。
形象表示如下:
1.2、初始化
為每個引數定義上界和下界
在上面的範圍內隨機的為每個引數取值。這樣就得到了一個N組初始解。
1.3、變異
上面有N組解,對於一組給定的解X(i,G)隨機的從這N組解中選擇三組解X(r1,G),X(r2,G),X(r3,G),r1,r2,r3分別代表組的索引,G表示代數,從第一代開始。
使用下面變異策略進行變異:
其中,F是變異因子,位於[0,2]之間。這樣我們就可以得到一組新的解。
1.4、交叉
下面我們就會對得到的這組新解進行交叉操作了。
CR是交叉概率,處於[0, 1]之間。
1.5、選擇
從上面可以得到一組進化之後的解,為了決定這組解是否成為G+1代中的解,需要將這組新解跟原來那組解的適應度值進行比較,如果優於原來那組解則將它們替換掉,否則保留原來解。適應度值得計算使用的就是適應度函式f(x)。這個函式需要我們之前進行確定。
整個過程的流程圖如下:
二、正弦餘弦演算法簡介
三、 基於差分進化的正弦餘弦演算法
正弦餘弦演算法是一種新型仿自然優化演算法,利用正餘弦數學模型來求解優化問題.為提高正弦餘弦演算法的優化精度和收斂速度,提出了一種基於差分進化的正弦餘弦演算法.該演算法通過非線性方式調整引數提高演算法的搜尋能力、利用差分進化策略平衡演算法的全域性探索能力及區域性開發能力並加快收斂速度、通過偵察蜂策略增加種群多樣性以及利用全域性最優個體變異策略增強演算法的區域性開發能力等優化策略來改進演算法,最後通過模擬實驗和結果分析證明了演算法的優異效能.
四、演示程式碼
function demo1 %DEMO1 Demo for usage of DIFFERENTIALEVOLUTION. % Set title optimInfo.title = 'Demo 1 (Rosenbrock''s saddle)'; % Specify objective function objFctHandle = @rosenbrocksaddle; % Define parameter names, ranges and quantization: % 1. column: parameter names % 2. column: parameter ranges % 3. column: parameter quantizations % 4. column: initial values (optional) paramDefCell = { 'parameter1', [-3 3], 0.01 'parameter2', [-3 3], 0.01 }; % Set initial parameter values in struct objFctParams objFctParams.parameter1 = -2; objFctParams.parameter2 = 2.5; % Set single additional function parameter objFctSettings = 100; % Get default DE parameters DEParams = getdefaultparams; % Set number of population members (often 10*D is suggested) DEParams.NP = 20; % Do not use slave processes here. If you want to, set feedSlaveProc to 1 and % run startmulticoreslave.m in at least one additional Matlab session. DEParams.feedSlaveProc = 0; % Set times DEParams.maxiter = 20; DEParams.maxtime = 30; % in seconds DEParams.maxclock = []; % Set display options DEParams.infoIterations = 1; DEParams.infoPeriod = 10; % in seconds % Do not send E-mails emailParams = []; % Set random state in order to always use the same population members here setrandomseed(1); % Start differential evolution [bestmem, bestval, bestFctParams, nrOfIterations, resultFileName] = differentialevolution(... DEParams, paramDefCell, objFctHandle, objFctSettings, objFctParams, emailParams, optimInfo); %#ok disp(' '); disp('Best parameter set returned by function differentialevolution:'); disp(bestFctParams); % Continue optimization by loading result file if DEParams.saveHistory disp(' '); disp(textwrap2(sprintf(... 'Now continuing optimization by loading result file %s.', resultFileName))); disp(' '); DEParams.maxiter = 100; DEParams.maxtime = 60; % in seconds [bestmem, bestval, bestFctParams] = differentialevolution(... DEParams, paramDefCell, objFctHandle, objFctSettings, objFctParams, emailParams, optimInfo, ... resultFileName); %#ok disp(' '); disp('Best parameter set returned by function differentialevolution:'); disp(bestFctParams); end
五、參考文獻及程式碼私信博主
[1] 劉小娟,王聯國.一種基於差分進化的正弦餘弦演算法[J].工程科學學報,2020,42(12):1674-1684.