我的思路是在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))
能把最后这几行代码的意思给我标注一下吗
不知道怎么回事 我点击采纳的时候 显示出错 说签名错误
以前点击采纳都没问题啊
额,你可以刷新重登试试
刷新好多次了
关闭浏览器,重新打开看看
也不行
随机生成数据就很简单了。你要什么样的数据格式?数据维度,随机生成的数据范围。我写个例子给你