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

现在我有以下问题:

  1. 有没有可能用 Cplex API 方便地解决这个问题,还是我必须自己实施这个过程?

  2. 如果可能的话,我如何获得最终的目标值: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;

}

但实际上是行不通的。请帮助! =)