我很确定以下方差目标函数应该是一个凸二次问题。我的目标函数如下:
是随机变量,和向量的元素。是一个的已知矩阵。
我试图fmincon
通过对最终变量进行阈值化来解决这个问题。然而,每次我用不同的初始点运行算法时,我都会得到不同的答案。步长和tolFun
是1e-100
。
你能帮我解释一下这个问题吗?
我很确定以下方差目标函数应该是一个凸二次问题。我的目标函数如下:
是随机变量,和向量的元素。是一个的已知矩阵。
我试图fmincon
通过对最终变量进行阈值化来解决这个问题。然而,每次我用不同的初始点运行算法时,我都会得到不同的答案。步长和tolFun
是1e-100
。
你能帮我解释一下这个问题吗?
您可以在 MATLAB 下使用 YALMIP 制定和解决此问题。您可以免费下载 YALMIP http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Main.Download。YALMIP 会为你做脏活。安装 YALMIP,运行 yalmiptest 测试安装,阅读http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Tutorials.Basics。
当 YALMIP 默认选择 cplex 作为求解器时,我生成了 L= rand(1000,20) 并在 3 秒内解决了以下问题。它还使用 scip 在 3 秒内解决了它。这些时间是如果我不施加约束 X >= 1 (请参阅下一段,因为我对您的优化问题实际上是什么感到困惑)。
但是,这是很重要的一点,正如您所说,问题始终具有最佳目标值 = 0,这是通过 X = 全零来实现的。因此,您需要对 X 进行一些其他约束或使用不同的公式来解决不平凡的问题。如果你这样做,运行时间可能会大大增加。我一直忽略 ξ >= 1;我不知道你的问题是什么。我假设 X 是优化(决策)变量的向量。所以你需要解决这个问题。清楚地说明目标和决策变量是什么,以及问题输入是什么。我不知道 ξ 是什么,也不知道它是如何进入目标函数的。好的,这是我的猜测:您的意思是 X 的所有元素都 >= 1。对吗?如果是这样,这将需要很长时间才能运行。
n = size(L,1);
X = intvar(n,1) % declares X to be an n by 1 vector of integer variables
sol = optimize([X >= 1],var(X'*L))
如果你想指定一个特定的求解器,例如 scip,而不是让 YALMIP 从已安装的求解器中挑选它认为最好的,使用
sol = optimize([X >= 1],var(X'*L),sdpsettings('solver','scip'))
如果有任何其他约束,请将它们放在 [] 内,用 , 或 ; 分隔
问题解决后,得到最优参数值(即 argmin)
value(X)
这是作为混合整数 QP 解决的。YALMIP 将其放入求解器所需的形式。
顺便说一句,我相信 FMINCON 会忽略 1e-100 的容差;它只是无法处理,所以它会使用“它想要”的东西。
除了上面评论者提到的问题之外,让我评论一下您的问题的一些特殊方面:
arg min var(sum(L) + X*L) xi>=0
其中 xi s 是随机变量和向量 X 的元素, sum(L) 是一个向量,由 L 的每一列中的元素的和分别构成。
正如 hardmath 指出的那样,将列在将导致等效的目标函数值。变量的双线性乘积也可以表示非凸性。像其他评论者一样,我无法理解您的表述。但是,如果它是非凸的,那就可以解释为什么不同的初始点会产生不同的解决方案。
向量 X 由 1000 个变量组成,它们都应该是正整数。L 是一个 1000*20 的已知矩阵。
我试图用 fmincon 解决这个问题并舍入最终变量。
你想要整数可行的解决方案还是整数最优的解决方案?后者需要混合整数编程,并且会更昂贵。另外,fmincon
不会工作。在任何一种情况下,在病理情况下,四舍五入也可能导致每次都无法获得相同的解决方案。
我试图用 fmincon 解决这个问题并舍入最终变量。然而,每次我用不同的初始点运行算法时,我都会得到不同的答案,步长和 tolFun 是 1e-100。
将函数评估的容差设置为可能是矫枉过正,除非您希望您的函数评估在某个地方或者。凸优化算法返回(局部)- 一些公差的最佳解决方案. 这些算法将返回满足终止容差标准的第一个迭代,因此可能是不同的初始猜测导致迭代序列都满足终止容差,只是在可行集中的不同点。例如,也可能是问题具有多个(局部)最小值,即使在函数底部“平坦”的凸情况下也会发生这种情况。同样,hardmath 的观察表明可能会发生类似的情况。