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