首先,您应该set.seed(1)在代码的开头添加(或任何其他种子),以便它可以重现。来到你的问题:
来自?solve.QP:
meq the first meq constraints are treated as equality constraints, all further as inequality constraints (defaults to 0).
因此,当您设置 时meq=1,您是在告诉solve.QP第一个约束不能是不等式,而是等式:换句话说,您是在说π1必须为 0。事实上,solve.QP返回一个解决方案,其中π1=0.
solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq=1, factorized = F)
$solution
[1] 0.0000000 0.3582641 0.6358091
$value
[1] -12.71193
$unconstrained.solution
[1] 0.2024494 0.2646992 0.5357331
无论如何,因为你只需要πi≥0i=1,…,3,你必须设置meq=0,即你需要告诉solve.QP所有的约束都是不等式约束。无论如何,您甚至可以避免meq=0在对 的调用中传递值solve.QP,因为meq=0这是默认值。现在,既然无约束解满足约束,那么它也是约束解,这就是为什么两个解相等:
solve.QP(Dmat = Dmat, dvec = dvec, Amat = Amat, bvec = bvec, meq=0, factorized = F)
$solution
[1] 0.2024494 0.2646992 0.5357331
$value
[1] -12.91278
$unconstrained.solution
[1] 0.2024494 0.2646992 0.5357331
编辑关于其他解决方案的可能性,因此需要全局方法。这个特定的优化问题属于凸优化问题家族。对于这类问题,局部最小值也是全局最小值。由于您已经找到了局部最小值,因此您无需执行任何其他操作。请注意,对于另一个非凸优化问题,这将不再适用。
两个旁注:
- 您不能对 施加严格的不等式约束
solve.QP,因此编写约束的正确方法是 πi≥0i=1,…,3, 不是πi>0i=1,…,3
- 我发现
solve.QPfromquadprog有一个违反直觉的界面,它可能不如替代品那么健壮。我建议你看看lseifrom package limSolve。您可以在此处找到一个工作示例。由于界面不同,如果您决定使用lsei.
编辑:OP 似乎对严格的不等式约束特别感兴趣,因此我添加了一些众所周知的技巧来处理它们。首先,用不严格的不等式约束来解决问题:如果约束在受约束问题的解决方案中不活跃,即,如果解决方案满足严格的不等式约束,那么你就完成了。例如,在使用非严格不等式约束的第二种情况下,找到了所有系数都是严格的meq=0解solve.QP>0,即约束在约束解中不活跃。
如果一个或多个约束在解决方案中处于活动状态(例如,通过solve.QPwhen找到的解决方案meq=1),那么一个技巧是添加一个小的正数ϵ到约束。例如,代替约束πi>0i=1,…,3, 你使用约束πi≥ϵi=1,…,3. 在这种情况下找到的解决方案将解决最初的严格不等式约束,因为ϵ>0. 这种方法的问题是解决方案将取决于ϵ. 然而:
- 总是可以解决一系列问题ϵ并深入了解解决方案在以下方面的行为ϵ.
- 如果优化问题模拟一个真实的物理问题,那么对物理变量的严格不等式约束通常需要一些“容差”。例如,假设您想要优化某些机器的效率,其效率与旋转轴与其静态外壳之间的间隙(例如,转子-定子密封间隙)有关。燃气轮机)。距离δ旋转部分和静态部分之间确实需要严格为正(如果转子和定子接触,则肯定会发生灾难!)。但是,为了确保转子和定子不接触,间隙需要高于某些装配/制造公差:您不能接受这样的解决方案,例如,δ=0.001微米,因为您永远无法制造出具有如此小的间隙的设计。你需要解决一个有约束的问题δ>ϵ在哪里,说,ϵ=100微米。因此,当涉及到真实的物理系统并且似乎需要严格的不等式约束时,通常我们真正需要的不是具有“物理意义”容限的严格不等式约束。