蝴蝶破蛹¥
2021-01-13 20:49
采纳率: 16.7%
浏览 365

如何用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]]];

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

32条回答 默认 最新

  • bj_0163_bj 2021-01-15 12:35
    已采纳
    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] 这种格式,也就是每个变量的平均值
    
    点赞 打赏 评论
  • bj_0163_bj 2021-01-13 21:10

    python随机数据怎么代入cplex?

    点赞 打赏 评论
  • bj_0163_bj 2021-01-13 21:11

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-14 09:59

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-14 10:03

    或者MATLAB  调用cplex?

     

    点赞 打赏 评论
  • bj_0163_bj 2021-01-14 11:20

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-14 15:12

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-14 15:13

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-14 15:34

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-14 15:46
    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)
    

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-14 18:08

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-14 19:23
    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())

    这样?

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-14 20:14

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-14 20:19
    ## 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())
    
    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 10:18

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 10:18

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 10:25

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 10:26

    大神   再帮我看看吧

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 10:29

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 10:30

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-15 11:05

    比如 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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 11:34

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-15 11:39

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

    点赞 打赏 评论
  • bj_0163_bj 2021-01-15 11:41
    res_x=[]
    for i in range(100):
        建立规划方程
        求解变量值x
        res_x.append(x)
    
    print(np.array(res_x).mean(axis=0))
    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 11:54

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 14:01

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 14:03

    以前点击采纳都没问题啊

    点赞 打赏 评论
  • bj_0163_bj 2021-01-15 14:23

    额,你可以刷新重登试试

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 14:36

    刷新好多次了

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 14:36

    点赞 打赏 评论
  • 王大师王文峰 2021-01-15 14:47

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

    点赞 打赏 评论
  • 蝴蝶破蛹¥ 2021-01-15 14:54

    也不行

    点赞 打赏 评论

相关推荐 更多相似问题