0

誰かがlgpの個人からイントロンを削除するために使用される特定のアルゴリズムを教えてもらえますか?

ありがとうございました

4

2 に答える 2

1

イントロンの除去に関する限り、私はこの論文を見ていきます:医療データマイニングにおける線形遺伝的プログラミングとニューラルネットワークの比較

論文の焦点はおそらく興味がないでしょうが、セクションII-B(20-21ページだと思います)。著者は、私が非常に優れた単純なイントロン検出アルゴリズムであると信じていることについて話し合っています。

これはかなり古い論文なので、この論文を引用している論文を検索して、役立つ可能性のある他のアプローチを探すことはおそらく価値があります。

特に、このペーパーで説明されているアルゴリズムのより高度なアプローチをお勧めします。

「線形GP、正準変換、およびその活用における冗長性:画像特徴合成のデモンストレーション」(Evolvable Machines 2011)

この2番目の論文を入手するには、タイトルをGoogleに入力するだけです。最初のリンクはSpringerペイウォールリンクである必要がありますが、[クイックビュー]をクリックすると、Googleキャッシュから問題なく論文を入手できるはずです。(あなたがそれに到達できない場合は私に知らせてください私は助けます)

于 2012-08-02T16:53:27.767 に答える
1

この機能を備えた遺伝的プログラミングに関するオープンソースプロジェクトを実装しました。線形遺伝的プログラミングの私のJava実装を見てください:

https://github.com/chen0040/java-genetic-programming

評価中の線形計画法のパフォーマンスを向上させるために、ライブラリには、「線形遺伝的プログラミング」の第3章で説明されているイントロン除去手順の実装が含まれています。実装は、Program.markStructuralIntrons()の

https://github.com/chen0040/java-genetic-programming/blob/master/src/main/java/com/github/chen0040/gp/lgp/program/Program.java

markStructuralIntrons()の原理は非常に単純で、以下は本から引用されています。

出典:Brameier、M 2004 On Linear Genetic Programming(thesis)

アルゴリズム3.1(構造イントロンの検出)

  1. set R_effには、現在のプログラム位置で有効なすべてのレジスタが常に含まれているとします。R_eff:= {r | rは出力レジスタ}です。最後のプログラム命令から開始し、後方に移動します。
  2. プログラム内の次の先行操作を次のようにマークします。destinationregisterr_destelement-ofR_eff。そのような命令が見つからない場合は、5に進みます。
  3. 操作がブランチまたはブランチのシーケンスに直接続く場合は、これらの命令にもマークを付けます。それ以外の場合は、R_effからr_destを削除します。
  4. 新しくマークされた命令の各ソース(オペランド)レジスタr_opがまだ含まれていない場合は、R_effに挿入します。2に進みます。
  5. 止まる。マークされていない命令はすべてイントロンです。

以下は、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());
                }
            }
        }
    }
}
于 2017-05-29T01:43:43.350 に答える