ข้อ จำกัด กึ่งต่อเนื่องใน CPLEX Python
ฉันมีปัญหาการปรับให้เหมาะสมแบบกึ่งต่อเนื่องที่จัดรูปแบบใหม่เป็นปัญหาการเพิ่มประสิทธิภาพ MIQP
วัตถุประสงค์ของฉันมีรูปแบบกำลังสอง $x^{T}Qx$ และของฉัน $x_{i}$ เป็นเช่น $x_{i} \in [m,M] \cup \{0\}$. ดังนั้นผมจึงแนะนำเวกเตอร์ของตัวแปรไบนารี$y$ เช่น $y_{i} \in \{0,1\}$ และพิจารณาข้อ จำกัด ต่อไปนี้ในไฟล์ $x_{i}$ : $m * y_{i} \leq x_{i} \leq M * y_{i}$.
ปัญหาการเพิ่มประสิทธิภาพของฉันจึงถูกกำหนดโดยฟังก์ชันวัตถุประสงค์ข้อ จำกัด ที่อยู่ในช่วงบน $x_{i}$ และข้อ จำกัด ไบนารีบน $y_{i}$.
ฉันกำลังพยายามแก้ปัญหาของฉันด้วย CPLEX แต่ฉันมีปัญหาในการระบุข้อ จำกัด ระยะไกลในไฟล์ $x_{i}$. นี่คือสิ่งที่ฉันมีสำหรับข้อ จำกัด :
myProblem=cplex.Cplex()
#define the variables
names_amounts=["amounts " + str(i) for i in range(50))]
names_binary=["binary " + str(i) for i in range(50))]
myProblem.variables.add(ub=[1]*50,
lb=[0]*50,
names=names_amounts)
myProblem.variables.add(ub=[1]*50,
lb=[0]*50,
names=names_binary)
for i in range(50):
myProblem.variables.set_types("amounts " + str(i), myProblem.variables.type.continuous)
myProblem.variables.set_types("binary " + str(i), myProblem.variables.type.integer)
#define the constraints
myProblem.linear_constraints.add(
lin_expr=[[names_amounts,[1]*50]],
senses=['E'],
rhs=[1.0])
ฉันต้องการเพิ่มข้อ จำกัด ที่อยู่ในระยะไกล แต่คิดไม่ออกว่าจะทำอย่างไร ฉันรู้ว่าsensesแอตทริบิวต์ของฉันจะกลายเป็น['E'] + ['R' for i in range(50)]แต่สิ่งที่เกี่ยวกับแอตทริบิวต์lin_exprและrhs? จะระบุการอ้างอิงของrhsแอตทริบิวต์กับตัวแปรไบนารีได้อย่างไร?
คำตอบ
มันค่อนข้างง่ายที่จะทำกับ docplex python API:
ให้ฉันเปลี่ยน
https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoosemiinteger.py
จาก
https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/
เป็นกึ่งต่อเนื่อง
from docplex.mp.model import Model
# original model
mdl = Model(name='buses')
nbbus40 = mdl.semicontinuous_var(4,20,name='nbBus40')
nbbus30 = mdl.semicontinuous_var(4,20,name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_semicontinuous_vars():
print(v," = ",v.solution_value