Использование библиотеки AForge Genetic для определения состава волны в игре Tower Defense

Я пытаюсь использовать GA для создания более сильных волн врагов в игре Tower Defense, похожей на растения против зомби. Каждая популяция представляет собой волну, а каждая хромосома представляет собой врага (1011 = основной враг, 1111 = враг 2 и т. д.). Я использую библиотеку AForge, однако мне было интересно, можно ли установить начальную популяцию вместо того, чтобы она генерировалась случайным образом и как я могу установить значения x и y (расстояние и повреждение) для каждой хромосомы в популяции. Я также не совсем уверен в том, что представляет собой Range. Извините, если я пропустил что-то простое или неправильно понял, как это работает, вот что у меня есть до сих пор, спасибо:

 public class UserFunction : OptimizationFunction2D
{
    private double distanceMax = 1;
    private double damageMax = 1;
    private double w1 = 1;
    private double w2 = 1;


    public UserFunction() :
        base(new Range(0, 100), new Range(0, 100)) { }

    public override double OptimizationFunction(double distance, double damage)
    {
        return (w1*distance/distanceMax) + (w2*damage/damageMax);
    }
}

class RunProgram
{
    private Population[] populationArray = new Population[5];
    private UserFunction userFunction = new UserFunction();
    private BinaryChromosome chromosome = new BinaryChromosome(4);
    private int popSize = 20;
    private double mutateRate = 0.3;
    private double damage;
    private double distance;
    private double limit = 100;


    public RunProgram()
    {
        Pop();
    }

    private void Pop()
    {
           // create genetic population
        for (int i = 0; i < 5; i++)
        {
            populationArray[i] = new Population(popSize,
                                chromosome,
                                userFunction,
                                new RouletteWheelSelection());
        }

        foreach (var pop in populationArray)
        {
            pop.MutationRate = mutateRate;
        }

        for (int i = 0; i < 50; i++)
        {
            foreach (var pop in populationArray)
            {
                pop.RunEpoch();                    
            }                                                           
        }


        Array.Sort(populationArray, delegate(Population population1, Population population2) {
            return population1.FitnessAvg.CompareTo(population2.FitnessAvg);
            });


        EnemyList(populationArray[4]);
        Console.ReadLine();
    }

    void EnemyList(Population population)
    {
        for (int i = 0; i < popSize; i++)
        {
            Console.WriteLine("enemy "+ i +" is: "+population[i]);
        }
    }
}

person normower    schedule 12.03.2013    source источник


Ответы (1)


Я думаю, что все популяции приближаются к оптимальной волне. Таким образом, представление волны с населением бесполезно, если каждая волна не имеет уникальных условий.

person Cem Mutlu    schedule 15.08.2013