Matlab使用fminsearch优化多变量
Matlab use fminsearch to optimize multi variables
我正在使用 Matlab fminsearch
最小化具有两个变量的方程 sum((interval-5).^2, 2)*factor
间隔是一个包含 5 个值的向量。它们只能从值 1 到 30 顺序选取,步长为 1。因子是从 0.1 到 0.9 的值。
代码如下。我认为区间值是正确的,但因子值是错误的。
区间值:[3 4 5 6 7]
系数值:0.6
最终输出:6
我认为因子值应该是 0.1,最终输出应该是 1 作为全局最小值。
%% initialization of problem parameters
minval = 1;
maxval = 30;
step = 1;
count = 5;
minFactor = 0.1;
maxFactor = 0.9;
%% the objective function
fun = @(interval, factor) sum((interval-5).^2, 2)*factor;
%% a function that generates an interval from its initial value
getinterval = @(start) floor(start) + (0:(count-1)) * step;
getfactor =@(start2) floor(start2 * 10)/10;
%% a modified objective function that handles constraints
objective = @(start, start2) f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor);
%% finding the interval that minimizes the objective function
start = [(minval+maxval)/2 (minFactor+maxFactor)/2];
y = fminsearch(objective, start);
bestvals = getinterval(y(1));
bestfactor = getfactor(y(2));
eval = fun(bestvals,bestfactor);
disp(bestvals)
disp(bestfactor)
disp(eval)
代码使用了以下函数f
。
function y = f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor)
interval = getinterval(start(1));
factor = getfactor(start(2));
if (min(interval) < minval) || (max(interval) > maxval) || (factor<minFactor) || (factor>maxFactor)
y = Inf;
else
y = fun(interval, factor);
end
end
我按照 Adam 的建议尝试了 GA 功能。鉴于我的变量来自不同的范围和步骤,我将其更改为两个不同的集合。这是我的更改。
step1 = 1;
set1 = 1:step1:30;
step2 = 0.1;
set2 = 0.1:step2:0.9;
% upper bound depends on how many integer used for mapping
ub = zeros(1, nvar);
ub(1) = length(set1);
ub(2) = length(set2);
然后,我改变了objective函数
% objective function
function y = f(x,set1, set2)
% mapping
xmap1 = set1(x(1));
xmap2 = set2(x(2));
y = (40 - xmap1)^xmap2;
end
在我 运行 代码之后,我想我得到了我想要的答案。
ga()
优化集合的图示
objective函数
f = xmap(1) -2*xmap(2)^2 + 3*xmap(3)^3 - 4*xmap(4)^4 + 5*xmap(5)^5;
设置
set = {1, 5, 10, 15, 20, 25, 30}
该集合包含 7 个元素:
- 索引1相当于1
Set(1)
- 索引 2 到 5...
- 索引 7 到 30
set(7)
ga 的输入将在 1 to 7
.
范围内
下限为1
,上限为7
.
ga 优化是通过计算适应度函数来完成的,即通过对输入变量评估 f
。
此处的提示将使用 integer as input
,稍后在评估 f
时使用上面刚刚讨论的 mapping
。
代码如下
% settting option for ga
opts = optimoptions(@ga, ...
'PopulationSize', 150, ...
'MaxGenerations', 200, ...
'EliteCount', 10, ...
'FunctionTolerance', 1e-8, ...
'PlotFcn', @gaplotbestf);
% number of variable
nvar = 5;
% uppper bound is 1
lb = ones(1, nvar);
step = 2.3;
set = 1:step:30;
limit = length(set);
% upper bound depends on how many integer used for mapping
ub = limit.*lb;
% maximization, used the opposite of f as ga only do minimization
% asking ga to minimize -f is equivalent to maximize f
fitness = @(x)-1*f(x, step, set);
[xbest, fbest, exitflag] = ga(fitness,nvar, [], [], [], [], lb, ub, [], 1:nvar, opts);
% get the discrete integer value and find their correspond value in the set
mapx = set(xbest)
% objective function
function y = f(x, step, set)
l = length(x);
% mapping
xmap = zeros(1, l);
for i = 1:l
xmap(i) = set(x(i));
end
y = xmap(1) -2*xmap(2)^2 + 3*xmap(3)^3 - 4*xmap(4)^4 + 5*xmap(5)^5;
end
我正在使用 Matlab fminsearch
最小化具有两个变量的方程 sum((interval-5).^2, 2)*factor
间隔是一个包含 5 个值的向量。它们只能从值 1 到 30 顺序选取,步长为 1。因子是从 0.1 到 0.9 的值。
代码如下。我认为区间值是正确的,但因子值是错误的。
区间值:[3 4 5 6 7] 系数值:0.6 最终输出:6
我认为因子值应该是 0.1,最终输出应该是 1 作为全局最小值。
%% initialization of problem parameters
minval = 1;
maxval = 30;
step = 1;
count = 5;
minFactor = 0.1;
maxFactor = 0.9;
%% the objective function
fun = @(interval, factor) sum((interval-5).^2, 2)*factor;
%% a function that generates an interval from its initial value
getinterval = @(start) floor(start) + (0:(count-1)) * step;
getfactor =@(start2) floor(start2 * 10)/10;
%% a modified objective function that handles constraints
objective = @(start, start2) f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor);
%% finding the interval that minimizes the objective function
start = [(minval+maxval)/2 (minFactor+maxFactor)/2];
y = fminsearch(objective, start);
bestvals = getinterval(y(1));
bestfactor = getfactor(y(2));
eval = fun(bestvals,bestfactor);
disp(bestvals)
disp(bestfactor)
disp(eval)
代码使用了以下函数f
。
function y = f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor)
interval = getinterval(start(1));
factor = getfactor(start(2));
if (min(interval) < minval) || (max(interval) > maxval) || (factor<minFactor) || (factor>maxFactor)
y = Inf;
else
y = fun(interval, factor);
end
end
我按照 Adam 的建议尝试了 GA 功能。鉴于我的变量来自不同的范围和步骤,我将其更改为两个不同的集合。这是我的更改。
step1 = 1;
set1 = 1:step1:30;
step2 = 0.1;
set2 = 0.1:step2:0.9;
% upper bound depends on how many integer used for mapping
ub = zeros(1, nvar);
ub(1) = length(set1);
ub(2) = length(set2);
然后,我改变了objective函数
% objective function
function y = f(x,set1, set2)
% mapping
xmap1 = set1(x(1));
xmap2 = set2(x(2));
y = (40 - xmap1)^xmap2;
end
在我 运行 代码之后,我想我得到了我想要的答案。
ga()
优化集合的图示
objective函数
f = xmap(1) -2*xmap(2)^2 + 3*xmap(3)^3 - 4*xmap(4)^4 + 5*xmap(5)^5;
设置
set = {1, 5, 10, 15, 20, 25, 30}
该集合包含 7 个元素:
- 索引1相当于1
Set(1)
- 索引 2 到 5...
- 索引 7 到 30
set(7)
ga 的输入将在 1 to 7
.
范围内
下限为1
,上限为7
.
ga 优化是通过计算适应度函数来完成的,即通过对输入变量评估 f
。
此处的提示将使用 integer as input
,稍后在评估 f
时使用上面刚刚讨论的 mapping
。
代码如下
% settting option for ga
opts = optimoptions(@ga, ...
'PopulationSize', 150, ...
'MaxGenerations', 200, ...
'EliteCount', 10, ...
'FunctionTolerance', 1e-8, ...
'PlotFcn', @gaplotbestf);
% number of variable
nvar = 5;
% uppper bound is 1
lb = ones(1, nvar);
step = 2.3;
set = 1:step:30;
limit = length(set);
% upper bound depends on how many integer used for mapping
ub = limit.*lb;
% maximization, used the opposite of f as ga only do minimization
% asking ga to minimize -f is equivalent to maximize f
fitness = @(x)-1*f(x, step, set);
[xbest, fbest, exitflag] = ga(fitness,nvar, [], [], [], [], lb, ub, [], 1:nvar, opts);
% get the discrete integer value and find their correspond value in the set
mapx = set(xbest)
% objective function
function y = f(x, step, set)
l = length(x);
% mapping
xmap = zeros(1, l);
for i = 1:l
xmap(i) = set(x(i));
end
y = xmap(1) -2*xmap(2)^2 + 3*xmap(3)^3 - 4*xmap(4)^4 + 5*xmap(5)^5;
end