コード例 #1
0
        public void MapInputs(ISignalArray inputSignalArray, SimpleSnakeWorld SnakeWorld)
        {
            int wi, hi;

            //_phenome.InputSignalArray.Reset();
            for (wi = 0; wi < SnakeWorld.Width; wi++)
            {
                for (hi = 0; hi < SnakeWorld.Height; hi++)
                {
                    Tile currTile = SnakeWorld[wi, hi];
                    //maybe enclose in a function to linearize...?
                    inputSignalArray[wi * SnakeWorld.Height + hi] = _tileToInput[currTile]; //HERES THE FOKKIN BUG

                    //Console.WriteLine("_phenome.InputSignalArray[" + (wi * _sw.CurrHeight + hi) + "] = " + _tileToInput[currTile] + " - " + currTile);
                }
            }

            int i;

            for (i = InputCount - 4; i < InputCount; i++)
            {
                inputSignalArray[i] = -1;
            }

            inputSignalArray[InputCount - 1 - _dirToIndex[SnakeWorld.SnakeDirection]] = 1;
        }
コード例 #2
0
 public void Init(SnakeRunnerSmart snakeRunner, IGenomeDecoder <NeatGenome, IBlackBox> genomeDecoder)
 {
     _snakeRunner   = snakeRunner;
     _sw            = _snakeRunner.SnakeWorld;
     _genomeDecoder = genomeDecoder;
     this.Size      = new Size((_sw.Width + 2) * _scaleFactor, (_sw.Height + 6) * _scaleFactor);
 }
コード例 #3
0
        public void MapOutputs(ISignalArray outputSignalArray, SimpleSnakeWorld sw)
        {
            int    dirIndex = 0;
            double maxVal   = double.MinValue;

            //lock (_consoleLock)
            {
                //Console.WriteLine("--------------------");
                //Console.WriteLine("outputSignalArray.Length = " + outputSignalArray.Length);

                for (int i = 0; i < outputSignalArray.Length; i++)
                {
                    //Console.WriteLine("outputSignalArray[" + i + "] (Direction " + _intToDir[i] + ") - val: " + outputSignalArray[i]);
                    if (outputSignalArray[i] > maxVal)
                    {
                        maxVal   = outputSignalArray[i];
                        dirIndex = i;
                    }
                }


                //Console.WriteLine("CHOSEN: outputSignalArray[" + dirIndex + "] (Direction " + _intToDir[dirIndex] + ") - val: " + outputSignalArray[dirIndex] + " - " + maxVal);
                //Console.WriteLine("--------------------");
            }

            sw.NextDirection = _intToDir[dirIndex];
        }
コード例 #4
0
        public void MapOutputs(ISignalArray outputSignalArray, SimpleSnakeWorld sw)
        {
            //[-1,1] -> [0,4]
            double dirNum   = (outputSignalArray[0] + 1) * 2;
            int    dirIndex = (int)Math.Floor(dirNum);

            sw.NextDirection = _intToDir[dirIndex];
        }
コード例 #5
0
        /// <summary>
        /// Create a System.Windows.Forms derived object for displaying output for a domain (e.g. show best genome's output/performance/behaviour in the domain).
        /// </summary>
        public AbstractDomainView CreateDomainView()
        {
            SnakePanel       sp = new SnakePanel();
            SimpleSnakeWorld sw = new SimpleSnakeWorld(_swparams);

            sw.Init();
            sp.Init(new SnakeRunnerSmart(sw, null, _inputMapper, _outputMapper, _msBetweenTicks, _maxTicksWithoutEating), new NeatGenomeDecoder(_activationScheme));
            return(sp);
        }
コード例 #6
0
        public SnakeRunnerSmart(SimpleSnakeWorld sw, IBlackBox phenome, IInputMapper inputMapper, IOutputMapper outputMapper, int _msBetweenTicks, int _maxTicksWithoutScoreChange)
        {
            this._sw                         = sw;
            this.Phenome                     = phenome;
            this._msBetweenTicks             = _msBetweenTicks;
            this._maxTicksWithoutScoreChange = _maxTicksWithoutScoreChange;

            _inputMapper  = inputMapper;
            _outputMapper = outputMapper;
        }
コード例 #7
0
        public void MapInputs(ISignalArray inputSignalArray, SimpleSnakeWorld SnakeWorld)
        {
            IEnumerable <TwoDPoint> points = SnakeWorld.FoodPoints;

            int i;
            int elIndex;

            // count*2 perché devo contrare entrambe le coordinate
            for (i = 0; i < points.Count() * 2;)
            {
                elIndex             = i / 2;
                inputSignalArray[i] = ((double)points.ElementAt(elIndex).X) / _width;
                i++;
                inputSignalArray[i] = ((double)points.ElementAt(elIndex).Y) / _height;
                i++;
            }


            for (i = 0; i < points.Count(); i++)
            {
                inputSignalArray[i + _foodCoordinatesNumber] = 1.0;
            }

            for (; i < _maxFood; i++)
            {
                inputSignalArray[i + _foodCoordinatesNumber] = -1.0;
            }

            points = SnakeWorld.GetSnakeHeadingPoints(_startLen);

            for (i = 0; i < _startLen * 2;)
            {
                elIndex = i / 2;
                inputSignalArray[i + _foodCoordinatesNumber + _maxFood] = ((double)points.ElementAt(elIndex).X) / _width;;
                i++;
                inputSignalArray[i + _foodCoordinatesNumber + _maxFood] = ((double)points.ElementAt(elIndex).Y) / _height;
                i++;
            }

            for (i = InputCount - 4; i < InputCount; i++)
            {
                inputSignalArray[i] = -1;
            }

            if (SnakeWorld.SnakeDirection == Direction.None)
            {
                return;
            }

            inputSignalArray[InputCount - 1 - _dirToIndex[SnakeWorld.SnakeDirection]] = 1;
        }
コード例 #8
0
        public FitnessInfo Evaluate(IBlackBox phenome)
        {
            SimpleSnakeWorld sw = new SimpleSnakeWorld(_swparams);

            sw.Init();
            SnakeRunnerSmart sr = new SnakeRunnerSmart(sw, phenome, _inputMapper, _outputMapper, 0, _maxTicksWithoutEating);

            //SimpleSnakeWorld clone = _srf.GetWorldClone();
            //clone.Init();
            //SnakeRunner sr = new SnakeRunnerWxH(clone, phenome, 0, _maxTicksWithoutScoreChange);


            int    totalSquaredScore           = 0;
            int    totalScore                  = 0;
            int    totalTicks                  = 0;
            double inverseOfMediumFoodDistance = 0;

            _wins = 0;
            int cutoffs = 0;

            for (int runs = 0; runs < _trialsPerEvaluation; runs++)
            {
                sr.RunTrial(runs);
                totalSquaredScore += sr.Score * sr.Score; //was totalScore += sr.Score; changed to emphasize large scores over lower scores
                totalScore        += sr.Score;
                totalTicks        += sr.Ticks;
                //inverseOfMediumFoodDistance += sr.Score / (double) sr.TotalFoodDistance;
                if (sr.Win)
                {
                    _wins++;
                }
                //if (sr.Cutoff)
                //    cutoffs++;
            }

            EvaluationCount++;
            return(new FitnessInfo(totalScore, totalSquaredScore)); //probably a good one
            //return new FitnessInfo(totalSquaredScore, totalScore);
            //return new FitnessInfo(totalScore, Double.MaxValue/(totalSquaredScore+1));
            //return new FitnessInfo(totalScore, Double.MaxValue / (totalSquaredScore - totalScore + 1)); //probably a good one
            //TODO: magari cambiare la fitness...
            //return new FitnessInfo((double)(totalSquaredScore + totalScore*totalScore)/1024, totalScore);
            //return new FitnessInfo(phenome.GetHashCode(), phenome.GetHashCode()); //prova
        }