MATLAB求解错误

用Matlab中的Yalmip求解时,遇到图中的问题,应该怎么解决呢?

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 看下这篇博客,也许你就懂了,链接:MATLAB求解非线性0-1整数规划(基于Yalmip工具箱)
  • 除此之外, 这篇博客: Matlab+Yalmip求解速度变慢的解决过程中的 Matlab+Yalmip求解速度变慢的解决过程记录 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    Matlab+Yalmip+其他的求解器是在Matlab中解决各种优化问题的常见方式。但是,在最近的一个项目中,我遇到了一个问题。此项目中,代码主要是一个循环,然后在每个循环中都需要求解若干个规模不变的整数规划问题。每次定义的变量都有相同的变量名,在Matlab工作区中会覆盖之前的变量,因此随着循环的运行,工作区中的变量数并不会增加。整个代码的过程大概如下:

    for
    define variables
    define constraints
    solve
    end
    

    由于这些整数规划问题的规模并不大,所以在最开始的时候,求解器可以在非常快的速度内进行求解。例如,每个循环求解20次整数规划问题,每次所需要的时间不超过1s,因此,一个循环最开始所需的时间在20s之内。然而,随着迭代的逐渐进行,我发现每个循环所需要的计算时间逐渐增加。到了最后,一次循环需要花费我大概700s的时间。100次循环,一共需要消耗10h的时间,这个时间显然是不可接受的。可以从下图中看到,每次循环的计算时间,随着循环的次数基本呈线性增加。

    pic

    最开始,我以为是求解器的问题,但是我试用了三种求解器:Cplex,Gurobi,以及Matlab自带的Intlinprog工具箱,发现都会出现同样的状况。最后我检查了求解后的result,发现在迭代后期,每次求解的solvertime只需要0.068s,然而yalmiptime需要20.3917s!显然,问题是出在了Yalmip上。

    pic2

    在反复百度和Google后,我都没有找到解决方案。最终,我直接去Github去询问了Yalmip的作者Johan大神,然后他给我的回复如下:

    image-20210729191750989

    即,虽然我每次在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的时间,该问题被成功解决。

    image-20210729192106167

    最后,我特别想要对Yalmip的作者Johan表示一个respect!
    (Github讨论区的回复链接:https://github.com/yalmip/YALMIP/discussions/956非常巧的是,在Yalmip的Google Group中,有人在几乎同一时间提了一个和本文一模一样的问题,链接为:https://groups.google.com/g/yalmip/c/DJ5j0CeHbEI)

  • 以下回答来自chatgpt:

    根据提供的参考资料和问题描述,我理解到你在使用MATLAB中的Yalmip工具包进行求解时遇到了问题。你希望解决你的问题,并且在这个问题中,你希望尽早覆盖一个由P顶点表示的多边形凸区域,并且最小化覆盖区域所需的时间。

    根据提供的参考资料,以下是一种可能的解决方案:

    1. 首先,你需要做的是定义约束(Constraints),即无人机需要满足的条件。你可以使用约束表达式,例如x+w <= 1。

    2. 接下来,你需要定义目标函数(Objective),即你希望优化的目标。在这种情况下,你希望最小化覆盖区域所需的时间,可以选择一个适当的目标函数。

    例如: objective = 最小化函数

    1. 然后,你需要设置求解器属性(options),以便在求解问题时使用适当的求解器和设置。你可以使用sdpsettings函数设置求解器选项,例如: options = sdpsettings('solver', 'gurobi')

    2. 接下来,你可以使用sol = optimize(Constraints + Objective, options)来求解问题。这将使用你之前定义的约束、目标函数和求解器选项来解决问题。

    例如: sol = optimize(Constraints + Objective, options)

    1. 最后,你可以通过检查求解结果sol.problem来确定是否成功解决问题。如果sol.problem的值为0,表示求解成功,你可以通过sol.value(x)来获取解决方案。

    例如: if sol.problem == 0 solution = value(x) else disp('求解出错') end

    以上是一个基本的解决方案示例。然而,由于缺乏问题的具体代码和更多上下文信息,这只是一个泛化的解决方案。如果你能提供更多代码或上下文信息,我可能能够提供更具体的帮助。

    请注意,我是根据提供的参考资料和我的IT专业背景进行回答的,实际解决问题可能需要更多细节和调试步骤。如果我的回答不能解决你的问题,请提供更多信息或寻求其他专业人士的帮助。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

要看具体的代码才晓得哦,只看报错提示解决不了