2021-01-13 20:49

# 如何用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 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)

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)

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)

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)

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)

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)
names=my_colnames)
rows = [[["x1", "x2"], [2,1]]]
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)
names=my_colnames)
rows = [[["x1", "x2"], [2,1]]]
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

也不行

点赞 打赏 评论