У меня есть список элементов, каждый из которых идентифицирован с типом, мне нужно переупорядочить список до максимизировать минимальное расстояние между элементами одного и того же типа.
Набор мал (от 10 до 30 штук), поэтому производительность не очень важна.
Нет ограничений на количество элементов на тип или количество типов, данные можно считать случайными.
Например, если у меня есть список:
- 5 элементов A
- 3 элемента B
- 2 элемента C
- 2 элемента D
- 1 элемент E
- 1 элемент F
Я хотел бы создать что-то вроде:
A
, B
, C
, A
, D
, F
, B
, A
, E
, C
, A
, D
, B
, A
- A имеет как минимум 2 элемента между вхождениями
- B имеет не менее 4 элементов между вхождениями
- C имеет 6 элементов между вхождениями
- D имеет 6 элементов между вхождениями
Есть ли алгоритм для достижения этого?
-Обновление -
После обмена некоторыми комментариями я пришел к определению вторичной цели:
- главная цель: максимизировать минимальное расстояние между элементами одного и того же типа, учитывая только тип с меньшим расстоянием.
- вторичная цель: максимизировать минимальное расстояние между элементами на каждом типе. IE: если комбинация увеличивает минимальное расстояние определенного типа без уменьшения другого, выберите его.
-Update 2 -
Об ответах. Было много полезных ответов, хотя ни одно из них не является решением для обоих целей, особенно второе, что сложно.
Некоторые мысли об ответах:
- PengOne: Звучит неплохо, хотя и не обеспечивает конкретной реализации, и не всегда приводит к лучшему результату в соответствии со второй целью.
- Евгений Клюев: Обеспечивает конкретную реализацию главной цели, но это не приводит к лучшему результату в соответствии с вторичной целью.
- tobias_k: Мне понравился случайный подход, это не всегда приводит к лучшему результату, но это хорошее приближение и экономичность.
Я попробовал комбинацию Evgeny Kluev, backtracking и tobias_k formula, но для получения результата потребовалось слишком много времени.
Наконец, по крайней мере, для моей проблемы, я считал, что tobias_k является наиболее адекватным алгоритмом, за его простоту и хорошие результаты своевременно. Вероятно, его можно было бы улучшить с помощью имитационного отжига.