Получение слабого значения в обратном вызове с использованием CPLEX C ++ API - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно получить слабые значения ограничений в моей задаче на каждом узле дерева исследования. С этой целью я думаю об использовании IloUserCutCallbackI . Согласно документации CPLEX, для этой цели будет использоваться метод getSlack . Я хотел бы знать, если это правильная стратегия. Если так, я не уверен, как передать IloRange моему обратному вызову. Вот что у меня есть:

ILOUSERCUTCALLBACK1(MyCallback,IloRange, con) {
cout << "slack" << getSlack << endl;
}
//define constraints
IloRange constraints;
.
.
.
cplex.use(MyCallback(env,constraints));

1 Ответ

1 голос
/ 21 июня 2019

Да, вы можете запросить слабины, используя предложенную вами стратегию.Пример iloadmipex5.cpp, который включается при установке CPLEX, показывает, как использовать обратный вызов, вырезанный пользователем.Как и в этом примере, звучит так, как будто вы хотите передать IloRangeArray обратному вызову, а не IloRange.

Например, ваш обратный вызов может выглядеть следующим образом:

ILOUSERCUTCALLBACK1(MyCallback, IloRangeArray, constraints) {
   for (IloInt i = 0; i < constraints.getSize(); ++i) {
      IloRange& con = constraints[i];
      IloNum const slack = getSlack(con);
      cout << "Slack for " << con << " = " << slack << endl;
   }
}

И вы бы добавили обратный вызов к вашей модели, вот так:

IloModel model(env);
IloRangeArray constraints(env);
// Add constraints to the array with constraints.add(...);
// Also, make sure that you have added the constraints to the model.
model.add(constraints);
IloCplex cplex(model);
cplex.use(MyCallback(env, constraints));
...