Matlab提供了多种解决线性程序的算法。 例如,Matlab R2012b提供:' active-set',' trust-region-reflect',' interior-point',' interior-point-convex& #39;,' levenberg-marquardt',' trust-region-dogleg',' 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),算法会返回一个空数组。如果其他算法之一有可能找到解决方案,我也想尝试一下。
所以我的问题是: 是否有可能自动获取所安装的Matlab版本支持的所有linprog算法的列表,如Matlab推荐的那样。
我认为循环遍历所有算法在其他场景中也是有意义的。例如,当您需要非常精确的数据并且有大量时间时,您可以运行所有数据,而不是评估哪些数据能够获得最佳结果。 或者想要遍历所有算法,如果想要找到哪种算法对于具有特定结构的LP最佳。
答案 0 :(得分:1)
据我所知,没有自动方法可以做到这一点。如果您真的想要这样做,最简单的方法是转到在线文档,并查看以前的版本(在线文档可用于旧版本,而不仅仅是最新版本),并构建一些像这样的变量:
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并没有像你希望的那样简单,因为你所要求的并不是一个好主意。
可以构建人为问题,其中一种算法找到解决方案,而其他算法则找不到解决方案。但实际上,通常如果推荐的算法没有找到解决方案,这并不表示你应该切换算法,它表明你的问题没有得到很好的表述,你应该考虑修改它,可能是通过修改一些约束,或重新制定目标函数。
毕竟,为什么停止只是循环使用替代算法?为什么不循环使用其他选项的许多值,例如约束公差,最优公差,最大功能评估数等等?这些可能具有影响事物作为算法选择的可能性。很快你就会运行一个优化算法来搜索原始优化的元参数空间。
这不是一个很好的计划 - 可能更好的选择一种推荐的算法,坚持下去,如果事情没有成功,那么就要专注于改善问题的表达,而不是过度调整优化本身。