CPLEX generi c обратные вызовы, узел LP для разделения реза - PullRequest
1 голос
/ 13 февраля 2020

Я настраиваю алгоритм ветвления и обрезки с использованием универсальной структуры обратного вызова c через C API CPLEX 12.10.

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

Насколько я понимаю, информация о текущем узле LP недоступна в общих обратных вызовах c. Тем не менее, я хотел бы использовать срезы, сгенерированные для родительского узла, чтобы генерировать лучшие срезы в дочерних узлах.

Нужно ли вести бухгалтерский учет о том, какие срезы генерируются на всех узлах, или может эта информация как-то передать с использованием функциональности CPLEX? Если единственная возможность состоит в том, чтобы отслеживать все сгенерированные сокращения, как можно сделать этот учет потокобезопасным, если CPLEX вызывает обратный вызов из разных потоков и из разных узлов?

1 Ответ

0 голосов
/ 17 февраля 2020

Невозможно заставить CPLEX отслеживать эту информацию для вас. Вы должны свернуть свой собственный.

Один из способов сделать это - реализовать словарь, который отображает уникальный идентификатор узла (см. CPXCALLBACKINFO_NODEUID) на информацию, которую вы хотите сохранить вместе с этим узлом. Что касается безопасности потоков, вам нужно только защитить доступ к этому словарю. Для этого используйте блокировку (например, pthread_mutex для не-1007 *, CRITICAL_SECTION для Windows) и операцию блокировки и поиска или обновления в этом словаре.

...