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 格式,并尝试识别每个函数和终端,并构建一个由等效节点对象组成的树(参见 org.epochx.epox.* 包)。然后可以评估树以运行程序。

但是在 Epox 中没有称为 FUNCTION 的内置函数,也没有任何已知的文字“void”、“bubbleSort”、“int*”或“numbers”。所以解析失败。所以你需要将这些构造添加到EpoxParser,这样它就知道如何将它们解析为节点。您可以使用declareFunction,declareLiteraldeclareVariable方法来做到这一点(参见 EpoxParser 的 JavaDoc http://www.epochx.org/javadoc/1.4/)。

于 2013-08-09T15:34:28.417 回答