UserCutCallback записывает дважды для каждого выхода - PullRequest
1 голос
/ 11 июля 2019

Когда я использую UserCutCallback и извлекаю некоторую функцию, такую ​​как getuppseudocost или slack, она генерирует выходные данные дважды.Например, у меня есть 50 переменных, он показывает псевдостановки для всех 50 переменных, затем под 50-й переменной он снова показывает первую переменную для 50-й переменной.Что не так в моем коде?

ILOUSERCUTCALLBACK1(Myuppesodo, IloArray<IloNumVarArray>, vars) {
for (int i = 0; i < nbworkers; i++) {
    for (int j = 0; j < nbmachines; j++)
    {
        auto temp = getUpPseudoCost(vars[i][j]);
        cout << "getUpPseudoCost(" << vars[i][j] << ")= " << 
                     temp << endl;

    }
}
}

enter image description here

1 Ответ

1 голос
/ 12 июля 2019

Пользовательский обратный вызов может быть вызван несколько раз для каждого узла. Это ожидается, поскольку разрезы разделены в цикле. Вы можете легко определить, был ли уже вызван обратный вызов для текущего узла, следуя этой парадигме: struct Marker: public IloCplex :: MIPCallbackI :: NodeData {};

ILOUSERCUTCALLBACK0(SolveCallback) {
   if ( !getNodeData() ) {
      // Invoked first time at current node
      setNodeData(new Marker());
   }
   else {
      // Not the first time at current node
   }
}
...