如何在CPLEX python中添加和删除约束?

如何在CPLEX python中添加和删除约束?,python,optimization,mathematical-optimization,cplex,Python,Optimization,Mathematical Optimization,Cplex,我在python中使用了新的Cplex。我已经知道如何正确地编写数学优化问题的代码,并创建一个函数来友好地显示解决方案(F1)。目前,我想在不创建新模型的情况下修改模型的某些功能。我的想法是求解一个模型P,然后是模型P1(改变决策变量域),P2(放松一些集合o约束),等等。我想用我的函数F1得到这些模型的解 我的代码如下: 导入时间 将numpy作为np导入 进口cplex 从cplex导入cplex 从cplex.exceptions导入CplexError 导入系统 从openpyxl导入工

我在python中使用了新的Cplex。我已经知道如何正确地编写数学优化问题的代码,并创建一个函数来友好地显示解决方案(F1)。目前,我想在不创建新模型的情况下修改模型的某些功能。我的想法是求解一个模型P,然后是模型P1(改变决策变量域),P2(放松一些集合o约束),等等。我想用我的函数F1得到这些模型的解

我的代码如下:

导入时间
将numpy作为np导入
进口cplex
从cplex导入cplex
从cplex.exceptions导入CplexError
导入系统
从openpyxl导入工作簿
导入xlrd
def间隙(I、J、数据):
#天宝酒店
inicio=time.process_time()#---------------------------------------inicio DEL CONTEO DE TIEMPO
#魔术师
maquinas=范围(I)#与特拉巴霍斯的结合
trabajos=范围(J)#MÁQUINAS
#打印(“MÁQUINAS={}|TRABAJOS={}|\n”。格式(列表(maquinas),列表(TRABAJOS)))
打印(“\n”)
#帕拉地铁
wb=工作簿()
ws=wb.active
book=xlrd.open_工作簿(数据+'.xlsx')
活页=活页。活页名称(“c”)
c_a=[[int(sheet.cell_value(r,c))表示范围内的c(sheet.ncols)]表示范围内的r(sheet.nrows)]
c_a=np.矩阵(c_a)
印刷品(“COSTO DE ASIGNACIÓN”)
打印(“”)
印刷品(c#U a)#-------------------------------------------------------COSTO DE ASIGNACIÓN
打印(“\n”)
活页=活页。活页名称(“a”)
a=[[int(sheet.cell_值(r,c))表示范围内的c(sheet.ncols)]表示范围内的r(sheet.nrows)]
a=np.矩阵(a)
打印(“UTILIZACIÓN”)
打印(“”)
打印(a)————————————请求
打印(“\n”)
活页=活页。活页名称(“b”)
b=[[int(sheet.cell_值(r,c))表示范围内的c(sheet.ncols)]表示范围内的r(sheet.nrows)]
b=np.矩阵(b)
打印(“DISPONIBILIDAD”)
打印(“”)
印刷品(b)——————CAPACIDAD MÁXIMA DE PROCESO
打印(“\n”)
Model=cplex.cplex()。
模型.参数.mip.公差.完整性.集合(0)#特殊的
#变量输入法
#肠易激综合征被认为是可行的
Model.objective.set_sense(Model.objective.sense.minimize)#senido DE OPTIMIZACIÓN。
#Model.parameters.timelimit.set(float(7200))#TIEMPO MÁXIMO DE ejeucciÓN[segudos]。
#Model.parameters.mip.tolerance.mipgap.set(float(0.1))#GAP DE TŠRMINO。
#决策变量
x_vars=np.array([[“x”(“+str(i)+”,“+str(j)+”)表示特拉巴霍斯的j]表示马奎纳斯的i])
x_varnames=x_vars.flatte()
x_vartypes='B'*I*J
x_varlb=[0.0]*len(x_varnames)
x_varub=[1.0]*len(x_varnames)
x_varobj=[]
对于我在maquinas:
对于trabajos中的j:
x_varobj.append(float(c_a[i,j]))
Model.variables.add(obj=x_varobj,lb=x_varlb,ub=x_varub,types=x_vartypes,names=x_varnames)
#洗手间
#改革的初级合作伙伴:卡达·特拉巴霍和阿西纳多是一个年轻人。
对于trabajos中的j:
第1行=[]
val1=[]
对于我在maquinas:
行1.追加(x_变量[i,j])
val1.append(float(1.0))
Model.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=row1,val=val1)],senses='E',rhs=[float(1.0)])
#改革的目标:在改革的过程中考虑到改革的重要性
对于我在maquinas:
第2行=[]
val2=[]
对于trabajos中的j:
第2行追加(x_变量[i,j])
val2.append(float(a[i,j]))
Model.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=row2,val=val2)],senses='L',rhs=[float(b[i]))
#分解器MODELO Y EXPANDIR
solution=Model.solve()
Model.write('modelo_GAP.lp'))
#莫斯特拉尔溶解
def show_solution():
打印(“-----------------------------------------------------------------------------------------------------------------------------”)
打印(“\nVALOR FUNCIÓN OBJETIVO-costotal DE ASIGNACIÓN={}”。格式(Model.solution.get_objective_value())
打印(“-----------------------------------------------------------------------------------------------------------------------------”)
对于我在maquinas:
对于trabajos中的j:
如果(Model.solution.get_值(“x”(“+str(i)+”,“+str(j)+”)!=0.0):
打印(“x”(“+str(i+1)+”,“+str(j+1)+”)”+“=”+str(Model.solution.get_)值(“x”(“+str(i)+”,“+str(j)+”))
fin=时间。处理时间()
tiempo=浮动(fin)-浮动(inicio)
打印(“”)
打印(“TIEMPO DE CÓMPUTO[s]=”,浮动(TIEMPO))
show_解决方案()
间隙(I=2,J=7,data='data')
数据文件如下所示:

矩阵c_a如下所示:

矩阵a如下所示:

矩阵b如下所示:


因此,我想知道如何在以这种方式编写的模型中进行这些更改。提前感谢。

使用docplex python API,您可以非常轻松地做到这一点

from docplex.mp.model import Model

# original model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()



for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

#now remove the constraint

print()
print("now 0 kids instead of 300")    

mdl.get_constraint_by_name("kids").rhs=0;
mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

# and now let 's adapt to Covid19 1 seat out of 2

print("now 40 seats buses take 20 children and same ratio for 30 seats buses") 

mdl.add_constraint(nbbus40*20 + nbbus30*15 >= 300, 'kidsCov19')

mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

nbBus40  =  6.0
nbBus30  =  2.0

now 0 kids instead of 300
nbBus40  =  0
nbBus30  =  0
now 40 seats buses take 20 children and same ratio for 30 seats buses
nbBus40  =  15.0
nbBus30  =  0

我使用了

,您可以通过docplex python API轻松实现这一点

from docplex.mp.model import Model

# original model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()



for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

#now remove the constraint

print()
print("now 0 kids instead of 300")    

mdl.get_constraint_by_name("kids").rhs=0;
mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

# and now let 's adapt to Covid19 1 seat out of 2

print("now 40 seats buses take 20 children and same ratio for 30 seats buses") 

mdl.add_constraint(nbbus40*20 + nbbus30*15 >= 300, 'kidsCov19')

mdl.solve()

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

nbBus40  =  6.0
nbBus30  =  2.0

now 0 kids instead of 300
nbBus40  =  0
nbBus30  =  0
now 40 seats buses take 20 children and same ratio for 30 seats buses
nbBus40  =  15.0
nbBus30  =  0

我已经使用了

这里有一些提示可以让你朝着正确的方向前进:

  • add
    方法(例如)返回一个迭代器,其中包含添加到模型中的索引。您可以使用它来记住要修改的变量类或约束类的索引。例如:

    varind = list(Model.variables.add(obj = x_varobj, lb = x_varlb, ub = x_varub, types = x_vartypes, names = x_varnames))
    
    Model1 = cplex.Cplex(Model)
    
  • 或者,如果为变量/约束命名,则可以查询或