微分进化算法解决函数优化问题的matlab代码,Matlab微分进化算法及优化函数测试...

微分进化(Difference Evolution,DE)算法是一种优化算法,据称其比GA(遗传算法)等更为优秀。

借鉴网上实现的DE算法,用Matlab实现了对若干函数优化问题的解法,代码如下:

function [] = de_test

clear all;

close all;

clc;

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

%nVar = 30

%dims: [-30, 30]

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

%f* = 0, x* = [0, 0, ...];

%nVar = 30

%dims: [-600, 600]

function fitness = griewank(vals)

[h w] = size(vals);

p1 = vals.^2;

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

t = sqrt([1:w]);

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

p2 = cos(p2);

p2 = prod(p2, 2);

fitness = p1 - p2 + 1;

end

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

function fitness = RosenBroek(vals)

[k n] = size(vals);

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

vals2 = vals(:, 2:n);

tmp = vals2 - vals1 .* vals1;

tmp = 100 * tmp .* tmp;

tmp1 = (vals1 - 1).^2;

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

end

%许多局部最小值,最优解:X = [0, 0], 固定2个变量

function fitness = Rastrigin (X)

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

%参数

popSize = 100; % 群规模

F = 0.5;                    % 突变因子

C = 0.9;                    % 交叉率

iterTimes = 300;% 迭代次数

Run = 4;        % 测试轮次

id = [1:popSize];

%结果

bestFit = 1e5;  %设取最小值

bestGene = [];

for r = 1:Run  %轮次

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 秒。

原文:http://blog.csdn.net/miscclp/article/details/38344685

微分进化算法是一种基于生物进化论的优化,它结合了全局搜索能力和多目标优化的需求。在多目标优化中,每个目标都有不同的权重,而微分进化算法可以通过全局搜索来避免陷入局部最优解,从而保持解个体的多样性。因此,基于微分进化算法的多目标寻优策略已经被广泛应用于各个领域中\[1\]。 在使用微分进化算法进行多目标优化时,首先需要对种群进行初始化。种群初始化的目的是为了生成一组初始的变量集合,以便后续的优化过程。在MATLAB中,可以使用初始化函数来实现种群的初始化。该函数接受种群大小和变量个数作为输入,并返回初始化好的变量集合\[2\]。 在计算个体对应目标函数的值时,可以使用目标函数来评估每个个体的适应度。在MATLAB中,可以使用目标函数来计算变量对应的目标函数值,并将目标函数值与变量合并成一个新的变量。这样可以方便后续的优化过程\[3\]。 综上所述,使用MATLAB进行微分进化算法的多目标优化,需要进行种群初始化和计算个体对应目标函数的值。通过这些步骤,可以得到一组多样性的解个体,以满足多目标优化的需求。 #### 引用[.reference_title] - *1* *2* *3* [微分进化算法基本原理与关键代码的实现(解决多目标优化)](https://blog.csdn.net/weixin_44563460/article/details/109374461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值