近年来国产COPT求解器在整数规划上取得了不错的成果,原有CPLEX 12.1 只能支持到python3.7,这就给COPT了一个机会。
首先是COPT的申请和激活,在其lib\python目录下
使用带python环境 运行以下命令
python setup.py install
此时COPT将被添加到python环境中。
代码中的单个#代表变量。
#导入coptpy
from coptpy import *
#声明环境
env=Envr()
#创建模型
model=env.createModel()
#声明表达式,可以方便编辑,修改
expr=LinExpr()
#可使用以下方式声明一下不同规模的xij,例如x1[1~2],x2[1~10]这类多维变量
x=[VarArray() for i in range(len(#你的变量))]
u=[VarArray() for i in range(len(#你的变量))]
#批量添加变量
for j,# in enumerate(#) :
x[j]=model.addVars(len(#),len(#),vtype=COPT.BINARY,nameprefix="x"+str(j))#添加二维变量
u[j]=model.addVars(len(#),vtype=COPT.BINARY,nameprefix="u"+str(j))#添加一维变量
#采用list方法定义产生的数组,其维数会+1,使用方法也有所不同。
#在使用单个变量时需要注意其用法
#如下定义约束
for j in range(len(#)):
model.addConstrs(quicksum(x[j][i,k] for i in range(len(#)))<=weaponNum[j][k] \
for k in range(len(#)))
model.addConstrs(quicksum(x[j].sum(i,'*') for j in range(len(#))) >=1 for i in range(len(#)))
#model.addConstrs((quicksum(x[j][i,k] for i in range(len(#)))-#)*1e8+1<=u[j][k] \
#for k in range(len(#)))
#第三类约束为是否产生空洞约束,并更改为相应的损失函数。
for i in range(len(#)):
for j in range(len(#)):
for k in range(len(#)):
expr+=x[j][i,k]*#
#定义目标函数
model.setObjective(expr,COPT.MINIMIZE)
#保存模型
model.write("#.lp")
#输出结果
model.solve()
if model.status == COPT.OPTIMAL:
print("\nOptimal objective value: {0:.2f}".format(model.objval))
vars = model.getVars()
print("Variable solution:")
for var in vars:
if var.x>0.5:
print(" {0} = {1:.2f}".format(var.name, var.x))