【发布时间】:2020-05-23 22:16:51
【问题描述】:
我正在尝试找到以下表达式的解决方案
目标函数:
最小化(| x - c0 | + | y - c1 |)
约束:
0 < x < A 0 < y < B
其中c0、c1、A、B是正常数
按照中给出的转换 http://lpsolve.sourceforge.net/5.1/absolute.htm
我将表达式改写为
约束:
(x - c0) <= xbar -1 *(x - c0) <= xbar (y - c1) <= ybar -1 *(y - c1) <= ybar 0 < x < A 0 < y < B
目标函数:
minimize(xbar + ybar)
但是,我无法实现这一点。 我尝试了以下sn-p
#include "ortools/linear_solver/linear_solver.h"
#include "ortools/linear_solver/linear_expr.h"
MPSolver solver("distanceFinder", MPSolver::GLOP_LINEAR_PROGRAMMING);
MPVariable* x = solver.MakeNumVar(0, A, "x");
MPVariable* y = solver.MakeNumVar(0, B, "y");
const LinearExpr e = x;
const LinearExpr f = y;
LinearExpr X;
LinearExpr Y;
LinearRange Z = slope * e + offset == f; // Where 'slope' & 'offset' are real numbers.
solver.MakeRowConstraint(Z);
const LinearRange r = -1 * (e - c0) <= X;
const LinearRange s = (e - c0]) <= X ;
const LinearRange m = -1 * (f - c1) <= Y;
const LinearRange k = (f - c1) <= Y ;
solver.MakeRowConstraint(r);
solver.MakeRowConstraint(s);
solver.MakeRowConstraint(m);
solver.MakeRowConstraint(k);
MPObjective* const objective = solver.MutableObjective();
objective->MinimizeLinearExpr(X+Y);
我收到了错误, E0206 16:41:08.889048 80935 linear_solver.cc:1577] 不存在解决方案。 MPSolverInterface::result_status_ = MPSOLVER_INFEASIBLE
我的用例总是产生可行的解决方案(我试图找到点和线之间的最小曼哈顿距离)。
我对使用 GOOGLE-OR 工具非常陌生。请提出我可能忽略的任何更简单的解决方案 任何帮助将不胜感激
谢谢, 拉姆
【问题讨论】:
-
问:你有没有尝试过这些建议:lpsolve.sourceforge.net/5.5/Infeasible.htm
-
对不起,我忘了说。这个问题有一个可行的解决方案。我在使用 Google-OR (C++) 的实现部分遇到了困难。感谢您发现问题中的不完整性
-
不,听起来问题在于图书馆认为它无法解决。我引用的链接为您提供了可能的原因。请查看它,看看它是否有帮助。请用您的尝试和结果更新您的帖子。
-
xbar 和 ybar 变量在哪里?
-
我用过 X = xbar ; Y = 代码中的 ybar
标签: c++ linear-programming or-tools absolute-value objective-function