有人可以指出一种用于从 lgp 个体中去除内含子的特定算法吗?
谢谢
至于去除内含子,我会看这篇论文:医学数据挖掘中的线性遗传规划和神经网络的比较。
虽然本文的重点可能不感兴趣,但在第 II-B 部分(我认为是第 20-21 页)。作者讨论了我认为非常好的简单内含子检测算法。
这是一篇相当古老的论文,因此搜索引用该论文的论文以寻找可以帮助您的其他方法可能是值得的。
我特别推荐一种更高级的方法,即本文中描述的算法:
“线性 GP 中的冗余、规范变换及其开发:图像特征合成演示”(Evolvable Machines 2011)
要获得第二篇论文,只需在 Google 中输入标题,第一个链接应该是 Springer 付费墙链接,但是如果您单击 Quick-View,您应该可以从 Google Cache 中获取论文没有问题。(如果你不能做到,请告诉我,我会帮助你)
我已经实现了一个具有此功能的遗传编程开源项目。请看一下我的线性遗传编程的java实现:
https://github.com/chen0040/java-genetic-programming
为了在评估期间提高线性程序的性能,该库包含“线性遗传编程”一书第 3 章中描述的内含子去除过程的实现。该实现可以在它的 Program.markStructuralIntrons() 中找到
markStructuralIntrons() 的原理很简单,下面是从书中引用的:
资料来源:Brameier, M 2004 线性遗传规划(论文)
算法 3.1(结构内含子的检测)
下面是用 Java 实现的 Program.markStructuralIntrons() 的过程:
public void markStructuralIntrons(LGP manager) {
int instruction_count=instructions.size();
for (int i = instruction_count - 1; i >= 0; i--) {
instructions.get(i).setStructuralIntron(true);
}
Set<Integer> Reff = new HashSet<>();
int io_register_count = manager.getRegisterCount();
for (int i = 0; i < io_register_count; ++i) {
Reff.add(i);
}
Instruction current_instruction = null;
Instruction prev_instruction = null; // prev_instruction is the last visited instruction from bottom up of the program
for (int i = instruction_count - 1; i >= 0; i--) {
prev_instruction = current_instruction;
current_instruction = instructions.get(i);
// prev_instruction is not an structural intron and the current_instruction
// is a conditional construct then, the current_instruction is not structural intron either
// this directly follows from Step 3 of Algorithm 3.1
if (current_instruction.getOperator().isConditionalConstruct() && prev_instruction != null) {
if (!prev_instruction.isStructuralIntron()) {
current_instruction.setStructuralIntron(false);
}
} else {
if (Reff.contains(current_instruction.getTargetOperand().getIndex())) {
current_instruction.setStructuralIntron(false);
Reff.remove(current_instruction.getTargetOperand().getIndex());
if (!current_instruction.getOperand1().isConstant()) {
Reff.add(current_instruction.getOperand1().getIndex());
}
if (!current_instruction.getOperand2().isConstant()) {
Reff.add(current_instruction.getOperand2().getIndex());
}
}
}
}
}