SCIP немодифицированный LP-связанный

Я использую SCIP 3.0.2 с cplex 12.6 в качестве LP-решателя. Моя модель требует создания столбца. Я уже реализовал это в CPLEX, но поскольку CPLEX может выполнять CG только в корневом узле, я использую SCIP для выполнения Branch-and-Price. В CPLEX оказалось полезным отключить эвситику, сокращение и предварительную обработку / зондирование. Я установил в SCIP следующее:

SCIP_CALL( SCIPsetBoolParam(scip, "lp/presolving", FALSE) );

SCIPsetSeparating(scip, SCIP_PARAMSETTING_OFF, true);   //disable cuts
SCIPsetHeuristics(scip, SCIP_PARAMSETTING_OFF, true);   //disable heuristics
SCIPsetPresolving(scip, SCIP_PARAMSETTING_OFF, true);   //disable presolving

Мой файл параметров выглядит следующим образом:

display/primalbound/active = 1
presolving/maxrounds = 0
separating/maxrounds = 0
separating/maxroundsroot = 0
separating/maxcuts = 0
separating/maxcutsroot = 0
lp/initalgorithm = d
lp/resolvealgorithm = d
lp/fastmip = 1
lp/threads = 1
limits/time = 7200
limits/memory = 2900
limits/absgap = 0
#display/verblevel = 5
#display/freq = 10

Чтобы проверить, что модели совпадают, я решил модель CPLEX в SCIP (без CG) и получил ту же LP-границу, что и модель, созданную с помощью SCIP, но отличную от LP-границы при решении с помощью CPLEX.

Похоже, что SCIP все еще использует некую «магию», которую я еще не отключил. Итак, мой вопрос в том, что мне нужно деактивировать, чтобы получить привязку к LP, полагаясь только на мою модель.

Я уже посмотрел на статистику, и действительно есть некоторые вещи, которые могут помочь решить проблему:

  1. Ограничения #EnfoLP перечисляет 1 для интеграла (кажется странным, поскольку сокращения отключены?)
  2. Преобразованная проблема вроде в порядке. Вывод статистики напечатает:

Предрешенная проблема: Название проблемы: t_ARLP Переменные: 969 (806 двоичных, 0 целых, 0 неявных целых чисел, 163 непрерывных) Ограничения: 9311 начальных, 9311 максимальных

и перед началом итераций получаю следующее:

LP Solver: строковое представление базиса недоступно - параметр SCIP lp / rowrepswitch не влияет на преобразованную задачу имеет 897 переменных (806 bin, 0 int, 0 impl, 91 cont) и 9311 ограничений

9311 ограничений типа ‹linear>

предварительное решение: предварительное решение (0 раундов): 0 удаленных переменных, 0 удаленных ограничений, 0 добавленных ограничений, 0 ужесточенных границ, 0 добавленных отверстий, 0 изменений сторон, 0 измененных коэффициентов, 0 последствий, 0 кликов. int, 0 impl, 91 cont) и 9311 ограничений

9311 ограничений типа ‹linear>

Время предварительного растворения: 0.00

Я добавил 72 столбца: 91 исходный + 72 добавленных = всего 163. Вроде бы нормально.

Я добавил предложенные параметры. Кажется, что распространение домена раньше не использовалось, но было сильное ветвление. К сожалению, с параметрами ничего не изменилось.

В дополнение к добавлению параметров я также попытался использовать вместо него SCIP 3.0.1. Это улучшило мою оценку с 670.194 до 699.203, но это все еще сильно отличается от cplex, связанного с 754.348. Я знаю, что решатели различаются по множеству числовых параметров, но я полагаю, что разница слишком велика, чтобы быть вызванной этими параметрами?


person user3611568    schedule 07.05.2014    source источник


Ответы (3)


Есть еще две вещи, которые могут повлиять на LP, привязанный к корневому узлу: распространение домена и сильное ветвление.

Распространение домена - это своего рода предварительная обработка узла, которая пытается уменьшить переменные домены на основе текущих локальных доменов и ограничений. Сильное ветвление предварительно вычисляет границы LP потенциальных дочерних узлов, чтобы выбрать хорошую переменную для ветвления. Если обнаруживается, что один из дочерних узлов недопустим, его домен сокращается.

Вы можете отключить распространение домена, установив

propagating/maxrounds = 0
propagating/maxroundsroot = 0

Сильное ветвление можно отключить, установив высокий приоритет для правила ветвления, которое не применяет сильное ветвление. Например, установите

branching/pscost/priority = 100000000

для включения ветвления чистой псевдо-стоимости.

Как правило, вам следует проверять статистику на наличие ненулевых значений в столбцах DomReds.

person Gerald    schedule 13.05.2014

Вы можете просто записать внутреннюю проблему в файл, а затем сравнить ее с исходной:

SCIP> write transproblem

Вы также должны внимательно прочитать статистику SCIP, чтобы узнать, какие «волшебные» действия выполнял SCIP:

SCIP> display statistics
person mattmilten    schedule 10.05.2014

Я почти забыл о потоке, а затем снова наткнулся на него и подумал, что было бы неплохо добавить ответ после того, как сам нашел его: в обратном вызове cut (к сожалению, я не упомянул, что использовал его) я использовал метод:

SCIPisCutEfficacious

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

person user3611568    schedule 13.06.2017