Пример #1
0
        /// <summary>
        /// Evaluate the provided IBlackBox against the IPD problem domain and return its fitness score.
        /// </summary>
        public FitnessInfo Evaluate(IBlackBox phenome)
        {
            EvaluationCount++;

            PhenomeInfo pi             = EvaluateBehavior(phenome);
            double      noveltyFitness = EvaluateNovelty(pi);

            double primaryFitness;

            switch (_info.EvaluationMode)
            {
            case IPDExperiment.EvaluationMode.Novelty:
                primaryFitness = noveltyFitness; break;

            case IPDExperiment.EvaluationMode.Wins:
                primaryFitness = pi.Wins; break;

            default:
            case IPDExperiment.EvaluationMode.Score:
                primaryFitness = pi.Score; break;
            }

            lock (_stopLock)
            {
                if (_info.EvaluationLimit > 0 && EvaluationCount > _info.EvaluationLimit)
                {
                    System.Media.SoundPlayer alarm = new System.Media.SoundPlayer(SharpNeat.Domains.Properties.Resources.Alarm02);
                    alarm.Play();
                    _stopConditionSatisfied = true;
                }
            }

            return(new FitnessInfo(primaryFitness, pi.AuxiliaryFitnessInfo));
        }
Пример #2
0
        private double EvaluateNovelty(PhenomeInfo info)
        {
            //if (_info.EvaluationMode != IPDExperiment.EvaluationMode.Novelty)
            //    return 0;

            int ii = 0;

            double CalculateNovelty(PhenomeInfo pi)
            {
                _archive.Sort((a, b) => a.Distance(pi).CompareTo(b.Distance(pi)));
                double dist = 0;

                for (int i = 0; i < _info.NoveltyK; i++)
                {
                    dist += _archive[i + ii].Distance(pi);
                }
                return(dist / _info.NoveltyK);
            }

            if (_archiveThresholdFactor >= 1.1)
            {
                _archiveThreshold      *= _archiveThresholdFactor;
                _archiveThresholdFactor = 1.0d;
            }

            lock (_archiveLock)
            {
                info.ID = _archive.Count;
                if (_archive.Count <= _info.NoveltyK)
                {
                    _archive.Add(info);
                    ii = 1;
                    if (_archive.Count == _info.NoveltyK + 1)    //last free add
                    {
                        _archiveThreshold = _archive.Average(a => { return(CalculateNovelty(a)); });
                    }
                    return(0);
                }
                else
                {
                    double novelty   = CalculateNovelty(info);
                    double threshold = _archiveThreshold * _archiveThresholdFactor;
                    if (novelty < threshold)
                    {
                        //not a novel phenome
                        _archiveThresholdFactor -= 0.002;
                        return((novelty / threshold) * _noveltyFitness);
                    }
                    else
                    {
                        //novel phenome
                        _archiveThresholdFactor += 0.05;
                        _archive.Add(info);
                        return(++_noveltyFitness);
                        //if (_archive.Count > 100)
                        //    _archive.RemoveAt(0);
                    }
                }
            }
        }
Пример #3
0
 public IPDEvaluator(ref IPDExperiment.Info info)
 {
     _info = info;
     _info.BestNoveltyGenome = () => { var m = _archive.Max(); return(m.Phenome); };
     _info.Archive           = () => { return(_archive); };
     _info.Evaluations       = () => { return(EvaluationCount); };
     PhenomeInfo.Initialize(info);
 }