SCIP: дети против родителей против братьев и сестер - PullRequest
0 голосов
/ 05 июля 2019

Я реализую селектор узла. Я думал, что SCIPgetLeaves даст мне список текущих узлов, среди которых нужно выбрать один для дальнейшего ветвления. После этапа предварительной обработки SCIPgetLeaves в NODESELSELECT() не возвращает ни одного узла. Вместо этого мне пришлось использовать SCIPgetFocusNode().

В документации говорится, что NODESELSELECT() выбирает один из листьев, детей и братьев и сестер, поэтому я попытался собрать все три. Есть ли причина, по которой дети и братья и сестры корневого узла не включаются в листья после стадии предварительного растворения? Просто пытаюсь понять дизайн SCIP.

1 Ответ

2 голосов
/ 05 июля 2019

Все три типа узлов относятся к узлу фокуса:

  • SCIPgetChildren () предлагает быстрый доступ к вновь созданным дочерним элементам через ветвление
  • SCIPgetSiblings () предлагает доступ к брату (-ам) фокусного узла
  • SCIPgetLeaves () - это остаток с более отдаленными отношениями с узлом фокуса

Просто имейте в виду, что при каждом выборе открытые узлы разбиваются на 3 типа, указанных выше.

Процесс решения узла значительно выигрывает от возможности горячего / горячего запуска двойного Симплексного алгоритма, поэтому SCIP (и другие решатели) в основном выполняют погружение (также называемое «погружением») вниз по дереву с некоторыми ограничениями. Это требует быстрого доступа к дочерним узлам фокуса.

Посмотрите на src / scip / nodesel_dfs.c для хорошего примера простого выбора узла.

...