避免目标分散的GA适应度函数陷入困境



我正在研究一种遗传算法,作为一种有趣的编程练习。

问题是通过句子将两种不同语言的文本映射到另一种文本。由于不同的翻译可以在不同的地方开始和结束句子,因此文本之间存在大量但不完美的对应关系。

以两个字符串为例:

a X. a a Y. a aaa a. X a a. a aa. aaa a Y aa.
X b bb. b Y bb bbb b X bb. bb. b. bb Y. bbb b.

,其中X和Y是锚点,是a和b语言的特定词。我正在研究的基因将所有现有的句子中断(不包括结束的句号)作为二进制值;上面的例子在两个文本中都有六个句子,所以需要十个比特。手动工作,不理解文本本身,我认为最好的答案是:

10011 11010

(1 -不变,去掉0 -点,合并句子),结果是:

a X. a a Y a aaa a X a a. a aa. aaa a Y aa.
X b bb. b Y bb bbb b X bb. bb b. bb Y bbb b.

我的适应度函数评估如下四种条件:

  1. 句子要尽量多。
  2. 两个文本中必须有相同数量的句子。
  3. 句子的长度应该尽可能的接近。
  4. 尽可能多的锚点应该在两个文本的同一个句子中找到(锚点是我使用的样本小说中的角色名称)。

然而,我没有得到我所希望的结果,因为条件2,这是非常重要的,接管无论我做什么和进化停止。如果我不对正在发生的事情进行重大调整,我最终要么将整个事情合并成一个巨大的句子(上面的基因00000 00000),要么找到第一个匹配数量的句子并陷入困境。

总的来说,如何克服这个问题?当需要一系列相互矛盾的条件时,我怎样才能使适应度函数不被卡住呢?这个过程应该分为两个阶段吗?经过一些进化后,我如何重新引入条件2 ?我应该每N代计算一次吗?

与其把问题分成两个阶段,我认为你还不如改进你的适应度函数。拥有相互矛盾的条件并不一定是个问题。关键是你的健康分数是如何计算的。如果你给每个条件一个权重,每个都可以调整以获得更好的结果。

如果你能提供更多关于健康评分的细节,可能会更容易弄清楚发生了什么,但似乎某些条件天生比其他条件更重要。特别是因为如果结果是一个大句子,条件1应该给低分数,反之亦然。通过调整每种条件的相对权重,你应该能够瞄准两个条件都很好的基因,而不是一个或另一个。

最新更新