Contraintes semi-continues dans CPLEX Python

Sep 02 2020

J'ai un problème d'optimisation semi-continu reformulé en problème d'optimisation MIQP.

Mon objectif a une forme quadratique$x^{T}Qx$et mon$x_{i}$sont tels que$x_{i} \in [m,M] \cup \{0\}$. Par conséquent, j'introduis un vecteur de variables binaires$y$comme$y_{i} \in \{0,1\}$et considérons la contrainte suivante sur la$x_{i}$:$m * y_{i} \leq x_{i} \leq M * y_{i}$.

Mon problème d'optimisation est donc défini par la fonction objectif, la contrainte à distance sur le$x_{i}$et la contrainte binaire sur$y_{i}$.

J'essaie de résoudre mon problème avec CPLEX mais j'ai du mal à spécifier la contrainte de plage sur le$x_{i}$. Voici ce que j'ai jusqu'à présent pour les contraintes :

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

J'ai besoin d'ajouter la contrainte à distance, mais je n'arrive pas à comprendre comment. Je sais que mon sensesattribut deviendra ['E'] + ['R' for i in range(50)]mais qu'en est-il des attributs lin_expret rhs? Comment spécifier la dépendance de l' rhsattribut avec les variables binaires ?

Réponses

6 AlexFleischer Sep 02 2020 at 22:12

c'est assez facile à faire avec l'API docplex python :

laisse moi changer

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

à partir de

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

en semi-continu

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