分數階微分方程matlab代碼,微分進化算法解決函數優化問題的matlab代碼,Matlab微分進化算法及優化函數測試...

 2023-11-11 阅读 57 评论 0

摘要:微分進化(Difference Evolution,DE)算法是一種優化算法,據稱其比GA(遺傳算法)等更為優秀。借鑒網上實現的DE算法,用Matlab實現了對若干函數優化問題的解法,代碼如下:function [] = de_testclear all;分數階微分方程matlab代碼,close

微分進化(Difference Evolution,DE)算法是一種優化算法,據稱其比GA(遺傳算法)等更為優秀。

借鑒網上實現的DE算法,用Matlab實現了對若干函數優化問題的解法,代碼如下:

function [] = de_test

clear all;

分數階微分方程matlab代碼,close all;

clc;

%解:X = [0, 0, ...]

%nVar = 30

%dims: [-30, 30]

matlab中dsolve函數。function fitness = sphere(vals)

prod = vals .* vals;

fitness = sum(prod, 2);

end

%f(x) = 1/4000 * sum^n_1(x_i)^2 - prod^n_1 * cos(x_i/sqrt(i)) + 1

matlab解一階微分方程組、%f* = 0, x* = [0, 0, ...];

%nVar = 30

%dims: [-600, 600]

function fitness = griewank(vals)

[h w] = size(vals);

polyval函數matlab。p1 = vals.^2;

p1 = 1/4000 .* sum(p1, 2);

t = sqrt([1:w]);

p2 = vals ./ repmat(t, h, 1);

p2 = cos(p2);

matlab微分器。p2 = prod(p2, 2);

fitness = p1 - p2 + 1;

end

%解: X = [1, 1, 1, ...]

function fitness = RosenBroek(vals)

matlab函數求導?[k n] = size(vals);

vals1 = vals(:, 1:n-1);

vals2 = vals(:, 2:n);

tmp = vals2 - vals1 .* vals1;

tmp = 100 * tmp .* tmp;

matlab求全微分?tmp1 = (vals1 - 1).^2;

fitness = sum(tmp, 2) + sum(tmp1, 2);

end

%許多局部最小值,最優解:X = [0, 0], 固定2個變量

function fitness = Rastrigin (X)

matlab積分函數,v = X.^2 - 10 .* cos(2 * pi .* X) + 10;

fitness = sum(v, 2);

%fitness = 20 + X(:, 1).^2 + X(:, 2).^2 - 10 .* (cos(2 * pi * X(:, 1)) + cos(2 * pi * X(:, 2)));

end

%參數

matlab函數大全。popSize = 100; % 群規模

F = 0.5; ? ? ? ? ? ? ? ? ? ?% 突變因子

C = 0.9; ? ? ? ? ? ? ? ? ? ?% 交叉率

iterTimes = 300; % 迭代次數

Run = 4; ? ? ? ?% 測試輪次

matlab求一個函數的微分,id = [1:popSize];

%結果

bestFit = 1e5; ?%設取最小值

bestGene = [];

for r = 1:Run ?%輪次

matlab數據歸一化函數?Func = r; ? ? % 測試適應度函數

switch Func

case 1

Func = @sphere;

Xmin = -100;

Xmax = 100;

nVar = 30;

case 2

Func = @griewank;

Xmin = -600;

Xmax = 600;

nVar = 2;

case 3

nVar = 2;

Func = @RosenBroek;

Xmin = -100;

Xmax = 100;

case 4

nVar = 2;

Func = @Rastrigin

Xmin = -5.12;

Xmax = 5.12;

end;

Func

tic;

%1.初始化種群

X = Xmin + rand(popSize, nVar) * Xmax;

%2.每輪迭代

for i = 1:iterTimes

X0 = X;

% ? ? ? ? ? ? F = 2 * (1 - (i-1)/iterTimes);

%個體突變得到V

for j = 1:popSize

ids = id;

ids(j) = [];

rids = randperm(popSize - 1, 3);

rids = ids(rids);

V = X(rids(1), :) + F * (X(rids(2), :) - X(rids(3), :));

%對V(j, :)值域檢查

ids = find(V < Xmin);

if length(ids) > 0

V(ids) = Xmin;

end;

ids = find(V > Xmax);

if length(ids) > 0

V(ids) = Xmax;

end;

%對每個X和V的配對,進行交叉操作,結果存在U中

jrand = floor(rand() * nVar + 1); ?%必交叉項,保證至少一個交叉

for n = 1:nVar

R1 = rand();

if (R1 < C || n == jrand)

U = V; ? ?%保留子代基因

else

U = X(j, :); ? ?%保留父代基因

end

end

%在子代和父代間做選擇運算

if Func(U) < Func(X(j, :))

Tr = U;

else

Tr=X(j, :);

end

% 更新種群基因

X(j,:) = Tr;

%計算新的適應度

fitness = Func(X(j,:));

%記錄全局最優解

if fitness < bestFit

bestFit = fitness;

bestGene = X(j, :);

end;

end ?%結束個體更新

end

bestGene

bestFit

toc

end

end運行結果如下:

Func =

@de_test/sphere

bestGene =

Columns 1 through 15

-7.5570 ?-11.9099 ? ?9.9957 ?-37.8403 ?-17.9445 ? -7.1438 ?-21.4304 ?-33.6260 ?-22.1812 ?-66.1438 ? ?0.9014 ?-39.6724 ? -0.3175 ?-56.4815 ? 26.5422

Columns 16 through 30

6.5446 ?-31.9653 ? -9.3640 ?-37.1629 ?-23.7325 ? ?2.7271 ? -6.3413 ?-21.3204 ?-13.1450 ? 28.7402 ?-28.8170 ?-22.6226 ? 10.9031 ?-16.6128 ?-14.7637

bestFit =

2.0583e+04 ?(從此結果看,算法效果不佳)

時間已過 2.285354 秒。

Func =

@de_test/griewank

bestGene =

1.0e-08 *

0.1702 ? ?0.1424

bestFit =

0

時間已過 3.337347 秒。

Func =

@de_test/RosenBroek

bestGene =

1.0e-08 *

0.1702 ? ?0.1424

bestFit =

0

時間已過 1.747765 秒。

Func =

@de_test/Rastrigin

Func =

@de_test/Rastrigin

bestGene =

1.0e-08 *

0.1702 ? ?0.1424

bestFit =

0

時間已過 1.403871 秒。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/172424.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息