Я создал модель для решения задачи раскраски графа в MiniZinc:
include "globals.mzn";
int: n_nodes; % Number of nodes
int: n_edges; % Number of edges
int: domain_ub; % Number of colors
array[int] of int: edges; % All edges of graph as a 1D array
array[1..n_edges, 1..2] of int: edges2d = array2d(1..n_edges, 1..2, edges);
array[1..n_nodes] of var 1..domain_ub: colors;
constraint forall (i in 1..n_edges) (colors[edges2d[i,1]] != colors[edges2d[i,2]]);
solve :: int_search(colors, dom_w_deg, indomain_random)
satisfy;
Чтобы решить большие проблемы (около 400-500 узлов), я начинаю с верхней границы количества цветов и решаю последовательные задачи удовлетворения, уменьшая количество на единицу, пока оно не станет неудовлетворительным или истечет время ожидания. Этот метод дает мне достойные результаты.
Чтобы улучшить свои результаты, я добавил ограничения на нарушение симметрии в приведенную выше модель:
constraint colors[1] = 1;
constraint forall (i in 2..n_nodes) ( colors[i] in 1..max(colors[1..i-1])+1 );
Однако это ухудшает мои результаты как по скорости, так и по качеству.
Почему моя модель плохо работает после добавления дополнительных ограничений? Как мне добавить ограничения, нарушающие симметрию?
indomain_random
может быть не так хороша с нарушением симметрии). Кроме того, какова верхняя граница цветов (domain_ub
)? Если это планарный график, достаточно 4 цветов. - person hakank   schedule 21.06.2020input_order
сindomain_min
дали немного лучшие результаты, они все равно не были сопоставимы с тем, когда я не добавлял дополнительные ограничения. - person recentadvances   schedule 21.06.2020minizinc
пакет Python для запуска модели. Дляdomain_ub
я запускаю цикл, начиная с максимальной степени графика и уменьшая его до тех пор, пока не достигну неудовлетворительности или не истечет время ожидания. - person recentadvances   schedule 21.06.2020