Sender: |
|
Date: |
Thu, 9 Dec 2010 14:54:21 +0100 |
Reply-To: |
|
Subject: |
|
MIME-Version: |
1.0 |
Content-Transfer-Encoding: |
8bit |
In-Reply-To: |
|
Content-Type: |
text/plain; charset=ISO-8859-1 |
From: |
|
Parts/Attachments: |
|
|
Sean
now I want to join the exchange of emails. I am also a newbie (you
might remember me from struggling last week...)
For the sake of general understanding I reckon the 'normal' way would
be to have for each var a class representation, as you might want to
control gpnodes having respective constraints? I assume it depends on
the type of vars and the problem itself - if e.g. they are all of the
same data type it doesn't matter whether to have each single class
representations or tackle them by specialized ECRs. Otherwise you
might have solutions like y = "integer greater than a boolean".
Am I correct?
Regards
Calle
On 9 December 2010 14:27, Sean Luke <[log in to unmask]> wrote:
> You could certainly represent your variables as special kinds of ERCs. Here
> they'd hold the index into the array of current variable values your Problem
> is dishing out (I called that "vars" below). I slapped together code below
> but didn't compile it and I'm sure it'll require some modification. But I
> hope it gives you the general idea.
>
> Sean
>
>
>
> package ec.app.regression.func;
> import ec.*;
> import ec.app.regression.*;
> import ec.gp.*;
> import ec.util.*;
> import java.io.*;
>
>
> public class Var extends ERC
> {
> public String name() { return "Var"; } // distinguish from other ERCs you
> might be using
>
> int index;
>
> public void resetNode(final EvolutionState state, final int thread)
> {
> // we'll reset our index to reflect a variable in the problem
> prototype
> MyProblem prob = (MyProblem)(state.evaluator.p_problem);
> nodeIndex = state.random[thread].nextInt(prob.vars.length);
> }
>
> public int nodeHashCode() { return this.getClass().hashCode() +
> nodeIndex; }
>
> public boolean nodeEquals(final GPNode node)
> {
> // check first to see if we're the same kind of ERC --
> // won't work for subclasses; in that case you'll need
> // to change this to isAssignableTo(...)
> if (this.getClass() != node.getClass()) return false;
> // now check to see if the ERCs hold the same value
> return (((Var)node).index == index);
> }
>
> public void readNode(final EvolutionState state, final DataInput
> dataInput) throws IOException
> {
> index = dataInput.readInt();
> }
>
> public void writeNode(final EvolutionState state, final DataOutput
> dataOutput) throws IOException
> {
> dataOutput.writeInt(index);
> }
>
> public String encode() { return Code.encode(index); }
>
> public boolean decode(DecodeReturn dret)
> {
> // store the position and the string in case they
> // get modified by Code.java
> int pos = dret.pos;
> String data = dret.data;
>
> // decode
> Code.decode(dret);
>
> if (dret.type != DecodeReturn.T_INT) // uh oh!
> {
> // restore the position and the string; it was an error
> dret.data = data;
> dret.pos = pos;
> return false;
> }
>
> // store the data
> infrc = dret.l;
> return true;
> }
>
> public String toStringForHumans() { return "Var[" + index + "]"; }
>
> public void eval(final EvolutionState state,
> final int thread,
> final GPData input,
> final ADFStack stack,
> final GPIndividual individual,
> final Problem problem)
> {
> MyProblem prob = (MyProblem)(problem);
> return prob.vars[index];
> }
> }
>
|
|
|