Я сделал обратный вызов user cut, который добавляет некоторые сокращения к модели, над которой я работаю. Это прекрасно работает. Я хочу добавить эти разрезы только в верхние узлы дерева поиска. Проблема в том, что я не могу понять, как получить глубину текущего узла. Я сделал обратный вызов узла, который увеличивает целочисленную переменную каждый раз, когда она вызывается. Это означает, что я ничего не могу сделать в обратном вызове cut, когда это целое число превышает какое-то число. Но тогда я этого не делаю, если у cplex есть fx. создаются только узлы на левых ветвях, а это означает, что к узлам на правых ветвях и наоборот не добавляются разрезы.
Ищем в документации обратные вызовы узлов
http://pic.dhe.ibm
Я вижу, что там - это метод getDepth (), который принимает в качестве аргумента идентификатор узла. Но как получить этот идентификатор, я просто не могу понять.
Получение глубины текущего узла
Ответы (3)
CPLEX версии 12.10.0.0 имеет метод
getCurrentNodeDepth()
Вы можете вызвать его внутри своего ILOUSERCUTCALLBACK
метода, и он даст текущую глубину узла как значение long
.
Дополнительную информацию можно найти здесь: https://www.ibm.com/support/knowledgecenter/SSSA5P_12.10.0/ilog.odms.cplex.help/refdotnetcplex/html/M_ILOG_CPLEX_Cplex_MIPCallback_GetCurrent.htodeDD.nofollownoreferrer
Я пробовал то же самое на C ++.
Я пытался работать с функцией getDepth (), которая принимает в качестве аргумента идентификатор узла. Но я не мог понять, как получить идентификатор узла.
Это не ясно из документации, но: Когда вызывается обратный вызов узла, следующим обрабатываемым узлом будет узел с индексом 0.
Затем, чтобы узнать глубину текущего узла, вам нужно использовать индекс 0 в качестве идентификатора.
Использование вызываемой библиотеки:
CPXgetcallbacknodeinfo(env, cbdata, wherefrom, 0, CPX_CALLBACK_INFO_NODE_DEPTH, &depth);
Извините, я не очень разбираюсь в концертной технике.