Как использовать теплые старты в Minizin c? - PullRequest
0 голосов
/ 20 марта 2020

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

Я начал с попытки выполнить этот пример горячего старта из документации Minizin c (единственной, которую они предоставляют):

array[1..3] of var 0..10: x;
array[1..3] of var 0.0..10.5: xf;
var bool: b;
array[1..3] of var set of 5..9: xs;
constraint b+sum(x)==1;
constraint b+sum(xf)==2.4;
constraint 5==sum( [ card(xs[i]) | i in index_set(xs) ] );
solve
  :: warm_start_array( [                     %%% Can be on the upper level
    warm_start( x, [<>,8,4] ),               %%% Use <> for missing values
    warm_start( xf, array1d(-5..-3, [5.6,<>,4.7] ) ),
    warm_start( xs, array1d( -3..-2, [ 6..8, 5..7 ] ) )
  ] )
  :: seq_search( [
    warm_start_array( [                      %%% Now included in seq_search to keep order
      warm_start( x, [<>,5,2] ),             %%% Repeated warm_starts allowed but not specified
      warm_start( xf, array1d(-5..-3, [5.6,<>,4.7] ) ),
      warm_start( xs, array1d( -3..-2, [ 6..8, 5..7 ] ) )
    ] ),
    warm_start( [b], [true] ),
    int_search(x, first_fail, indomain_min)
  ] )
  minimize x[1] + b + xf[2] + card( xs[1] intersect xs[3] );

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

Warning, ignored search annotation: warm_start_array([warm_start([[xi(1), xi(2)], [i(5), i(2)]]), warm_start([[xf(0), xf(2)], [f(5.6), f(4.7)]]), warm_start([[xs(0), xs(1), xs(2)], [s(), s()]])])
Warning, ignored search annotation: warm_start([[xb(0)], [b(true)]])
Warning, ignored search annotation: warm_start_array([warm_start([[xi(1), xi(2)], [i(8), i(4)]]), warm_start([[xf(0), xf(2)], [f(5.6), f(4.7)]]), warm_start([[xs(0), xs(1), xs(2)], [s(), s()]])])

Я ничего не изменил в примере, просто скопировал его и запустил в IDE Minizin c с помощью решателя Geocode по умолчанию. В случае, если это актуально, я использую Windows. Я запускал другие модели и использовал другие поисковые аннотации без проблем.

В примере есть два блока теплых звезд (один после решени и один внутри seq_search). Я не уверен, что оба необходимы. Я попытался удалить одну, затем другую, но предупреждения все еще появляются для всех оставшихся аннотаций теплого старта. Также я не понимаю, почему b не упоминается в первом блоке.

Аналогичный пример есть в git https://github.com/google/or-tools/issues/539, но он также выдает предупреждения.

Если кто-то может указать мне на рабочий пример warm_start, то это было бы замечательно.

1 Ответ

3 голосов
/ 22 марта 2020

Вы используете аннотации warm_start правильно, но аннотации с горячим стартом в настоящее время не поддерживаются большинством решателей. На момент написания статьи я считаю, что аннотации «горячего старта» поддерживаются только интерфейсами смешанного целочисленного программирования (CoinB C, Gurobi, CPlex, XPress и SCIP). Хотя мы работали над добавлением поддержки аннотации в Gecode и Chuffed, поддержка этой аннотации не была включена ни в одну из выпущенных версий.

...