c++ - 线性优化目标函数中的绝对值
问题描述
我正在尝试找到以下表达式的解决方案
目标函数:
最小化(| 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)
但是,我无法实现这一点。我尝试了以下代码段
#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 工具非常陌生。请提出我可能忽略的任何更简单的解决方案任何帮助将不胜感激
谢谢,拉姆
解决方案
这是一个工作示例。您在代码中混淆了变量
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
推荐阅读
- node.js - Express 服务器无法将数据推送到 AWS RDS?
- java - XML-22103:(致命错误)DOMResult 不能是这种节点
- asp-classic - response.redirect 到另一个带有免责声明的网站
- ios - In App Sandbox 不工作 IOS 模拟器 - Flutter
- mysql - 将数据插入我的数据库时出错
- android - 颤振:第 1 行第 32 列出错:媒体类型无效:预期 /[^()<>@,;:"\\/[\]?={} \t\x00-\x1F\x7F]+/
- python - 我想将存储在文件夹中的所有图像添加到 django 中的网站
- javascript - tabulator.js - scrollToRow() doesn't work on tree?
- javascript - 从类中的对象引用外部 this
- javascript - 尝试使用 javascript 根据 mapbox 中的多个数字更改颜色时,“插值”表达式出错