私は次の式の解決策を見つけようとしています
目的関数:
最小化(| 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);
エラーが発生します。E020616: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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加