Algorithm 遗传算法中的交叉方法
当阅读遗传算法的交叉部分时,书籍和论文通常提到简单地交换两个待复制候选数据中的位的方法 我还没有看到针对实际工业应用程序实现的遗传算法的实际代码,但我发现很难想象它足以处理简单的数据类型 我一直认为,遗传算法的各个阶段将在涉及复杂数学运算的复杂对象上执行,而不是仅仅交换单个整数中的一些位 甚至只是列出了这些类型的交叉操作Algorithm 遗传算法中的交叉方法,algorithm,search,optimization,genetic-algorithm,evolutionary-algorithm,Algorithm,Search,Optimization,Genetic Algorithm,Evolutionary Algorithm,当阅读遗传算法的交叉部分时,书籍和论文通常提到简单地交换两个待复制候选数据中的位的方法 我还没有看到针对实际工业应用程序实现的遗传算法的实际代码,但我发现很难想象它足以处理简单的数据类型 我一直认为,遗传算法的各个阶段将在涉及复杂数学运算的复杂对象上执行,而不是仅仅交换单个整数中的一些位 甚至只是列出了这些类型的交叉操作 我是否遗漏了一些重要的东西,或者这些类型的交叉方法真的是唯一使用的东西吗?使用了几种方法。。。虽然对并行性和几代人(有时是一个大群体)的需要导致使用性能良好的技术 要记住的另一
我是否遗漏了一些重要的东西,或者这些类型的交叉方法真的是唯一使用的东西吗?使用了几种方法。。。虽然对并行性和几代人(有时是一个大群体)的需要导致使用性能良好的技术 要记住的另一点是,正确建模时“交换一些位”类似于自然发生的简单而准确的版本(基因重组、突变) 有关非常简单且编写良好的演练,请参见 有关更多信息,请参阅
还要确保您已经了解了遗传算法中的适应度函数与遗传编程中染色体内的运算符之间的差异。不同的应用程序需要不同的编码。我们的目标当然是找到最有效的编码,通常简单的编码更适合。例如,作业车间调度问题可以表示为排列列表,这些排列表示不同机器上作业的执行顺序(所谓的作业序列矩阵)。但是,它也可以表示为构造明细表的优先级规则列表。旅行商问题或二次分配问题通常由一个置换表示,该置换表示一种情况下的旅行或另一种情况下的分配。优化仿真模型的参数或查找复杂数学函数的根通常由实值向量表示 对于所有这些,仍然存在简单的交叉和变异算子。对于排列,这些是例如OX、ERX、CX、PMX、UBX、OBX和更多。如果可以组合许多简单的表示来表示复杂问题的解决方案,则可以重用这些操作并将它们分别应用于每个组件 交叉有效工作的重要一点是应满足以下几个属性:
- 交叉线应保留在这两个方面相似的部分
- 对于那些不相似的部分,交叉不应该引入一个已经不是父元素之一的元素
- 如果可能,两种解决方案的交叉应产生可行的解决方案
如果您想尝试不同的操作和问题,我们有一个很好的GUI驱动软件:。简单的位交换通常是一种方法。需要注意的关键是每个候选解决方案中使用的编码。应对解决方案进行编码,以便在新的后代中引入最小的错误或没有错误。任何错误都需要算法提供修复,这将导致处理时间增加 例如,我用C语言开发了一个大学时间表生成器,它使用整数编码来表示每天可用的时间段。这种表示允许使用LINQ intersect函数组合父对象的非常有效的单点或多点交叉算子 带爬山功能的典型多点交叉
public List<TimeTable> CrossOver(List<TimeTable> parents) // Multipoint crossover
{
var baby1 = new TimeTable {Schedule = new List<string>(), Fitness = 0};
var baby2 = new TimeTable {Schedule = new List<string>(), Fitness = 0};
for (var gen = 0; gen < parents[0].Schedule.Count; gen++)
{
if (rnd.NextDouble() < (double) CrossOverProb)
{
baby2.Schedule.Add(parents[0].Schedule[gen]);
baby1.Schedule.Add(parents[1].Schedule[gen]);
}
else
{
baby1.Schedule.Add(parents[0].Schedule[gen]);
baby2.Schedule.Add(parents[1].Schedule[gen]);
}
}
CalculateFitness(ref baby1);
CalculateFitness(ref baby2);
// allow hill-climbing
parents.Add(baby1);
parents.Add(baby2);
return parents.OrderByDescending(i => i.Fitness).Take(2).ToList();
}
公共列表交叉(列表父节点)//多点交叉
{
var baby1=新时间表{Schedule=new List(),Fitness=0};
var baby2=新时间表{Schedule=new List(),Fitness=0};
对于(var gen=0;geni.Fitness).Take(2.ToList();
}
我一直认为,遗传算法的各个阶段将在涉及复杂数学运算的复杂对象上执行,而不是仅仅交换单个整数中的一些位
您可能认为使用复杂的数学运算是因为您认为遗传算法必须修改复杂的对象。那个