CPLEX Python의 반 연속 제한 조건

Sep 02 2020

MIQP 최적화 문제로 재구성 된 반 연속 최적화 문제가 있습니다.

내 목표는 2 차 형태입니다. $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_exprrhs속성은 어떻습니까? rhs이진 변수로 속성 의 종속성을 지정하는 방법은 무엇입니까?

답변

6 AlexFleischer Sep 02 2020 at 22:12

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