2017-01-05 1 views
2

J'essaie de traduire un code Gurobi vers CPLEX et j'ai de la difficulté à déterminer comment définir la valeur de départ d'une variable.Quel est l'équivalent CPLEX de la méthode .set() de Gurobi?

Le code original ressemble à ceci:

for (int b=0; b<nB ; ++b){ 
    for (int t=0; t<t_max; ++t){ 
     Yvars[b][t].set(GRB_DoubleAttr_Start, startVals[b][t+shift]); 
    } 
} 

quel serait le code CPLEX équivalent? Je ne peux pas trouver des informations n'importe où sur la façon de le faire. Le plus proche que je peux trouver est la suivante:

http://www.ibm.com/support/knowledgecenter/en/SS9UKU_12.4.0/com.ibm.cplex.zos.help/UsrMan/topics/discr_optim/mip/para/49_mipStarts.html

Toutefois, cela suggère que je dois ajouter les valeurs de début du modèle lui-même, comme celui-ci:

IloNumVarArray startVar(env); 
IloNumArray startVal(env); 
for (int b = 0; b < nB; ++b) 
    for (int t = 0; t < t_max; ++t) { 
     startVar.add(Yvars[b][t]); 
     startVal.add(startVals[b][t+shift]); 
    } 
cplex.addMIPStart(startVar, startVal); 

Et pas seulement une incidence sur la personne variables comme dans le code d'origine. Y a-t-il un moyen de le faire aux variables comme avec Gurobi? Ou dois-je tout faire en même temps?

Répondre

1

La façon dont vous ajoutez le début MIP dans CPLEX est correcte (et il n'y a pas de syntaxe alternative). Je ne suis pas sûr de ce que vous entendez exactement par «dois-je tout faire en même temps», mais vous demandez peut-être si vous pouvez fournir la valeur de départ MIP pour un sous-ensemble de variables plutôt que toutes. Si tel est le cas, voir MIP starts and effort level (par exemple, avec CPX_MIPSTART_SOLVEMIP CPLEX résout un sous-MIP où vous devez spécifier la valeur d'au moins une variable discrète). Avec l'API C++, la méthode addMIPStart dispose d'un paramètre facultatif effort pour contrôler cela.