matlab中使用“ga”函数的遗传算法

问题描述 投票:0回答:2

我写了一个简单的脚本,它最小化了我的代码中定义的四阶多项式函数。问题是,当我运行代码时,matlab完全给出了远离最佳解决方案的随机数。我不知道为什么在运行 can 的过程中每次都会给我错误的最小值。有人可以帮我吗?这是我的代码:

clc;
clear;
close all;

Lb = -40;
Ub = 80;
f = @(x) x.^4-50*x.^3-1800*x.^2-800*x;

Xopt = ga(f,1);
Yopt = f(Xopt);

ezplot(f,[Lb,Ub])
hold on
plot(Xopt,Yopt,'ro')
grid on
matlab mathematical-optimization genetic-algorithm
2个回答
0
投票

正如我在您的其他问题中提到的那样,这是您对元启发法所能期望的最好结果,因为:

  1. 这些算法本质上是随机的,并且在每次执行中都会找到不同的解决方案。
  2. 这些永远不能保证最优的全局解决方案,但它们能够使用手头问题的最少信息找到次优解决方案。

因此,对于相对复杂的问题和解决方案很容易实现,并且在某种程度上接近最优解决方案。但你想接近答案的程度取决于你想花多少钱。这是时间与准确性的权衡。以下代码将问题的解析解与 100 次

ga
运行获得的答案进行比较:

clc;
clear variables;
close all;

f = @(x) x.^4-50*x.^3-1800*x.^2-800*x;

% finding analytical solution
y = sym(f);
dy = diff(y);
p = sym2poly(dy);
r = roots(p);
[~, iopt] = min(f(r));
Xbest = r(iopt);

options = optimoptions(@ga, 'Display', 'off');
nTest = 100;
D = zeros(nTest, 1);
tic
for i = 1:nTest
    Xopt = ga(f,1, [], [], [], [], [], [], [], options);
    D(i) = abs(Xopt-Xbest);
end
toc
fprintf('max:%.6f, mean:%.6f, std: %.6d, min: %.6d\n', max(D), mean(D), std(D), min(D));

这些是我盒子上的结果:

经过时间为 8.251418 秒。
最大值:0.158342,平均值:0.027214,标准:2.915452e-02,最小值:7.094547e-04

现在进行另一个测试,其中的选项使

ga
继续进一步搜索:

options = optimoptions(@ga, ...
    'FunctionTolerance', 1e-30, ...
    'MaxGenerations', 500, ...
    'MaxStallGenerations', 100, ...
    'Display', 'off');

其余代码与之前相同:

已用时间为 23.090438 秒。
最大值:0.093429,平均值:0.015036,标准:1.727083e-02,最小值:1.086790e-04

如您所见,结果越来越好,但需要更多的时间才能找到它们。阅读文档以了解每个设置如何改变算法的运行方式。但测试本身也是寻找最佳答案的最常见技术之一:运行优化算法几次并保留最佳答案。


0
投票

我遇到了同样的问题,使用这个(或其他)修复随机种子: rng('默认');

© www.soinside.com 2019 - 2024. All rights reserved.