0

我将 ECJ 与 Java 一起使用。我有一群人,我都想拥有相同的大脑。

基本上,我想用 GP 进化大脑。我想要if 语句的“ if-on-enemy-territory”和“ ”之类的东西,以及终端的 “ ”或“ ”或“ ”之类的东西。if-sense-targetgo-homemove-randomlyshoot

但是,这些语句需要是完全可执行的 Java 代码。我怎么能用 ECJ 做到这一点?

例如:

我希望有一个名为“ moveRandom”的终端。如果我要在我的士兵课程中编写这个代码,它看起来像:

private void moveRandomly(SoldierWorld world)
 {
  //..snip.

  int newX = (int)(this.getLocation().x + speed * Math.cos(this.getDirection() * Math.PI / 180.0));
  int newY = (int)(this.getLocation().y - speed * Math.sin(this.getDirection() * Math.PI / 180.0));

  Point newPoint = new Point(newX, newY);
  this.setLocation(newPoint); 
 }

现在我怎样才能制作一个将执行此代码的终端?

4

1 回答 1

1

我将枚举您拥有的所有函数,然后创建一个函数集类来执行与枚举关联的函数:

public class FunctionSet
{
    public enum FuncName
    {
        MOVE_RANDOM,
        SHOOT,
        GO_HOME,
        ...
    }

    public FunctionSet()
    {

    }

    public void Execute(FuncName funcName, Soldier soldier, SoldierWorld world)
    {
        switch(funcName)
        {
            case FuncName.MOVE_RANDOM:
                soldier.moveRandom(world);
                break;
            case FuncName.SHOOT:
                soldier.shoot(...);
                break;
            case FuncName.GO_HOME:
                soldier.goHome(...);
                break;
            default:
                break;
        }
    }
}

因此,表达式树中的节点现在不会包含实际函数,而只会包含FuncName枚举...您可能需要做一些额外的工作,例如跟踪与每个函数关联的参数数量并将其放在哈希中地图。

或者,您可以使用反射从类中获取所有适用的函数名称Soldier,然后将它们放置在具有相应数量参数的映射中。

于 2010-06-29T20:25:34.903 回答