C++ 线性优化目标函数的绝对值

C++ 线性优化目标函数的绝对值,c++,linear-programming,or-tools,absolute-value,objective-function,C++,Linear Programming,Or Tools,Absolute Value,Objective Function,我试图找到下面表达式的解 目标函数: 最小化(| x-c0 |+| y-c1 |) 约束条件: 但是,我无法实现这一点。 我尝试了以下代码片段 #include "ortools/linear_solver/linear_solver.h" #include "ortools/linear_solver/linear_expr.h" MPSolver solver("distanceFinder", MPSolver::GLOP_LINEAR_PROGRAMMING); MPVariable*

我试图找到下面表达式的解

目标函数:

最小化(| x-c0 |+| y-c1 |)

约束条件:

但是,我无法实现这一点。 我尝试了以下代码片段

#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);
#包括“ortools/linear_solver/linear_solver.h”
#包括“ortools/linear\u solver/linear\u expr.h”
MPSolver解算器(“距离查找器”,MPSolver::GLOP_线性规划);
MPVariable*x=solver.MakeNumVar(0,A,“x”);
MPVariable*y=solver.MakeNumVar(0,B,“y”);
常数linearxpr e=x;
常数linearxpr f=y;
线性关系pr X;
线性关系;
线性排列Z=斜率*e+偏移==f;//其中“斜率”和“偏移量”是实数。
求解器.MakeRowConstraint(Z);

const LinearRange r=-1*(e-c0)这里是一个工作示例。您在代码中混淆了变量

const double A = 10.0;
const double B = 8.0;
const double c0 = 6.0;
const double c1 = 3.5;

MPSolver solver("distanceFinder", MPSolver::GLOP_LINEAR_PROGRAMMING);
MPVariable* x = solver.MakeNumVar(0, A, "x");
MPVariable* y = solver.MakeNumVar(0, B, "y");

MPVariable* xbar = solver.MakeNumVar(0, A, "xbar");
MPVariable* ybar = solver.MakeNumVar(0, B, "ybar");

LinearExpr X(x);
LinearExpr Y(y);

const LinearRange r = -1 * (X - c0) <= xbar;
const LinearRange s = (X - c0) <= xbar;
const LinearRange m = -1 * (Y - c1) <= ybar;
const LinearRange k = (Y - c1) <= ybar;

solver.MakeRowConstraint(r);
solver.MakeRowConstraint(s);
solver.MakeRowConstraint(m);
solver.MakeRowConstraint(k);

MPObjective *const objective = solver.MutableObjective();
objective->MinimizeLinearExpr(LinearExpr(xbar) + LinearExpr(ybar));

问:你试过这些建议吗?对不起,我忘了提。这个问题有一个可行的解决办法。我在使用Google或(C++)实现部分遇到困难。谢谢你抓住了问题的不完整性不,听起来问题在于图书馆认为它无法解决。我引用的链接给出了可能的原因。请检查一下,看看是否有帮助。请用你尝试过的内容和结果更新你的帖子。xbar和ybar变量在哪里?我使用了X=xbar;代码中的Y=ybar感谢您的回复。此外,(xbar,ybar)不需要在(A,B)范围内。在我的代码中,我将其设置为“无穷大”。
minimize(xbar + ybar)
#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);
const double A = 10.0;
const double B = 8.0;
const double c0 = 6.0;
const double c1 = 3.5;

MPSolver solver("distanceFinder", MPSolver::GLOP_LINEAR_PROGRAMMING);
MPVariable* x = solver.MakeNumVar(0, A, "x");
MPVariable* y = solver.MakeNumVar(0, B, "y");

MPVariable* xbar = solver.MakeNumVar(0, A, "xbar");
MPVariable* ybar = solver.MakeNumVar(0, B, "ybar");

LinearExpr X(x);
LinearExpr Y(y);

const LinearRange r = -1 * (X - c0) <= xbar;
const LinearRange s = (X - c0) <= xbar;
const LinearRange m = -1 * (Y - c1) <= ybar;
const LinearRange k = (Y - c1) <= ybar;

solver.MakeRowConstraint(r);
solver.MakeRowConstraint(s);
solver.MakeRowConstraint(m);
solver.MakeRowConstraint(k);

MPObjective *const objective = solver.MutableObjective();
objective->MinimizeLinearExpr(LinearExpr(xbar) + LinearExpr(ybar));
x = 6
y = 3.5
xbar = 0
ybar = -0