根据您的经验,权重分配问题的最佳交叉算子是什么。 特别是,我面临一个约束,即强制为所有权重之和的1。目前,我正在使用统一交叉运算符,然后我将所有参数除以总和得到1.交叉有效,但我不确定以这种方式我可以保存我的解决方案的好部分并转而收敛到更好的解决方案。 你有什么建议吗?没问题,如果我需要构建自定义运算符。
答案 0 :(得分:2)
如果您的初始人口由可行的人组成,您可以尝试differential evolution式方法。
重组算子需要三个(随机)向量,并将两个群体向量之间的加权差异加到第三个向量中:
offspring = A + f (B - C)
您可以在[0.6;中尝试固定加权系数f
。 2.0]范围或试验为每一代或每个差异向量随机选择f
(一种称为抖动的技术,它应该显着改善收敛行为,特别是对于嘈杂的目标函数)。
这应该很有效,因为后代将自动成为可能。
应特别注意避免过早收敛(例如某些小生境算法)。
修改
使用均匀交叉,您正在探索整个n维空间,而上述重组将个体限制为子空间H
(超平面Σ i w i = 1,其中w i 是原始搜索空间的权重。
阅读问题我认为权重总和是唯一的约束。由于存在其他约束,后代自动可行并不正确。
无论如何,任何可行的解决方案都必须在H
:
如果A =(a 1 , 2 ,... a n ),则B =(b 1 < / sub>,... b n ),C =(c 1 ,... c n )是可行的:
所以
Σ i (a i + f(b i - c i ))= Σ i a i + f(Σ i b i - Σ i c i )= 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;
这只是一个想法,我不确定它是如何运作的。