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; }
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); }
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]; }
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]; }
/// <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); }
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; }
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; }
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 }