0

ここに EpochX フレームワークの専門家が何人かいることを願っています...ユーザー グループがまだアクティブかどうかはわかりません。

私は、BNF 文法の表現内に単純な再帰を実装しようとしており、次の問題を楽しんでいます。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    at java.lang.String.substring(String.java:1911)
    at org.epochx.epox.EpoxParser.parse(EpoxParser.java:235)
    at org.epochx.epox.EpoxParser.parse(EpoxParser.java:254)
    at org.epochx.tools.eval.EpoxInterpreter.eval(EpoxInterpreter.java:89)
    at org.epochx.ge.model.epox.SAGE.getFitness(SAGE.java:266)
    at org.epochx.ge.representation.GECandidateProgram.getFitness(GECandidateProgram.java:304)
    at org.epochx.stats.StatField$7.getStatValue(StatField.java:97)
    at org.epochx.stats.Stats.getStat(Stats.java:134)
    at org.epochx.stats.StatField$8.getStatValue(StatField.java:117)
    at org.epochx.stats.Stats.getStat(Stats.java:134)
    at org.epochx.stats.Stats.getStats(Stats.java:162)
    at org.epochx.stats.Stats.print(Stats.java:194)
    at org.epochx.stats.Stats.print(Stats.java:178)
    at org.epochx.ge.model.epox.Tester$1.onGenerationEnd(Tester.java:41)
    at org.epochx.life.Life.fireGenerationEndEvent(Life.java:634)
    at org.epochx.core.InitialisationManager.initialise(InitialisationManager.java:207)
    at org.epochx.core.RunManager.run(RunManager.java:166)
    at org.epochx.core.Model.run(Model.java:147)
    at org.epochx.ge.model.GEModel.run(GEModel.java:82)
    at org.epochx.ge.model.epox.Tester.main(Tester.java:55)
Java Result: 1

私の単純な文法は次のように構成されています。端子は評価関数に個別に渡されます。

  public static final String GRAMMAR_FRAGMENT = "<program> ::= <node>\n"
          + "<node> ::= <s_list>\n"
          + "<s_list> ::= <s> | <s> <s_list>\n"
          + "<s> ::= FUNCTION( <terminal> )\n"
          + "<terminal> ::= ";

編集:端末の作成 -

// Generate the input sequences.
inputValues = BoolUtils.generateBoolSequences(4);

argNames = new String[4];
argNames[0] = "void";
argNames[1] = "bubbleSort";
argNames[2] = "int*";
argNames[3] = "numbers";

...

// Evaluate all possible inputValues.

    for (final boolean[] vars: inputValues) {
        // Convert to object array.
        final Boolean[] objVars = ArrayUtils.toObject(vars);

        Boolean result = null;
        try {
                      interpreter.eval(program.getSourceCode(),
                    argNames, objVars);
                      score = (double)program.getParseTreeDepth();
        } catch (final MalformedProgramException e) {
            // Assign worst possible fitness and stop evaluating.
            score = 0;
            break;
        }
    }
4

1 に答える 1

1

スタックトレースは、問題が実際には EpoxParser にあることを示しています。これは、形式が正しくない文法ではなく、生成されたプログラムを解析できないことを意味します。

EpoxInterpreter を使用しているため、生成されるプログラムは Epox プログラムとして解析されます。Epox は、EpochX のツリー表現が使用する言語を参照するために使用される名前です (独自のリテラル/関数を追加できる Lisp の一種の壊れた形式)。解析では S-Expression 形式が想定され、各関数と端末を識別しようとし、同等の Node オブジェクトで構成されるツリーを構築します (org.epochx.epox.* パッケージを参照してください)。次に、ツリーを評価してプログラムを実行できます。

しかし、Epox には、FUNCTION と呼ばれる組み込み関数も、既知のリテラル 'void'、'bubbleSort'、'int*'、または 'numbers' もありません。したがって、解析は失敗します。したがって、これらのコンストラクトを EpoxParser に追加する必要があります。これにより、それらをノードに解析する方法が認識されます。これはdeclareFunctiondeclareLiteralおよびdeclareVariableメソッドで実行できます (EpoxParser の JavaDoc を参照してください http://www.epochx.org/javadoc/1.4/ )。

于 2013-08-09T15:34:28.417 に答える