首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化ECJ GP个人以供以后执行

序列化ECJ GP个人以供以后执行
EN

Stack Overflow用户
提问于 2014-06-23 19:38:46
回答 1查看 263关注 0票数 2

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

诀窍是,我需要在稍后阶段反序列化这个GP,并在ECJ框架之外执行it...preferably (在ECJ框架中工作时,似乎有很多脚手架涉及到“执行”GP,因为这实际上是为了改进事物,而不是“运行”它)。

我几乎有这样的东西:

代码语言:javascript
复制
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(..)生成的文本输出编写自己的解析器和计算堆栈不应该那么困难,但如果有一种更简单(内置)的方法,我宁愿不这样做。

PS:到目前为止,我所做的是基于本教程构建的

EN

回答 1

Stack Overflow用户

发布于 2015-04-16 19:42:57

我也有过类似的问题。我的解决方案是通过子类GPNode创建个人的XML表示。下面的源代码显示了适当的实现。

代码语言:javascript
复制
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);

        }
    }

}

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

下面的代码片段显示了makeXMLTree-method调用GPProblem实现的evaluate-method中的根节点。

代码语言:javascript
复制
    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();**

... ...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24373981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档