2017-02-23 2 views
0

J'ai un problème impliquant des variables continues et binaires. Une fois que j'ai fini de créer la fonction objectif, j'ajoute des contraintes qui empêchent CPLEX de trouver une solution. S'il vous plaît laissez-moi savoir ce que je fais mal.CPLEX refuse de trouver la solution étant donné la contrainte d'égalité

IloNumExpr cbin1 = cplex.prod(EB_s[a-1],binHandelSprzedaj[a-1]); 
cplex.addEq(EB[a],cbin1); 

"binHandelSprzedaj" est un tableau de variables binaires. "EB_s" et "EB" sont des tableaux de variables flottantes cplex continues.

Le code fonctionne si au lieu de "cbin1" je mets "EB_s [a-1]" ou "binHandelSprzedaj [a-1]". Je suppose que c'est parce que je me retrouve avec une contrainte quadratique. Cependant, un des exemples fournis par CPLEX "QCPex1" présente une solution avec des contraintes quadratiques "moins égales" et le code ressemble beaucoup à ce que j'ai écrit. Je ne comprends pas pourquoi mes codes ne fonctionnent pas. Est-ce parce que la contrainte est quadratique ou parce que c'est un mélange de variables binaires et continues ou que c'est un type de contrainte "égal".

Message d'erreur reçu: CPLEX Erreur 5002: Q objectif n'est pas semi-définie

positif Je suis un grand Noob à l'optimisation. Comment est-ce que je traite ce problème? Je préférerais que CPLEX fasse autant de maths que possible pour moi (peut-être une commande magique que vous pouvez suggérer).

La contrainte dans sa forme finale est plus compliquée, donc la relaxation de variable simple (comme présenté ici http://orinanobworld.blogspot.com/2010/10/binary-variables-and-quadratic-terms.html) ne fonctionnera pas. Contraindre dans le problème entièrement défini ressemblerait à quelque chose comme ceci:

a = b + c + d + f * binaire - (1-binaire) * g

où - g sont des variables continues.

Toute aide sera grandement appréciée.

Répondre

0

Cplex peut gérer des problèmes MIQP convexes (objectif quadratique) et MIQCP (contraintes quadratiques). Il peut également gérer les MIQP non-convexes (via le paramètre SolutionTarget). Il nous reste des problèmes non convexes quadratiquement contraints, qu'il ne peut pas gérer. Heureusement, on peut toujours linéariser le produit d'un binaire et d'une variable continue. Heureusement, on peut linéariser le produit. La référence au blog de Paul Rubin fonctionnera réellement. (Here est une autre recette).

Pour que votre remplacer:

a = b + c + d + binary * f - (1-binary)*g 

par

a = b + c + d + binary * f - g + z 
z = binary*g 

z est une autre variable continue. L'équation

z = binary*g 

peut être directement linéarisée.

+0

Merci, jusqu'à maintenant fonctionne :) – t4u