Encoding 此场景中使用的遗传算法编码技术

Encoding 此场景中使用的遗传算法编码技术,encoding,genetic-algorithm,Encoding,Genetic Algorithm,该问题是利用遗传算法在多个仓库中寻找总成本最小的最优数量 假设有n仓库。与每个仓库相关的有几个因素: LCosti:仓库i的装载成本 HCosti:仓库i的持有成本 TCosti:仓库i的运输成本 OCosti:仓库i的订购成本 每个仓库都有与其关联的数量Qi,必须满足以下4个标准: 装载约束:Qi*LCosti>=仓库i的Ai 持有约束:Qi*HCosti>=仓库i的Bi 运输限制:Qi*TCosti>=仓库i的Ci 订购约束:Qi*OCosti>=仓库i的Di 其中A、B、C和D是每

该问题是利用遗传算法在多个仓库中寻找总成本最小的最优数量

假设有
n
仓库。与每个仓库相关的有几个因素:

  • LCosti:仓库i的装载成本
  • HCosti:仓库i的持有成本
  • TCosti:仓库i的运输成本
  • OCosti:仓库i的订购成本
每个仓库都有与其关联的数量Qi,必须满足以下4个标准:

  • 装载约束:Qi*LCosti>=仓库i的Ai
  • 持有约束:Qi*HCosti>=仓库i的Bi
  • 运输限制:Qi*TCosti>=仓库i的Ci
  • 订购约束:Qi*OCosti>=仓库i的Di
其中A、B、C和D是每个仓库的常数

另一个重要标准是每个合格中介机构必须满足:

  • 地>=气
其中Di是仓库i中的需求

总成本的方程式为:

总成本=总和(合格中介机构*(LCosti+HCosti+TCosti)+OCosti/Qi)


如何为这个问题编码染色体?我的想法是,结合四个约束中的一个,给出Qi的最小允许值和最后一个约束,我可以得到Qi的范围。然后我可以为初始总体随机生成该范围内的值。但在上述场景中,我如何执行交叉和变异?如何对染色体进行编码?

一般来说,在约束问题中,基本上有三种可能的方法(关于进化算法):

1.将约束违反合并到适应度中 您可以将您的健身设计为实际目标和违反约束的惩罚的总和。最极端的情况是“死刑”,即任何以任何方式违反任何约束的个人都可能受到最坏的惩罚

这种方法通常很容易实现,但有一个很大的缺点:它通常会惩罚具有良好构建块但过度违反约束的解决方案

2.校正运算符,抗编码 如果您的问题有可能解决,您可以实现“更正运算符”(correction operators)——将违反约束的解决方案转换为另一个不违反约束的解决方案的运算符,从而尽可能保留原始解决方案的结构。类似的事情是使用这样一种编码来保证解决方案总是可行的,也就是说,你有这样一种解码算法,它总是产生有效的解决方案

如果可能,这可能是您可以采取的最佳方法。但是,如果不对解决方案进行重大更改,则通常很难实现,或者不可能实现,因为这些更改会大大降低搜索速度,甚至使搜索变得无用

3.多目标方法 使用一些多目标(MO)算法,例如NSGA-II,并将违反约束的度量转化为目标,同时优化所有目标。MO算法通常提供解的帕累托前沿——位于目标冲突权衡空间前沿的一组解。

使用此方法,可以保持相同的表示形式,并避免双重转换(整数->二进制,二进制->整数)

突变操作是:

V(g+1, i) = X(g, r1) + F ⋅ (X(g, r2) − X(g, r3))
其中:

  • i
    r1
    r2
    r3
    都是对总体中向量的引用,没有一个向量与另一个向量相等
  • F是[0,1.5]范围内的随机常数
V
(突变载体)与目标载体(
X(g,i)
)的元素重组以构建试验载体
u(g+1,i)
。选择过程从试验向量和目标向量中选择更好的候选者(有关更多详细信息,请参阅下面的参考文献)

这种方法的有趣之处在于:

  • 你不必重新设计代码。你需要一个不同的变异/重组算子,并且(也许)你必须将一些实数转换成整数,但它简单而快速
  • 对于约束管理,您可以采用答案中描述的技术
  • DE已被证明对大量优化问题有效,并且似乎适合您的问题

参考资料:

  • 和一个老的(由肯尼斯·普莱斯和雷纳·斯托恩)作为介绍
  • 有关更多详细信息和许多代码示例

变量是什么?这些变量是染色体的组成部分。@Ray唯一的变量是Qi。我可以用Qi生成染色体,但我如何运行交叉?突变也很明显。我在问题中提到这些是为了完整性,也许是为了更好的方法,交叉似乎也很明显。你是如何存储Qi的?@Ray作为一个列表中的整数,例如,
[173,23,49,85]
是4个仓库的Qi,我将其视为一条染色体。交叉从一个这样的染色体到另一个这样的染色体的一些子列表。在变异时,我将整数转换成二进制,然后翻转一些位,再转换回整数。啊,你认为变异和交叉只发生在位级别。没必要。例如,变异算子可以是Qi->Qi+rand(-10,10)或Qi->Qi*exp(rand(-1,1))。另外,我认为你的气应该是漂浮的。最后,交叉可以(应该?)在向量索引级别完成。一个新的色氨酮只是从一个母体或另一个母体中选择的Q的混合物。