用Matlab中的Yalmip求解时,遇到图中的问题,应该怎么解决呢?
Matlab+Yalmip+其他的求解器是在Matlab中解决各种优化问题的常见方式。但是,在最近的一个项目中,我遇到了一个问题。此项目中,代码主要是一个循环,然后在每个循环中都需要求解若干个规模不变的整数规划问题。每次定义的变量都有相同的变量名,在Matlab工作区中会覆盖之前的变量,因此随着循环的运行,工作区中的变量数并不会增加。整个代码的过程大概如下:
for
define variables
define constraints
solve
end
由于这些整数规划问题的规模并不大,所以在最开始的时候,求解器可以在非常快的速度内进行求解。例如,每个循环求解20次整数规划问题,每次所需要的时间不超过1s,因此,一个循环最开始所需的时间在20s之内。然而,随着迭代的逐渐进行,我发现每个循环所需要的计算时间逐渐增加。到了最后,一次循环需要花费我大概700s的时间。100次循环,一共需要消耗10h的时间,这个时间显然是不可接受的。可以从下图中看到,每次循环的计算时间,随着循环的次数基本呈线性增加。
最开始,我以为是求解器的问题,但是我试用了三种求解器:Cplex,Gurobi,以及Matlab自带的Intlinprog工具箱,发现都会出现同样的状况。最后我检查了求解后的result,发现在迭代后期,每次求解的solvertime只需要0.068s,然而yalmiptime需要20.3917s!显然,问题是出在了Yalmip上。
在反复百度和Google后,我都没有找到解决方案。最终,我直接去Github去询问了Yalmip的作者Johan大神,然后他给我的回复如下:
即,虽然我每次在for循环中定义的变量的名称是相同的,看似在matlab中,定义名称相同的变量会覆盖原变量。但是,在Yalmip中,原有的变量并不会被删除,而新的变量会被源源不断地创建,这会导致变量数越来越多。因此,作者给了我两种方法:
方法一:将变量的定义放在循环外面,即:
define variables
define constraints
for
add stuff that changes
solve
end
方法二:在定义变量前使用yalmip(‘clear’),即:
for
yalmip('clear')
define variables
define constraints
solve
end
最终,我使用了方法2,然后解决了上述的问题。从下图可以看到,即使运行了750次循环,大部分循环所需的时间都在10s左右,只有少部分需要30s的时间,该问题被成功解决。
最后,我特别想要对Yalmip的作者Johan表示一个respect!
(Github讨论区的回复链接:https://github.com/yalmip/YALMIP/discussions/956非常巧的是,在Yalmip的Google Group中,有人在几乎同一时间提了一个和本文一模一样的问题,链接为:https://groups.google.com/g/yalmip/c/DJ5j0CeHbEI)
根据提供的参考资料和问题描述,我理解到你在使用MATLAB中的Yalmip工具包进行求解时遇到了问题。你希望解决你的问题,并且在这个问题中,你希望尽早覆盖一个由P顶点表示的多边形凸区域,并且最小化覆盖区域所需的时间。
根据提供的参考资料,以下是一种可能的解决方案:
首先,你需要做的是定义约束(Constraints),即无人机需要满足的条件。你可以使用约束表达式,例如x+w <= 1。
接下来,你需要定义目标函数(Objective),即你希望优化的目标。在这种情况下,你希望最小化覆盖区域所需的时间,可以选择一个适当的目标函数。
例如: objective = 最小化函数
然后,你需要设置求解器属性(options),以便在求解问题时使用适当的求解器和设置。你可以使用sdpsettings函数设置求解器选项,例如: options = sdpsettings('solver', 'gurobi')
接下来,你可以使用sol = optimize(Constraints + Objective, options)来求解问题。这将使用你之前定义的约束、目标函数和求解器选项来解决问题。
例如: sol = optimize(Constraints + Objective, options)
例如: if sol.problem == 0 solution = value(x) else disp('求解出错') end
以上是一个基本的解决方案示例。然而,由于缺乏问题的具体代码和更多上下文信息,这只是一个泛化的解决方案。如果你能提供更多代码或上下文信息,我可能能够提供更具体的帮助。
请注意,我是根据提供的参考资料和我的IT专业背景进行回答的,实际解决问题可能需要更多细节和调试步骤。如果我的回答不能解决你的问题,请提供更多信息或寻求其他专业人士的帮助。
要看具体的代码才晓得哦,只看报错提示解决不了