我早些时候在stackoverflow上发布了这个问题,在那里它被关闭为题外话。我希望它能在这里生存。
在我们的攀岩馆,路线需要不时重新设置。以下规则适用:
- 我们有不同数量的不同颜色的攀登架。- 当一条路线设置在一个扇区中时,不得在该扇区或附近扇区中设置其他具有相同颜色的路径,以免混淆。
- 在一个区域中必须避免某些颜色组合,例如白色/灰色或红色/粉红色。
- 目标是在每个扇区中有四条路线,如果四条路线违反上述规则,那就少了。
到目前为止,我已经尝试了两种不同的方法。第一个是模拟退火,我用随机的颜色图案(但具有给定的颜色权重)初始化墙壁,并计算每种颜色组合的坏度。还计算了一个扇区与其相邻扇区之间的组合的这种不良情况。在每次迭代中,来自最差扇区的随机选择的路线与随机选择的其他扇区的路线交换。这显示了某种收敛,但结果不可用(即结果状态包含具有双色或三色的扇区)。
然后我从对面处理问题,从一堵空墙开始。这一次,每种颜色都有一个浓度从一个扇区衰减到相邻扇区。相似颜色的浓度也增加了,即红色路线增加了一个扇区和附近的橙色浓度。加权随机颜色源(桶)给了我墙的下一种颜色,它被放置在这种颜色浓度最低的区域。如果浓度高于某个阈值,则不添加颜色(而是放回桶中)。这是部分成功,因为结果状态不包含任何双色 - 但某些扇区为空或仅包含一种颜色。
那么:根据上述规则,解决这个问题的合适算法是什么?我很乐意在需要时添加更多信息。
编辑 1 - 更多信息:
- 我的测试用例有 15 个扇区,
- 每个扇区应包含 4 条路线
- 真正的健身房有 3 栋建筑,每栋建筑平均有 50 个扇区
- 有些扇区围绕柱子排列,有些则由屋顶连接
- 我们有大约 10 种不同的保持颜色
- 扇区的高度在 6(初学者部分)和 20 米(13 垂直 + 7 屋顶)之间变化,因此它们消耗不同数量的货舱。但是,平均值约为 12,这可以认为是恒定的。
- 每种颜色数量有限,数量不等
- 有些颜色更容易,有些更难(即我们可以创建一条任何难度的黄色路线,而为孩子们创建一条非常简单的橙色路线几乎是不可能的)
- 有些部门“更容易”,所以应该去那里简单的颜色(这是可选的,我们的路线设置器可以在广泛的范围内使事情变得更难或更容易)。
- 我们可以有把握地说哪些颜色在一个扇区或相邻扇区中可以很好地搭配在一起,而哪些组合则不能。有一些惊喜,例如白色和黑色(糟糕的组合):两者都变成灰色,而橡胶(鞋子)或粉笔(手)留在它们上面。
- 一些保持颜色是紫色/白色(条纹图案)等组合。
编辑 2:关于遗传算法的一些问题
我现在下载并编译了 ParadisEO,甚至得到了我的 IDE(我正在使用 Code::Blocks)来编译 QuickStart 示例。ParadisEO 提供具有单目标和多目标遗传算法的遗传算法。GertVdE 建议计算每个扇区的适应度,并将所有扇区适应度的总和最大化作为一个目标。我是否也可以通过多目标遗传算法最大化每个部门的适应度?那将是大约 50 个目标。
另外,我正在努力定义一个合理的交叉函数。由于每种颜色的最大数量是固定的,交叉会导致非法状态。如果我允许的数量超过之前给定的最大数量,则整体模式可能会收敛为较少“麻烦”组合的重复,其中麻烦的颜色已被丢弃。另一方面,我也可以丢弃多余的颜色,直到达到最大值,使交叉函数不保守。
(我对遗传算法完全陌生)