Вместо того, чтобы посылать числа, имея код, переданный человеку в генетическом программировании? СЕС - PullRequest
0 голосов
/ 29 марта 2010

Я использую ECJ с Java. У меня есть целая армия людей, которые хотят иметь один и тот же мозг.

По сути, я бы хотел развить мозги, используя GP. Я хочу такие вещи, как "if-on-enemy-territory" и "if-sense-target" для операторов if и "go-home" или "move-randomly" или "shoot" для терминалов.

Однако эти операторы должны быть полностью исполняемым 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); 
 }

Теперь, как я могу сделать терминал, который будет выполнять этот код?

1 Ответ

1 голос
/ 30 июня 2010

Я бы перечислил все имеющиеся у вас функции и затем создал бы класс набора функций, который выполняет функцию, связанную с перечислением:

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 и затем разместить их на карте с соответствующим числом параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...