matlab提供了多种用于求解线性程序的算法。例如MATLAB R2012b提供:" Active-Set"," Trust-Region-Refractive"," Interior Point"," Interior Point-convex"," Levenberg-Marquardt"," Trust-drigne-digogleg','lm-line-search'或'sqp'。
但是其他版本的MATLAB支持不同的算法。
我想在用户MATLAB-VERSION支持的所有算法上运行一个循环。我希望他们像Matlab的推荐顺序一样被订购。
我想实现这样的事情:
i=1;
x=[];
while (isempty(x))
options=optimset(options,'Algorithm',Here_I_need_a_list_of_Algorithms(i))
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options);
end
在99%中,此代码应等于
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options);
,但有时由于数值问题(Exitflag -4(,该算法还会回馈一个空数组。如果其他一种算法之一可以找到解决方案,我也想尝试它们。
所以我的问题是:是否有可能自动获取所有linprog-algorithms的列表,这些列表像MATLAB一样被订购的已安装的MATLAB转换支持。
我认为在所有算法中循环也可以在其他情况下有意义。例如,当您需要非常精确的数据并且有很多时间时,您可以全部运行它们并评估给出最佳结果。或者,一个人希望通过所有算法循环,如果想找到哪种算法是具有一定结构的LP的最佳方法。
据我所知,没有自动方法可以做到这一点。如果您真的想这样做,那么最简单的事情就是转到在线文档,并检查以前的版本(在线文档可用于旧版本,而不仅仅是最近的版本(,并构建一些类似这样的变量:
r2012balgos = {'active-set', 'trust-region-reflective', 'interior-point', 'interior-point-convex', 'levenberg-marquardt', 'trust-region-dogleg', 'lm-line-search', 'sqp'};
...
r2017aalgos = {...};
v = ver('matlab');
switch v.Release
case '(R2012b)'
algos = r2012balgos;
....
case '(R2017a)'
algos = r2017aalgos;
end
% loop through each of the algorithms
似乎很无聊,但是只需要大约30分钟。
有一个原因,Mathworks并不像您希望的那样容易,因为您要想要的不是一个好主意。
可以构建一种算法找到解决方案而其他算法没有的人造问题。但是实际上,通常,如果建议的算法找不到解决方案,这并不表示您应该切换算法,则表明您的问题没有很好地构型,您应该考虑修改它,也许通过修改某些约束来进行修改,或重新设计目标功能。
毕竟,为什么要停止循环浏览替代算法?为什么不为其他选项(例如约束公差,最佳公差,最大功能评估数量等(循环循环大量值?这些可能与算法的选择一样多的可能性。很快,您正在运行一种优化算法,以浏览原始优化的元参数空间。
这不是一个很好的计划 - 最好选择一种推荐的算法之一,坚持下去,如果事情不起作用,请专注于改善您对问题的表述,而不是过度对优化本身。