我有一个元素列表,每个元素都用一种类型标识,我需要重新排序列表以最大化相同类型元素之间的最小距离。
集合很小(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:如果一个组合增加了某种类型的最小距离而不减少其他,那么选择它。
-更新2-
关于答案。有很多有用的答案,虽然没有一个是两个目标的解决方案,特别是第二个目标,这很棘手。
关于答案的一些想法:
- PengOne:听起来不错,虽然它没有提供具体的实现,并且并不总是根据第二个目标导致最好的结果。
- Evgeny Kluev : 为主要目标提供了具体的实现,但并没有根据次要目标导致最好的结果。
- tobias_k:我喜欢随机方法,它并不总能带来最好的结果,但它是一个很好的近似值并且具有成本效益。
我尝试了 Evgeny Kluev、回溯和 tobias_k 公式的组合,但它需要太多时间才能得到结果。
最后,至少对于我的问题,我认为 tobias_k 是最合适的算法,因为它的简单性和及时的良好结果。可能,它可以使用Simulated annealing来改进。