当我使用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;
}
}
}
答案 0 :(得分:1)
每个节点可能会多次调用用户剪切回调。这是可以预期的,因为切割是成环分开的。通过遵循以下范例,您可以轻松检测当前节点是否已经调用了回调: struct Marker:公共IloCplex :: MIPCallbackI :: NodeData {};
ILOUSERCUTCALLBACK0(SolveCallback) {
if ( !getNodeData() ) {
// Invoked first time at current node
setNodeData(new Marker());
}
else {
// Not the first time at current node
}
}