Мне задали вопрос, где я должен создать набор команд с простым ограничением, когда есть два массива наборов, в которых два члена должны быть вместе, а какие нет. Я новичок в Minizinc, поэтому мне трудно работать с переменной решения с массивом наборов. Команды также должны быть размером n.
Например:
GroupsThatMustBePaired = [{1,3},{4,5}]
GroupsThatShouldNot = [{2,3}]
Output = [{1,3},{4,5},{2,6}..etc]
Любая помощь?
1 ответ
Поначалу использование переменных-множеств может быть немного сложным, но если вы сможете вернуться к тому времени, когда вы узнали о множествах в математике, то концепции должны быть вам очень знакомы.
Ниже приведен пример того, как вы можете написать свою модель. У него есть несколько дополнительных ограничений, чтобы убедиться, что «команды» содержат всех, дважды никого, а максимальная вместимость включает «all_disjoint.mzn»;
set of int: MEMBERS = 1..6;
set of int: GROUPS = 1..3;
array[int] of set of MEMBERS: GroupsThatMustBePaired = [{1,3},{4,5}];
array[int] of set of MEMBERS: GroupsThatShouldNot = [{2,3}];
array[GROUPS] of var set of MEMBERS: teams;
% Team members can only be part of one team
constraint all_disjoint(teams);
% Everyone must be part of a team
constraint array_union(teams) = MEMBERS;
% Maximal number of people per group
constraint forall(g in GROUPS) ( card(teams[g]) <= 2 );
% Eliminate bad groups
constraint forall(g in GROUPS, i in index_set(GroupsThatShouldNot)) (
not (GroupsThatShouldNot[i] subset teams[g])
);
% Enforce good groups
constraint forall(i in index_set(GroupsThatMustBePaired)) (
exists(g in GROUPS) (
GroupsThatMustBePaired[i] subset teams[g]
)
);
Некоторые примечания, если вы хотите изменить эту модель: Большинство решателей не поддерживают набор переменных напрямую, а вместо этого преобразуют эту модель для использования логических переменных. Это не обязательно хуже, но об этом следует помнить, если вы чувствуете, что проблема может быть проще выражена с использованием логических переменных.
В этом конкретном случае вы можете рассмотреть возможность использования целочисленных переменных. Эту проблему можно рассматривать как проблему назначения, когда участники распределяются по командам. При этом учитывается точка зрения членов команды, а не команды. Хотя это, вероятно, затруднит написание ограничения subset, эта структура устранит необходимость в ограничениях all_disjoint и array_union, поскольку мы знаем все будут в команде, и никто не будет в нескольких командах. В этом случае ограничение набора card (количество элементов) можно заменить целочисленным ограничением global_cardinality_low_up
.
Похожие вопросы
Новые вопросы
arrays
Массив - это упорядоченная линейная структура данных, состоящая из набора элементов (значений, переменных или ссылок), каждый из которых идентифицируется одним или несколькими индексами. Когда вы спрашиваете о конкретных вариантах массивов, используйте вместо них следующие связанные теги: [vector], [arraylist], [matrix]. При использовании этого тега в вопросе, относящемся к языку программирования, пометьте вопрос используемым языком программирования.