我写了一个简单的脚本,它最小化了我的代码中定义的四阶多项式函数。问题是,当我运行代码时,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
正如我在您的其他问题中提到的那样,这是您对元启发法所能期望的最好结果,因为:
因此,对于相对复杂的问题和解决方案很容易实现,并且在某种程度上接近最优解决方案。但你想接近答案的程度取决于你想花多少钱。这是时间与准确性的权衡。以下代码将问题的解析解与 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
如您所见,结果越来越好,但需要更多的时间才能找到它们。阅读文档以了解每个设置如何改变算法的运行方式。但测试本身也是寻找最佳答案的最常见技术之一:运行优化算法几次并保留最佳答案。
我遇到了同样的问题,使用这个(或其他)修复随机种子: rng('默认');