java - 序列化 ECJ GP individual 以供以后执行

标签 java serialization genetic-programming

使用遗传编程 ECJ 21 ,我正在寻找有关如何序列化 ec.Individual 的建议(在成功(?)进化之后)。

诀窍是,然后我需要在稍后阶段反序列化这个 GP,并执行它......最好是在 ECJ 框架之外(在工作时“执行”GP 似乎涉及很多脚手架) ECJ 框架,因为它实际上旨在发展事物,而不是“运行”它)。

我已经有了一些差不多的东西:

public static void main (String [] args) {
    File f = new File("./my.params");
        if (!f.exists() ) {
            throw new InvalidParameterException(f.getName() + " does NOT exist");
        }
        ParameterDatabase pd = new ParameterDatabase(f, new String []{f.getCanonicalPath()});

        Output output = ec.Evolve.buildOutput();

        EvolutionState evs = ec.Evolve.initialize(pd, 0,output);

        evs.run(EvolutionState.C_STARTED_FRESH);
        Individual [] individuals =  ((SimpleStatistics)evs.statistics).getBestSoFar();

        String bestIndividStr = "";
        for (Individual individual : individuals) {
            bestIndividStr = printToLog(evs, individual);
        }

        Species s = individuals[0].species;
        s = new GPSpecies();

        Individual gpInd = s.newIndividual(evs,  new LineNumberReader(new StringReader(bestIndividStr)));
}

private static String printToLog(EvolutionState evs, Individual individual) {
    String bestIndividStr;
    ByteArrayOutputStream baos  = new ByteArrayOutputStream();
    PrintWriter pw = new PrintWriter(baos);
    individual.printIndividual(evs, pw);
    pw.append(System.lineSeparator());
    pw.close();
    bestIndividStr = baos.toString();
    LoggerFactory.getLogger(Evolve.class).info("Best Dude: \n{}",bestIndividStr);
    return bestIndividStr;
}

好的,这里有一些问题:

  1. 现在如何输入一些变量并评估 gpInd
  2. 在此示例情况中,我有可用的原始个人, 所以我可以从中获取物种引用(然后用于 根据原始个体的输出创建一个新个体)。在我真实的 这种情况我不会这么做。

printIndividual(..) 生成的文本输出编写我自己的解析器和评估堆栈应该不会那么难,但如果有一个更简单的(构建的),我宁愿不这样做-in)方式。

PS:到目前为止我所拥有的都是基于 this tutorial 构建的

最佳答案

我也遇到了类似的问题。 我的解决方案是通过子类化 GPNode 来创建个人的 XML 表示形式。以下源代码显示了适当的实现。

public abstract class XMLGPNode extends GPNode {

/**
 * 
 */
private static final long serialVersionUID = 2732707537997825895L;


public StringBuilder makeXMLTree() {
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = null;
    StringBuilder sb = new StringBuilder();

    try {
        docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.newDocument();

        makeXMLTree(doc, null);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer;

        transformer = transformerFactory.newTransformer();

        DOMSource source = new DOMSource(doc);
        StringWriter sw = new StringWriter();

        StreamResult result = new StreamResult(sw);

        // Output to console for testing
        // StreamResult result = new StreamResult(System.out);

        transformer.transform(source, result);
        sb.append(new String(sw.getBuffer()));
    } catch (TransformerConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TransformerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    return sb;
}


private void makeXMLTree(Document doc, Element parent)  {

    Element child = doc.createElement(toString());              
    if (parent==null) {
        doc.appendChild(child);
    } else {
        parent.appendChild(child);
    }

    if (children.length > 0) {                  
        for(int x=0; x<children.length; x++)   {
            ((XMLGPNode)children[x]).makeXMLTree(doc, child);

        }
    }

}

然后可以在问题中对最终个体进行序列化,以便将其保存或传输到另一个应用程序或加载它以进行新的评估。

以下代码片段显示了 GPProblem 实现的 evaluate 方法中根节点的 makeXMLTree 方法调用。

    public void evaluate(final EvolutionState state, 
        final Individual ind, 
        final int subpopulation,
        final int threadnum)  {

    if (!ind.evaluated) {  // don't bother reevaluating

        int hits = 0;
        ...
        ...

        transformationType = new TransformationType(TransformationType.TYPE.values()[state.random[threadnum].nextInt(TransformationType.MAX_INPUT_TYPES)]);

        ((GPIndividual)ind).trees[0].child.eval(state,threadnum,input,stack,((GPIndividual)ind),this);

        XMLGPNode child = (XMLGPNode)((GPIndividual)ind).trees[0].child;


        **String individual = child.makeXMLTree().toString();**

... ...

关于java - 序列化 ECJ GP individual 以供以后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24373981/

相关文章:

JavaFX 8 - 如何将 TextField 文本属性绑定(bind)到 TableView 整数属性

Session.getInstance 的 Java 邮件问题

c - C中的数据序列化?

ruby - 是否有迭代编写新程序的程序?

probability - 如何实现非均匀概率分布?

java - Thymeleaf 返回 String 数组而不是 List<Object>

java - 匿名类中的执行顺序

jQuery 的 .serialize() 不执行任何操作

java - 给定类的 Gson 序列化器(如果在另一个特定类中)

python - 为什么TPOT推荐分类器的得分低于LinearSVC?