2

我正在尝试使用 MatLab 的 fmincon 函数和 SQP 算法来解决非线性约束优化问题。正如我在文献研究中发现的那样,这个求解器已成功应用于我的问题。

我知道我的问题的解决方案,但 fmincon 很难可靠地找到它。在我的边界内使用随机生成的起始值运行优化 100 次时,我得到了大约 40% 的好结果。“好”意味着结果接近我接受的最佳值,尽管这些“好”结果对应于不同的 ExitFlags。最常见的是退出标志 -2 和 2:

    ExitFlag = 2 
    Local minimum possible. Constraints satisfied. 
    fmincon stopped because the size of the current step is less than the selected value of the step size tolerance and constraints are  satisfied to within the selected value of the constraint tolerance. 

    ExitFlag = -2 
    No feasible solution found. 
    fmincon stopped because the size of the current step is less than the selected value of the step size tolerance but constraints are not satisfied to within the selected value of the constraint tolerance. 

“不良”结果偏离最佳解决方案的 2% 左右,并且也对应于 ExitFlags 2 和 -2。

我玩弄了公差,但没有成功。当放宽约束容差时,ExitFlag -2 的数量会减少,并且会出现一些 ExitFlag 1 的情况,但因此与最优解的偏差会增加。

一个大问题似乎是步长违反了它的容差。由于步长/步长范数太小(X 的相对变化低于 TolX),求解器通常在 2 或 3 次迭代后退出。有没有办法解决这些问题?我想调整解算器 In 以可靠地获得适当的结果。

供您参考,使用的选项:

    options=optimset('fmincon');
    options=optimset(options,...
                     'Algorithm','sqp',...
                     'ScaleProblem','obj-and-constr',...
                     'TypicalX',[3, 50, 3, 40, 50, 50],...
                     'TolX',1e-12,...%12
                     'TolFun',1e-8,...%6
                     'TolCon',1e-3,...%6
                     'MaxFunEvals',1000,...  %1000
                     'DiffMinChange',1e-10);
4

0 回答 0