【问题标题】:Genetic Algorithm - Best crossover operator for a weights assignment遗传算法 - 权重分配的最佳交叉算子
【发布时间】:2014-11-12 18:21:36
【问题描述】:

根据您的经验,权重分配问题的最佳交叉算子是什么。 特别是,我面临一个约束,即所有权重的总和为 1。目前,我正在使用统一交叉运算符,然后将所有参数除以总和得到 1。交叉有效,但我不确定通过这种方式我可以保存解决方案的大部分并收敛到更好的解决方案。 你有什么建议吗?没问题,如果我需要构建自定义运算符。

【问题讨论】:

    标签: genetic-algorithm


    【解决方案1】:

    如果您的初始种群由可行的个体组成,您可以尝试differential evolution-like 方法。

    重组算子需要三个(随机)向量,并将两个总体向量之间的加权差值添加到第三个向量:

    offspring = A + f (B - C)
    

    您可以尝试在 [0.6 ; 2.0] 范围或实验为每一代或每个差异向量随机选择f(一种称为dither的技术,它应该会显着改善收敛行为,尤其是对于嘈杂的目标函数)。

    这应该很有效,因为后代将自动可行。

    应特别注意避免过早收敛(例如某些小众算法)。

    编辑

    通过均匀交叉,您正在探索整个 n 维空间,而上述重组将个体限制在子空间 H(超平面 Σi wi = 1,其中 wi 是原始搜索空间的权重。

    阅读问题时,我认为权重之和是唯一的约束。由于还有其他约束,因此后代自动可行是不正确的。

    无论如何,任何可行的解决方案都必须在H

    如果 A = (a1, a2, ... an), B = (b1, ... bn), C = (c1, ... cn) 是可行的:

    • Σi ai = 1
    • Σi bi = 1
    • Σi ci = 1

    所以

    Σi (ai + f (bi - ci)) = Σi ai + f (Σi bi - Σi c ) = 1 + f (1 - 1) = 1

    后代位于H 超平面上。

    现在,根据附加约束的数量/类型,您可以修改建议的重组算子或尝试基于惩罚函数的方法。

    EDIT2

    您可以分析确定f 的“有效”范围,但可能这样就足够了:

    f = random(0.6, 2.0);
    
    double trial[] = {f, f/2, f/4, -f, -f/2, -f/4, 0};
    
    i = 0;
    do
    {
      offspring = A +  trial[i] * (B - C);
      i = i + 1;
    } while (unfeasible(offspring));
    
    return offspring;
    

    这只是一个想法,我不确定它是如何工作的。

    【讨论】:

    • 首先感谢您的帮助。因此,您会建议采用 DE 方法。你能解释一下为什么你认为它应该比简单的统一交叉更好吗?然后,是的,我的人口由可行的个体组成,但我不明白为什么遵循这种方法的后代应该自动可行。实际上,我也可以得到负值,这在我的情况下是被禁止的,但无论如何总和并不总是 1。也许我不太了解。
    • 对不起,你是对的!当然我之前犯了一些错误! :P 可惜我不能使用那个系统。不幸的是,负权重是被禁止的,我没有其他限制。你认为退出有办法解决吗?我可以为满足约束的每个向量选择一个随机的 F 值,但我认为这可能需要很多时间,不是吗?我听说过惩罚函数,但我不知道它们如何帮助我解决问题。
    • 使用惩罚函数,您可以将约束优化问题替换为通过在原始目标函数中添加一个称为惩罚函数的项而形成的无约束问题。惩罚由一个参数乘以违反约束的度量组成。你可以看看en.wikipedia.org/wiki/Penalty_method
    • 关于 EDIT2,这正是我的意思。在受限问题中使用惩罚函数有什么好处?我的意思是,我怀疑收敛需要更多时间。我错了吗?
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 2015-06-29
    • 2016-08-31
    • 2012-09-23
    • 2015-07-03
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多