通过使用小矩阵在一个巨大的凸矩阵中的全局最小值

时间:2016-02-19 22:14:52

标签: algorithm matlab matrix

我有一个函数J(x,y,z),它给出了这些坐标的结果。这个函数是凸的。我需要的是找到这个巨大矩阵的最小值。 起初我试图遍历所有这些,计算然后用min函数搜索,但这需要太长时间......

所以我决定利用凸性。 Visual example

随机(现在)采用一组坐标,这将是我的小3x3x3矩阵的中心,找到局部最小值并使其成为下一个矩阵的中心。这将持续到我们达到全球最低标准。

另一个问题是函数不是完全凸起的,所以这个问题也可以出现

fake and real min

所以我正在考虑一个控制措施,当它找到一个假的最小值时,增加搜索范围以确保它。 你怎么建议我跟它一起去?这种做法好吗?或者我应该研究其他什么?

这是我自己开始的,但我对Matlab相当新,我不知道如何继续。

clear all
clc
min=100;

%the initial size of the search matrix 2*level +1
level=1;
i=input('Enter the starting coordinate for i (X) : ');
j=input('Enter the starting coordinate for j (Y) : ');
k=input('Enter the starting coordinate for k (Z) : ');

for m=i-level:i+level
    for n=j-level:j+level
        for p=k-level:k+level
            A(m,n,p)=J(m,n,p);
            if A(m,n,p)<min
                min=A(m,n,p);
            end
        end
    end
end
display(min, 'Minim');

[r,c,d] = ind2sub(size(A),find(A ==min));

display(r,'X');
display(c,'Y');
display(d,'Z');

对任何指导,改进和建设性批评表示赞赏。提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试使用fminsearch,因为它非常通用且易于使用。如果您可以匿名指定您的功能,这将特别容易。例如:

aFunc = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2

然后使用fminsearch

[x,fval] = fminsearch( aFunc, [-1.2, 1]);

如果您的三维函数J(x,y,z)可以匿名描述或作为常规函数描述,那么您可以尝试fminsearch。输入采用向量,因此您需要将函数写为J(X),其中X是长度为3的向量,因此x = X(1),y = X(2),z = X(3)

如果起点不在解决方案附近,

fminseach可能会失败。通常最好改进初始起点。例如,下面的代码围绕起始矢量采样补丁,通常可以提高找到全局最小值的几率。

% deltaR is used to refine the start vector with scatter min search over
% region defined by a path of [-deltaR+starVec(i):dx:deltaR+startVec(i)] on
% a side.
% Determine dx using maxIter.
maxIter = 1e4;
dx = max( ( 2*deltaR+1)^2/maxIter, 1/8);
dim = length( startVec);
[x,y] = meshgrid( [-deltaR:dx:deltaR]);

xV = zeros( length(x(:)), dim);

% Alternate patches as sequential x-y grids.
for ii = 1:2:dim
    xV(:, ii) = startVec(ii) + x(:);
end
for ii = 2:2:dim
    xV(:, ii) = startVec(ii) + y(:);
end

% Find the scatter min index to update startVec.
for ii = 1: length( xV) 
    nS(ii)=aFunc( xV(ii,:));
end
[fSmin, iw] = min( nS);
startVec = xV( iw,:);
fSmin = fSmin
startVec = startVec

[x,fval] = fminsearch( aFunc, startVec);

You can run a 2 dimensional test case f(x,y)=z on AlgorithmHub。该应用程序在Octave中运行上面的代码。您也可以在此网站上编辑内联功能(甚至可以尝试解决您的问题)。