【发布时间】:2014-11-12 18:21:36
【问题描述】:
根据您的经验,权重分配问题的最佳交叉算子是什么。 特别是,我面临一个约束,即所有权重的总和为 1。目前,我正在使用统一交叉运算符,然后将所有参数除以总和得到 1。交叉有效,但我不确定通过这种方式我可以保存解决方案的大部分并收敛到更好的解决方案。 你有什么建议吗?没问题,如果我需要构建自定义运算符。
【问题讨论】:
根据您的经验,权重分配问题的最佳交叉算子是什么。 特别是,我面临一个约束,即所有权重的总和为 1。目前,我正在使用统一交叉运算符,然后将所有参数除以总和得到 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 + 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;
这只是一个想法,我不确定它是如何工作的。
【讨论】: