Matlab使用fminsearch优化数字间隔

时间:2019-11-21 22:09:19

标签: matlab mathematical-optimization integer-programming

在Matlab中,我想使用fminsearch来优化给定对象函数fun的数字间隔。整数可以从1到30中选择,并且目前整数数量固定为5。假设步长为1。它将优化许多矢量,例如:

[1 2 3 4 5]
[2 3 4 5 6]
[7 8 9 10 11]
[12 13 14 15 16]

从长远来看,我可能还会尝试优化步长和向量中整数的数量。

我想知道如何使用fminsearch正确实现这一目标,或者可能使用工具箱中的其他功能?任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,如documentation中所述,fminsearch仅能找到最少的无约束函数。另一方面,fminbnd可以处理绑定约束,但是,这些功能均不能解决离散功能。因此,您可能想考虑其他选项,例如ga

尽管fminsearch不能处理约束,但是您仍然可以使用它来解决优化问题,但要花一些不必要的额外迭代。在这个答案中,我假设有一个fun函数,该函数以一个特定范围的间隔作为参数,目的是找到使该间隔最小的函数。

由于间隔具有固定的步长和长度,因此问题是单变量的,我们只需要找到其起点即可。我们可以使用floor将连续问题转换为离散问题。为了覆盖边界约束,我们可以检查区间的可行性,并为不可行的区间返回Inf。就像这样:

%% initialization of problem parameters
minval = 1;
maxval = 30;
step = 1;
count = 5;
%% the objective function
fun = @(interval) sum((interval-5).^2, 2);
%% a function that generates an interval from its initial value
getinterval = @(start) floor(start) + (0:(count-1)) * step;
%% a modified objective function that handles constraints
objective = @(start) f(start, fun, getinterval, minval, maxval);
%% finding the interval that minimizes the objective function
y = fminsearch(objective, (minval+maxval)/2);
best = getinterval(y);
eval = fun(best);
disp(best)
disp(eval)

其中f函数是:

function y = f(start, fun, getinterval, minval, maxval)
interval = getinterval(start);
if (min(interval) < minval) || (max(interval) > maxval)
    y = Inf;
else
    y = fun(interval);
end
end