求解非图的进化算法

时间:2014-04-09 14:50:46

标签: algorithm genetic-algorithm evolutionary-algorithm

我想尝试使用进化算法解决非图形。 我将健身表示为满足董事会的约束数量。 例如,10X10板有20个约束(10个左边,10个顶部)

所以我的最大体重是20岁。

我的主要问题是大多数情况下算法陷入局部最大值(15-18适应度) 我不知道如何阻止它或向正确的方向跳跃。

有时候算法会设法解决难题。

我使用简单的交叉(第一个x行和第二个y行) 并且突变会改变1个随机细胞。

有关更好的突变或其他技术的任何想法可以帮助我解决当地的最大问题吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

这里的问题是GA对于约束满足问题不是很好,例如我给出了只有一种配置和GA满足的板,因为我们知道将尝试不同的排列来获得解决方案。对于10X10非图形,您在置换中获得解的概率为(1/2^100),因此即使您跳过局部最小值,也很难得到解。 GA对于诸如背包或TSP之类的优化问题非常有用,您可以在其中获得解决方案,但需要对其进行改进。

解决方案: -

使用混合整数和约束编程

答案 1 :(得分:2)

我不同意先前的回复,GA在约束满足时非常好,而且在2 ^ 100个选项中只有1个答案,你不进行随机搜索所以1 / 2 ^ 100概率并不完全正确。

在谈论GA时要记住的重要一点是,他们要建立起来'解决方案,通过探索搜索空间并查看不同选项有多好。我认为你的主要问题是你的健康,只有20个健身值使得算法很难区分出一个好的'来自好的++'的解决方案解决方案,这就是你在15-18范围内结束的原因。

创建GOOD健身功能是GA设计中最难的问题之一,通常需要多次尝试才能正确使用,让我们看一个例子来解释我的意思。

取2x2 Nonogram。

  2 1
2|_|_|
1|_|_|

解决方案:

  2 1
2|X|_|
1|_|_|

从健身函数中得到0分,因为它满足0个约束条件。

解决方案:

  2 1
2|_|_|
1|_|X|

你的健身功能会得到2分,但正如你可能已经意识到的那样,第一个是步骤'对于解决方案,第二个将被卡在那里。很明显,您的健身功能需要稍微重新审视和调整,因此您可以采取正确方向的解决方案'并以它们为基础(通过突变或交叉,通过你如何形容它们,我觉得很好)。

答案 2 :(得分:1)

(添加到Sisnett的good answer上)

  

关于更好的突变或其他技术可以帮助我解决局部最大问题的任何想法吗?

您可以采用标准的变异/交叉算子,可能需要改进问题的表示形式和适应度函数。

在这里,我只是举一个例子。在Github上可以找到更多details和可能的C++ implementation(基于Vita框架)。

个人代表

候选解决方案(即GA群体的个体)可以编码为整数序列。

请考虑以下问题:

. # # # . . . .  3
# # . # . . . .  2 1
. # # # . . # #  3 2
. . # # . . # #  2 2
. . # # # # # #  6
# . # # # # # .  1 5
# # # # # # . .  6
. . . . # . . .  1
. . . # # . . .  2
1 3 1 7 5 3 4 3
2 1 5 1

模式可以编码为(列顺序)为:

COLUMN (zero-based indexing)
| 0  |  1  |  2  |  3  | 4| 5| 6| 7|

{1, 2, 0, 2, 0, 0, 0, 0, 4, 4, 2, 2}

 ^  ^                          ^  ^
 |  |                          |  +-- last block (size 3)
 |  |                          +----- second to last block (size 4)
 .  .                          .  .
 .  .                          .  .
 .  .                          .  .
 |  +-------------------------------- second block (size 2)
 +----------------------------------- first block (size 1)

,其中每个数字代表一个方块到第一个允许放置位置的距离。总共在8列上有12个块。

按列编码 是任意选择。相同的模式可以表示为(行顺序):

{1, 0, 0, 1, 1, 2, 1, 2, 0, 0, 0, 4, 3}

这次是9行中的13个区块。

根据问题的结构(即线索的数量和类型),一种方法可能比另一种方法更好(从性能的角度来看)。

无论如何,始终可以:

  1. 交换行和列线索
  2. 解决由此产生的问题
  3. 转置解矩阵以获得原始问题的解

请注意,该表示允许无效的个人。请考虑以下列:

.
.
.
.
1
2

唯一的解决方案是{0,0}

#
.
#
#
1
2

但是该表示形式还允许{0,1}{0,2}{0,3},... {3,2}{3,3}

要“保持简单”,可以将无效整数映射到有效范围(例如,通过 modulo运算符),从而在基因型(整数列表)和表型(块在板上的实际位置)。

这与“语法进化”方案非常相似,在该方案中,搜索算法所操作的对象以及适应性评估函数所解释的内容都不同。

健身功能

首先,您需要一个解码功能,该功能在给定基因组的情况下返回true / false矩阵。

使用建议的表示形式,列约束(即列线索)已经得到满足。适应度函数仅考虑行线索来衡量个人的表现。

例如

Solution:                Candidate solution:
                         {1,2,0,2,0,0,0,0,4,4,2,0}

. # # # . . . .  3       . # # # . . . #  3 1    <-- ERROR
# # . # . . . .  2 1     # # . # . . . #  2 1 1  <-- ERROR
. # # # . . # #  3 2     . # # # . . # #  3 2
. . # # . . # #  2 2     . . # # . . # .  2 1    <-- ERROR
. . # # # # # #  6       . . # # # # # .  5      <-- ERROR
# . # # # # # .  1 5     # . # # # # # .  1 5
# # # # # # . .  6       # # # # # # . .  6
. . . . # . . .  1       . . . . # . . .  1
. . . # # . . .  2       . . . # # . . .  2
1 3 1 7 5 3 4 3          1 3 1 7 5 3 4 3
2 1 5 1                  2 1 5 1

最后一列的块放错了位置

ROW  CORRECT  WRONG     DELTA
0     [3]     [3,1]     |3-3| + |0-1| = 1
1     [2,1]   [2,1,1]   |2-2| + |1-1| + |0-1| = 1
3     [2,2]   [2,1]     |2-2| + |2-1| = 1
4     [6]     [5]       |6-5| = 1

FITNESS = -sum(delta_i) = -4

适应度函数计算正确和错误序列之间的距离,按顺序匹配元素并取其绝对差。

注释

GA往往会产生好的但次优的解决方案,并且这种行为仅对于某些组合优化问题是可以接受的。

建议的表示形式足以检测低阶模式中的偏差,并结合信息最终收敛(我玩过30x30非图)。

还有进一步的改进,但这应该是一个很好的起点。

答案 3 :(得分:0)

这是一个解决非图表的python代码。就是这样:

DateUtil.getExcelDate

就是这样!