📄 fminsearch.cpp
字号:
//
//
// % sort so v(1,:) has the lowest function value
// [fv,j] = sort(fv);
//
fv = sort(&j, fv);
//
// v = v(:,j);
//
v = v(colon(), j);
//
//
// how = 'initial';
//
how = "initial";
//
// itercount = 1;
//
itercount = 1.0;
//
// func_evals = n+1;
//
func_evals = n + mwArray(1.0);
//
// if prnt == 2
//
if (tobool(prnt == mwArray(2.0))) {
//
// disp(' ')
//
disp(" ");
//
// disp(header)
//
disp(header);
//
// disp([sprintf(' %5.0f %5.0f %12.6g ', itercount, func_evals, fv(1)), how])
//
disp(
horzcat(
mwVarargin(
sprintf(
mwArray(" %5.0f %5.0f %12.6g "),
mwVarargin(itercount, func_evals, fv(1.0))),
how)));
//
// elseif prnt == 3
//
} else if (tobool(prnt == mwArray(3.0))) {
//
// clc
//
clc();
//
// formatsave = get(0,{'format','formatspacing'});
//
formatsave
= get(
mwVarargin(
0.0, cellhcat(mwVarargin("format", "formatspacing"))));
//
// format compact
//
format("compact");
//
// format short e
//
format("short", "e");
//
// disp(' ')
//
disp(" ");
//
// disp(how)
//
disp(how);
//
// v
//
v.Print("v");
//
// fv
//
fv.Print("fv");
//
// func_evals
//
func_evals.Print("func_evals");
//
// end
//
}
//
// exitflag = 1;
//
*exitflag = 1.0;
//
//
// % Main algorithm
// % Iterate until the diameter of the simplex is less than tolx
// % AND the function values differ from the min by less than tolf,
// % or the max function evaluations are exceeded. (Cannot use OR instead of AND.)
// while func_evals < maxfun & itercount < maxiter
//
for (;;) {
mwArray a_(func_evals < maxfun);
if (tobool(a_) && tobool(a_ & itercount < maxiter)) {
} else {
break;
}
//
// if max(max(abs(v(:,two2np1)-v(:,onesn)))) <= tolx & ...
//
{
mwArray a_(max(max(abs(v(colon(), two2np1) - v(colon(), onesn))))
<= tolx);
if (tobool(a_)
&& tobool(a_ & max(abs(fv(1.0) - fv(two2np1))) <= tolf)) {
//
// max(abs(fv(1)-fv(two2np1))) <= tolf
// break
//
break;
} else {
}
//
// end
//
}
//
// how = '';
//
how = "";
//
//
// % Compute the reflection point
//
// % xbar = average of the n (NOT n+1) best points
// xbar = sum(v(:,one2n), 2)/n;
//
xbar = sum(v(colon(), one2n), 2.0) / n;
//
// xr = (1 + rho)*xbar - rho*v(:,end);
//
xr = (mwArray(1.0) + rho) * xbar - rho * v(colon(), end(v, 2, 2));
//
// x(:) = xr; fxr = feval(funfcn,x,varargin{:});
//
x(colon()) = xr;
fxr
= feval(
mwValueVarargout(),
FevalLookup(funfcn, 0, NULL),
mwVarargin(x, varargin.cell(colon())));
//
// func_evals = func_evals+1;
//
func_evals = func_evals + mwArray(1.0);
//
//
// if fxr < fv(:,1)
//
if (tobool(fxr < fv(colon(), 1.0))) {
//
// % Calculate the expansion point
// xe = (1 + rho*chi)*xbar - rho*chi*v(:,end);
//
xe
= (mwArray(1.0) + rho * chi) * xbar
- rho * chi * v(colon(), end(v, 2, 2));
//
// x(:) = xe; fxe = feval(funfcn,x,varargin{:});
//
x(colon()) = xe;
fxe
= feval(
mwValueVarargout(),
FevalLookup(funfcn, 0, NULL),
mwVarargin(x, varargin.cell(colon())));
//
// func_evals = func_evals+1;
//
func_evals = func_evals + mwArray(1.0);
//
// if fxe < fxr
//
if (tobool(fxe < fxr)) {
//
// v(:,end) = xe;
//
v(colon(), end(v, 2, 2)) = xe;
//
// fv(:,end) = fxe;
//
fv(colon(), end(fv, 2, 2)) = fxe;
//
// how = 'expand';
//
how = "expand";
//
// else
//
} else {
//
// v(:,end) = xr;
//
v(colon(), end(v, 2, 2)) = xr;
//
// fv(:,end) = fxr;
//
fv(colon(), end(fv, 2, 2)) = fxr;
//
// how = 'reflect';
//
how = "reflect";
//
// end
//
}
//
// else % fv(:,1) <= fxr
//
} else {
//
// if fxr < fv(:,n)
//
if (tobool(fxr < fv(colon(), n))) {
//
// v(:,end) = xr;
//
v(colon(), end(v, 2, 2)) = xr;
//
// fv(:,end) = fxr;
//
fv(colon(), end(fv, 2, 2)) = fxr;
//
// how = 'reflect';
//
how = "reflect";
//
// else % fxr >= fv(:,n)
//
} else {
//
// % Perform contraction
// if fxr < fv(:,end)
//
if (tobool(fxr < fv(colon(), end(fv, 2, 2)))) {
//
// % Perform an outside contraction
// xc = (1 + psi*rho)*xbar - psi*rho*v(:,end);
//
xc
= (mwArray(1.0) + psi * rho) * xbar
- psi * rho * v(colon(), end(v, 2, 2));
//
// x(:) = xc; fxc = feval(funfcn,x,varargin{:});
//
x(colon()) = xc;
fxc
= feval(
mwValueVarargout(),
FevalLookup(funfcn, 0, NULL),
mwVarargin(x, varargin.cell(colon())));
//
// func_evals = func_evals+1;
//
func_evals = func_evals + mwArray(1.0);
//
//
// if fxc <= fxr
//
if (tobool(fxc <= fxr)) {
//
// v(:,end) = xc;
//
v(colon(), end(v, 2, 2)) = xc;
//
// fv(:,end) = fxc;
//
fv(colon(), end(fv, 2, 2)) = fxc;
//
// how = 'contract outside';
//
how = "contract outside";
//
// else
//
} else {
//
// % perform a shrink
// how = 'shrink';
//
how = "shrink";
//
// end
//
}
//
// else
//
} else {
//
// % Perform an inside contraction
// xcc = (1-psi)*xbar + psi*v(:,end);
//
xcc
= (mwArray(1.0) - psi) * xbar
+ psi * v(colon(), end(v, 2, 2));
//
// x(:) = xcc; fxcc = feval(funfcn,x,varargin{:});
//
x(colon()) = xcc;
fxcc
= feval(
mwValueVarargout(),
FevalLookup(funfcn, 0, NULL),
mwVarargin(x, varargin.cell(colon())));
//
// func_evals = func_evals+1;
//
func_evals = func_evals + mwArray(1.0);
//
//
// if fxcc < fv(:,end)
//
if (tobool(fxcc < fv(colon(), end(fv, 2, 2)))) {
//
// v(:,end) = xcc;
//
v(colon(), end(v, 2, 2)) = xcc;
//
// fv(:,end) = fxcc;
//
fv(colon(), end(fv, 2, 2)) = fxcc;
//
// how = 'contract inside';
//
how = "contract inside";
//
// else
//
} else {
//
// % perform a shrink
// how = 'shrink';
//
how = "shrink";
//
// end
//
}
//
// end
//
}
//
// if strcmp(how,'shrink')
//
if (tobool(strcmp(how, mwArray("shrink")))) {
//
// for j=two2np1
//
for (iterator_0.Start(two2np1, mwArray::DIN, mwArray::DIN);
iterator_0.Next(&j);
) {
//
// v(:,j)=v(:,1)+sigma*(v(:,j) - v(:,1));
//
v(colon(), j)
= v(colon(), 1.0)
+ sigma * (v(colon(), j) - v(colon(), 1.0));
//
// x(:) = v(:,j); fv(:,j) = feval(funfcn,x,varargin{:});
//
x(colon()) = v(colon(), j);
fv(colon(), j)
= feval(
mwValueVarargout(),
FevalLookup(funfcn, 0, NULL),
mwVarargin(x, varargin.cell(colon())));
//
// end
//
}
//
// func_evals = func_evals + n;
//
func_evals = func_evals + n;
//
// end
//
}
//
// end
//
}
//
// end
//
}
//
// [fv,j] = sort(fv);
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -