我正在尝试在LPSolve IDE中解决此问题:
/* Objective function */
min: x + y;
/* Variable bounds */
r_1: 2x = 2y;
r_2: x + y = 1.11 x y;
r_3: x >= 1;
r_4: y >= 1;
但是我得到的答复是:
Model name: 'LPSolver' - run #1
Objective: Minimize(R0)
SUBMITTED
Model size: 4 constraints, 2 variables, 5 non-zeros.
Sets: 0 GUB, 0 SOS.
Using DUAL simplex for phase 1 and PRIMAL simplex for phase 2.
The primal and dual simplex pricing strategy set to 'Devex'.
The model is INFEASIBLE
lp_solve unsuccessful after 2 iter and a last best value of 1e+030
当x=1.801801802
和y=1.801801802
是这里可能的解决方案时,怎么会这样?
答案 0 :(得分:2)
如何找到解决方案
让我们做一些数学运算。
您的问题是:
min x+y
s.t. 2x = 2y
x + y = 1.11 x y
x >= 1
y >= 1
第一个约束2x = 2y
可以简化为x=y
。现在,我们替换整个问题:
min 2*x
s.t. 2*x = 1.11 x^2
x >= 1
然后重新排列:
min 2*x
s.t. 1.11 x^2-2*x=0
x >= 1
从几何学上我们知道1.11 x^2-2*x
产生的向上抛物线的最小值小于零。因此,有两点。这些由二次方程式给出:200/111和0。
其中只有一个满足第二个约束:200/111。
为什么我的求解器找不到此约束
最简单的方法是说这是因为x^2
项(替换前的x*y
是非线性的)。但这远不止于此。非线性问题可以很容易地解决,只要它们是凸的即可。 convex problem是一种约束,它的约束形成一个连续的空间,从而该空间中两点之间绘制的任何线都位于该空间的边界内。
您的问题不是凸面的。约束1.11 x^2-2*x=0
定义了无限个点。这些点中没有两个点可以通过直线连接,该直线停留在约束定义的空间中,因为该空间是弯曲的。如果约束改为1.11 x^2-2*x<=0
,则该空间将是凸形的,因为所有点都可以与保留在其内部的直线相连。
非凸问题是称为NP-Hard的更广泛问题的一部分。这意味着没有(也许不可能)有解决问题的简便方法。我们必须要聪明。
可以处理mixed-integer programming (MIP/MILP)的求解器可以有效地解决许多非凸问题,例如genetic algorithms之类的其他技术也可以。但是,在幕后,这些技术全都依靠美化的猜测和检查。
所以您的求解器会失败,因为问题是非凸性的,并且您的求解器既不够聪明,不足以使用MIP来猜测和检查其求解的方式,也不够聪明,无法使用二次方程式。
我该如何解决问题?
在这种特定情况下,我们能够使用数学快速找到解决方案,因为尽管问题不是凸的,但它是一类特殊情况的一部分。数学家的深入思考为我们提供了处理此类的简单方法。
但是请考虑该问题的一些概括:
(a) a x^3+b x^2+c x+d=0
(b) a x^4+b x^3+c x^2+d x+e =0
(c) a x^5+b x^4+c x^3+d x^2+e x+f=0
(a)具有三个必须检查的潜在解决方案(确切的解决方案是tricky),(b)具有四个(trickier),并且(c)具有五个。 (a)和(b)的公式比二次公式复杂得多,并且数学家证明(c)的no formula可以使用“基本运算”表示。相反,我们必须求助于夸张的猜测和检查。
因此,我们用来解决您的问题的技术不能很好地推广。这就是生活在非凸和NP-hard领域的意义,并且是资助数学,计算机科学和相关领域研究的一个很好的理由。