2016-04-21 92 views
-1

我刚开始使用CPLEX Python API中,我和我的模型创建linear_constraints有问题CPLEX蟒蛇和约束

我想要做这样的事情:

dvar float+ x[] 

Minimize: Sum(i in I) C[i] * x[i] 

subject to: 
sum(i in I) x[i] <= constantValue 

,我的问题是,我不知道如何使约束在Python API

cpx.linear_constraints.add(
      lin_expr= 1, 
      senses=["L"], 
      rhs=constantValue, 
      range_values= 2, 

我要问你是什么我需要输入1)和x [I]表2),以获得SUM这也需要一个决策变量。

+0

我建议你看看了随CPLEX示例脚本(如lpex1.py,等等。)。 – rkersh

回答

2

下面是一个例子:

>>> import cplex 
>>> c = cplex.Cplex() 
>>> c.variables.add(names = ["x1", "x2", "x3"]) 
>>> c.linear_constraints.add(lin_expr = [cplex.SparsePair(ind = ["x1", "x3"], val = [1.0, -1.0]), 
           cplex.SparsePair(ind = ["x1", "x2"], val = [1.0, 1.0]), 
           cplex.SparsePair(ind = ["x1", "x2", "x3"], val = [-1.0] * 3), 
           cplex.SparsePair(ind = ["x2", "x3"], val = [10.0, -2.0])], 
         senses = ["E", "L", "G", "R"], 
         rhs = [0.0, 1.0, -1.0, 2.0], 
         range_values = [0.0, 0.0, 0.0, -10.0], 
         names = ["c0", "c1", "c2", "c3"],) 
>>> c.linear_constraints.get_rhs() 
[0.0, 1.0, -1.0, 2.0] 

其中range_values是漂浮的列表,指定左手侧,并且每个线性约束的右手侧之间的差异。如果range_values [i]> 0(零),那么约束i被定义为rhs [i] < = rhs [i] + range_values [i]。如果range_values [i] < 0(零),则约束i被定义为rhs [i] + range_value [i] < = a * x < = rhs [i]。我建议将其保留为默认值(空白)。

要定义一个总和只是表示所有变量和一的载体,例如,

NumCols = 10 
vars = [ 'x'+str(n) for n in xrange(1,NumCols+1) ] 
coef = [1]*NumCols 
cpx.linear_constraints.add(
     lin_expr= [cplex.SparsePair(ind = vars, val = coef)] , 
     senses=["L"], 
     rhs=[constantValue]) 
+0

您可能会考虑将第二个示例放在答案的顶部,并简单地说可以省略可选的range_values参数(它更直接地回答问题)。顶部的例子可能有点压倒性。此外,值得注意的是,有多种方法可以做到这一点。您可以使用索引而不是名称,列表而不是使用SparsePair的列表等。 – rkersh