Ràng buộc bán liên tục trong CPLEX Python

Sep 02 2020

Tôi có một vấn đề tối ưu hóa bán liên tục được định dạng lại thành một vấn đề tối ưu hóa MIQP.

Vật kính của tôi có dạng bậc hai $x^{T}Qx$ và của tôi $x_{i}$ chẳng hạn như $x_{i} \in [m,M] \cup \{0\}$. Do đó, tôi giới thiệu một vectơ của các biến nhị phân$y$ nhu la $y_{i} \in \{0,1\}$ và xem xét các ràng buộc sau đối với $x_{i}$ : $m * y_{i} \leq x_{i} \leq M * y_{i}$.

Do đó, vấn đề tối ưu hóa của tôi được xác định bởi hàm mục tiêu, ràng buộc phạm vi đối với $x_{i}$ và ràng buộc nhị phân đối với $y_{i}$.

Tôi đang cố gắng giải quyết vấn đề của mình với CPLEX nhưng tôi gặp sự cố khi chỉ định ràng buộc phạm vi trên $x_{i}$. Đây là những gì tôi có cho đến nay cho các ràng buộc:

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])

Tôi cần thêm ràng buộc phạm vi nhưng không thể tìm ra cách. Tôi biết sensesthuộc tính của mình sẽ trở thành ['E'] + ['R' for i in range(50)]nhưng còn thuộc tính lin_exprvà rhsthì sao? Làm thế nào để xác định sự phụ rhsthuộc của thuộc tính với các biến nhị phân?

Trả lời

6 AlexFleischer Sep 02 2020 at 22:12

điều đó khá dễ thực hiện với API python docplex:

hãy để tôi thay đổi

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoosemiinteger.py

từ

https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/

thành nửa liên tục

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