如何用python调用cplex?

我的思路是在python中先随机生成两组数据  再将随机生成的两组数据带入到cplex中  最后将两组结果求平均   求这个思路的python代码?我的cplex代码如下

模型文件:

{int}Experts={1,2,3,4,5};
 {int}Alternatives={1,2,3,4,5,6};
 {int}Attribute={1,2,3};
 {int}Boundary_parameter={1,2,3};
 
  float opinion[Experts][Alternatives][Attribute]=...;
 float lambda[Experts]=...;
 float w[Attribute]=...;
 float uk[Experts]=...;
 
 dvar float+ u;
 dvar float+ adjusted_opinions[Experts][Alternatives][Attribute];
  dvar int+ F[Experts][Alternatives];
  dvar int+ FC[Alternatives];
  dvar float+ PV[Experts][Alternatives];
  dvar float+ PVC[Alternatives];
  dvar boolean Y[Experts][Alternatives][Boundary_parameter];
  dvar boolean YC[Alternatives][Boundary_parameter];
  dvar float+ theta[Experts][Boundary_parameter];
  dvar float+ theta_C[Boundary_parameter];
  dvar float+ A[Experts][Alternatives];
   dvar float+ B[Experts][Alternatives][Attribute];
  dvar boolean X[Experts][Alternatives][Attribute];
   dvar float+ AE;
   
 minimize u;
 subject to {
   c1:
     sum(K in Experts,I in Alternatives,J in Attribute)
         abs(opinion[K][I][J]-adjusted_opinions[K][I][J])/6==u;
   
   c2:
   forall(K in Experts,I in Alternatives,J in Attribute)
       X[K][I][J]<=1000*B[K][I][J];     
  
   c3:
     forall(K in Experts,I in Alternatives,J in Attribute)
         abs(opinion[K][I][J]-adjusted_opinions[K][I][J])<=1000*X[K][I][J];    
         
   c4:
     forall(K in Experts,I in Alternatives)
     abs(F[K][I]-FC[I])==A[K][I];
     
   c5:
     sum(K in Experts,I in Alternatives)
        A[K][I]<=(1-0.9)*5*6*2;
        
   c6:
     forall(K in Experts,I in Alternatives)
       sum(J in Attribute)
         w[J]*adjusted_opinions[K][I][J]/6==PV[K][I];
         
   c7:
      forall(I in Alternatives)
       sum(K in Experts)
         lambda[K]*PV[K][I]==PVC[I];
         
   c8:
     forall(K in Experts,I in Alternatives,J in Attribute)
     abs(opinion[K][I][J]-adjusted_opinions[K][I][J])==B[K][I][J];
     
   c9:
     forall(K in Experts,I in Alternatives,J in Attribute)
      B[K][I][J]/6<=uk[K];
      
   c10:
     forall(K in Experts,I in Alternatives)
     sum(P in Boundary_parameter)
       Y[K][I][P]==F[K][I]; 
       
   c11:
     forall(I in Alternatives)
     sum(P in Boundary_parameter)
       YC[I][P]==FC[I];
       
   c12:
     forall(K in Experts,I in Alternatives,P in Boundary_parameter)
       PV[K][I]-theta[K][P]<=Y[K][I][P];
       
   c13:
      forall(K in Experts,I in Alternatives,P in Boundary_parameter)
       Y[K][I][P]-1<=PV[K][I]-theta[K][P];
       
   c14:
      forall(I in Alternatives,P in Boundary_parameter)
       PVC[I]-theta_C[P]<=YC[I][P];
       
   c15:
      forall(I in Alternatives,P in Boundary_parameter)
       YC[I][P]-1<=PVC[I]-theta_C[P];
       
   c16:
      forall(K in Experts,P in Boundary_parameter){
      if(P == 1){
     sum(I in Alternatives)
            Y[K][I][P]==6; 
          }} 
     
    c17:
    forall(K in Experts,P in Boundary_parameter){
      if(P == 2){
     sum(I in Alternatives)
            Y[K][I][P]==4; 
          }}      
   
     
    c18:
    forall(K in Experts,P in Boundary_parameter){
      if(P == 3){
     sum(I in Alternatives)
            Y[K][I][P]==2; 
          }}
          
    c19:
      forall(P in Boundary_parameter){
      if(P == 1){
     sum(I in Alternatives)
            YC[I][P]==6; 
          }} 
     
    c20:
    forall(P in Boundary_parameter){
      if(P == 2){
     sum(I in Alternatives)
            YC[I][P]==4; 
          }}      
     
     
    c21:
    forall(P in Boundary_parameter){
      if(P == 3){
     sum(I in Alternatives)
            YC[I][P]==2; 
          }}
          
    c22:
      forall(K in Experts,I in Alternatives,J in Attribute)
      adjusted_opinions[K][I][J]<=6; 
      
    c23:
      sum(K in Experts,I in Alternatives,J in Attribute)
       X[K][I][J]==AE;              
  }                  

 

数据文件:

lambda=[0.2    0.2    0.2    0.2 0.2];
uk=[0.1 0.1 0.1 0.1 0.1];
w=[0.3    0.4    0.3];

opinion=[[[5.02    5.66    2.47]
[3.15    3.61    2.79]
[2.98    5.96    1.82]
[1.53    4.24    1.67]
[0.4    4.85    1.66]
[5.09    1.24    0.99]]
        
[[5.16    0.8    0.02]
[2.88    0.67    2.13]
[3.27    1.96    5.48]
[5.73    1.7    2.03]
[4.38    4.34    0.59]
[2.37    5.08    5.09]]
        
[[0.66    0.42    4.41]
[3.97    0.28    5.42]
[1.16    3.81    4.29]
[4.1    4.67    4.29]
[3.6    5.43    4.77]
[5.44    5.62    1.86]]
        
[[5.65    4.45    4.28]
[0.71    3.37    1.67]
[0.14    0.53    5.3]
[0.28    2.58    5.24]
[5.85    5.12    5.63]
[3.87    2.42    5.18]]
        
[[1.37    2.1    4.03]
[2.55    0.44    4.63]
[2.37    5.29    2]
[3.02    0.76    4.02]
[0.5    5.35    3.83]
[0.74    5.04    1.83]]];

res_x=[] ##定义一个初始空向量
for i in range(100): ###循环100次
    建立规划方程
    求解变量值x  ###求解出变量的值5个变量,x的格式就是 类似这种 [2,3,4,5,2]
    res_x.append(x) ##x 的值存下来
    ###res_x的最终格式是[[],[],[]] 这种
print(np.array(res_x).mean(axis=0))  ###按列求平均 ,求出来的值是 [2,3,4,5,2] 这种格式,也就是每个变量的平均值

 

python随机数据怎么代入cplex?

模型文件是不是需要改成python代码?

我完全不懂python啊   这个是我要问的啊

或者MATLAB  调用cplex?

 

python 可以调用cplex 求解器,python 求解规划问题的有很多包。你是要解规划问题吗?

是的  一般要求0 1 混合规划

我最主要的问题是  我想自动生成n组数据   然后把这些数据的结果求平均    如果单单求解规模模型  我就直接用cplex求解了   就不需要这么麻烦了

import numpy as np
a=np.random.rand(10)
print(a)
b=np.random.rand(10)
print(b)
c=np.array([a,b])
c.mean(axis=0)
print(c)

##这是个简单的随机,求平均的

生成随机数据肯定简单   要把随机生成的数据带到cplex中  再求平均

import random
import numpy as np
import cplex
from cplex.exceptions import CplexError

#my_obj = [1,2]
my_obj=[random.randint(3,6),random.randint(1,4)]
print("随机目标系数:",my_obj)
my_ub = [20,20]
my_lb = [0,0]
my_ctype = "II"
my_colnames = ["x1", "x2"]
my_rhs = [20]
my_sense = "L"


def populatebyrow(prob):
    prob.objective.set_sense(prob.objective.sense.maximize)
    prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub, types=my_ctype,
                       names=my_colnames)
    rows = [[["x1", "x2"], [2,1]]]
    prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
                                rhs=my_rhs)

try:
    my_prob = cplex.Cplex()
    handle = populatebyrow(my_prob)
    my_prob.solve()
    
except CplexError as exc:
    print(exc)

print("Solution value  = ", my_prob.solution.get_objective_value())
x = my_prob.solution.get_values()
print(x)
print("变量平均值:",np.array(x).mean())

这样?

大神  能不能把每行代码的意思给我标注一下啊   我确实菜鸟   求求大神了  跪谢

## Maximize  x1 + 2*x2
## subject to
#### 2*x1+x2<=20

import random
import numpy as np
import cplex
from cplex.exceptions import CplexError

#my_obj = [1,2]
my_obj=[random.randint(3,6),random.randint(1,4)] ##指定范围内随机整数
print("随机目标系数:",my_obj)
my_ub = [20,20] #x1,x2变量的最大取值 
my_lb = [0,0] ##x1,x2变量的最小取值
my_ctype = "II" ##整形
my_colnames = ["x1", "x2"] ##变量
my_rhs = [20] ##约束里的数值 2*x1+x2<=20 这里的20
my_sense = "L" ##L 是小于

###这里就对应上面的变量,,只需要改rows 就行了
def populatebyrow(prob):
    prob.objective.set_sense(prob.objective.sense.maximize)
    prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub, types=my_ctype,
                       names=my_colnames)
    rows = [[["x1", "x2"], [2,1]]]
    prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
                                rhs=my_rhs)

###求解
try:
    my_prob = cplex.Cplex()
    handle = populatebyrow(my_prob)
    my_prob.solve()
    
except CplexError as exc:
    print(exc)

##获取目标值
print("Solution value  = ", my_prob.solution.get_objective_value())
x = my_prob.solution.get_values()
##打印变量值
print(x)
##求平均
print("变量平均值:",np.array(x).mean())

 

这种复杂一点的线性规划怎么写啊

比如 k=3  i=3 j=3   那么v(K,I,J)的值为 3个3乘3的矩阵   这个v(K,I,J)怎么表示啊

大神   再帮我看看吧

我想要随机生成1000组v(K,I,J)  把生成的v(K,I,J)带入到上述线性规划中  再将得到的变量求平均

我错了   我应该一开始就把自己的需求表述清楚

比如 k=3  i=3 j=3   那么v(K,I,J)的值为 3个3乘3的矩阵  你是三个叠加求和,相当于这里是27个相加。

T[0][0][0]*x1+T[0][0][1]*x2+T[0][0][2]*x3+……+T[2][2][2]*X27

我最后想要得到的不是目标函数值的平均  是变量的平均值

我知道,每次最后求解的时候能得到变量的值,你把它存下来,最后算变量的平均值就可以了

res_x=[]
for i in range(100):
    建立规划方程
    求解变量值x
    res_x.append(x)

print(np.array(res_x).mean(axis=0))

 

能把最后这几行代码的意思给我标注一下吗

不知道怎么回事   我点击采纳的时候  显示出错   说签名错误

以前点击采纳都没问题啊

额,你可以刷新重登试试

刷新好多次了

关闭浏览器,重新打开看看

也不行

随机生成数据就很简单了。你要什么样的数据格式?数据维度,随机生成的数据范围。我写个例子给你