Cplex 中的目标编程
Goal Programming in Cplex
假设我有两个目标。我想非常接近地实现该目标:
i=1) profit goal: 12 + 9y ≥ 125
i=2) cost-goal: 5 + 7y ≤ 50
在文献中,您可以通过插入代表偏差的变量来进行目标规划。假设变量 ai 是高于目标值与目标 I 的偏差,bi 是低于目标值与目标 I 的偏差。你得到以下约束:
12 + 9y -a1 + b1 = 125
5 + 7y -a2 + b2 = 50
在最后一步中,您创建了 objective 函数,您可以在其中为每个偏差使用惩罚因子 (p) 来惩罚偏差。
minimize: pd1*b1 + pa1*a1 + pd2*b2 + pa2*a2
我正在使用 Cplex API,我看到您可以使用 Cplex-Goals:
IloCplex.Goal
现在我有以下问题:
有没有可能用 Cplex API 方便地解决这个问题,还是我必须自己实施这个过程?
如果可能的话,我如何获得最终的目标值:12 + 9y 和 5 + 7y?
是的,这绝对可以使用 CPLEX。事实上,您已经通过引入 a1、a2、b1 和 b2 完成了大部分需要的公式。现在,你只需要创建一个 Cplex 模型对象,给它 objective 并解决它。 (不需要IloCplex.Goal
)直接解一个LP就可以了
看看这些 Java examples 中的任何一个,并将它们作为模板。
只需设置您的 objective 功能。 (pa0,pb1等为常量)
IloNumExpr obj = cplex.sum(cplex.prod(pa0, a[0]),
cplex.prod(pa1, a[1]),
cplex.prod(pb0, b[0]),
cplex.prod(pb1, b[1]));
model.add(IloMinimize(env, obj));
然后,让 CPLEX 求解您的 LP,您可以简单地获得 a[0]、a[1]、b[0] 和 b[1] 的最优值,以查看与目标的偏差。 (请注意,只有 a 或 b 中的一个为正。)使用 cplex.getValues(x)
查询变量值。
希望对您有所帮助。
像这样:
// 决策变量
dvar int x;
dvar int y;
//obj function
IloNumExpr obj = cplex.sum(cplex.prod(pa0, a[0]),
cplex.prod(pa1, a[1]),
cplex.prod(pb0, b[0]),
cplex.prod(pb1, b[1]));
model.add(IloMinimize(env, obj));
// constraints
subject to {
12* x + 9*y -a1 + b1 <= 125;
5* x + 7*y -a2 +b2 <= 50;
}
但实际上是行不通的。请帮助! =)
假设我有两个目标。我想非常接近地实现该目标:
i=1) profit goal: 12 + 9y ≥ 125
i=2) cost-goal: 5 + 7y ≤ 50
在文献中,您可以通过插入代表偏差的变量来进行目标规划。假设变量 ai 是高于目标值与目标 I 的偏差,bi 是低于目标值与目标 I 的偏差。你得到以下约束:
12 + 9y -a1 + b1 = 125
5 + 7y -a2 + b2 = 50
在最后一步中,您创建了 objective 函数,您可以在其中为每个偏差使用惩罚因子 (p) 来惩罚偏差。
minimize: pd1*b1 + pa1*a1 + pd2*b2 + pa2*a2
我正在使用 Cplex API,我看到您可以使用 Cplex-Goals:
IloCplex.Goal
现在我有以下问题:
有没有可能用 Cplex API 方便地解决这个问题,还是我必须自己实施这个过程?
如果可能的话,我如何获得最终的目标值:12 + 9y 和 5 + 7y?
是的,这绝对可以使用 CPLEX。事实上,您已经通过引入 a1、a2、b1 和 b2 完成了大部分需要的公式。现在,你只需要创建一个 Cplex 模型对象,给它 objective 并解决它。 (不需要IloCplex.Goal
)直接解一个LP就可以了
看看这些 Java examples 中的任何一个,并将它们作为模板。
只需设置您的 objective 功能。 (pa0,pb1等为常量)
IloNumExpr obj = cplex.sum(cplex.prod(pa0, a[0]),
cplex.prod(pa1, a[1]),
cplex.prod(pb0, b[0]),
cplex.prod(pb1, b[1]));
model.add(IloMinimize(env, obj));
然后,让 CPLEX 求解您的 LP,您可以简单地获得 a[0]、a[1]、b[0] 和 b[1] 的最优值,以查看与目标的偏差。 (请注意,只有 a 或 b 中的一个为正。)使用 cplex.getValues(x)
查询变量值。
希望对您有所帮助。
像这样: // 决策变量 dvar int x; dvar int y;
//obj function
IloNumExpr obj = cplex.sum(cplex.prod(pa0, a[0]),
cplex.prod(pa1, a[1]),
cplex.prod(pb0, b[0]),
cplex.prod(pb1, b[1]));
model.add(IloMinimize(env, obj));
// constraints
subject to {
12* x + 9*y -a1 + b1 <= 125;
5* x + 7*y -a2 +b2 <= 50;
}
但实际上是行不通的。请帮助! =)