public void ProcessHitResult(HitResults hitResult) { if (hitResult == HitResults.Hit) { m_squaresHit.Add(m_lastTarget); if (m_tacticsState == Tactics.Random) { m_tactics = new AfterFirstHitFiring(m_enemyGrid, m_squaresHit[0], m_shipsLeft[0]); m_tacticsState = Tactics.AfterFirst; } else if (m_tacticsState == Tactics.AfterFirst) { m_tactics = new OrientationalFiring(m_enemyGrid, m_squaresHit.ToArray(), m_shipsLeft[0]); m_tacticsState = Tactics.Orientational; } else { m_tactics.AddNewHit(m_lastTarget); } } else if (hitResult == HitResults.Sunk) { m_squaresHit.Add(m_lastTarget); m_squaresHit.Sort(((sq1, sq2) => sq1.Row == sq2.Row ? sq1.Column - sq2.Column : sq1.Row - sq2.Row)); m_enemyGrid.OccupySquares(m_squaresHit.ToArray()); int shipLength = m_squaresHit.Count; m_shipsLeft.Remove(shipLength); if (AnyShipLeft()) { m_squaresHit.Clear(); m_tactics = new RandomFiring(m_enemyGrid, m_shipsLeft[0]); m_tacticsState = Tactics.Random; } } }
/// <summary> /// 是否为有效判定,子类可以重写该方法 /// </summary> /// <param name="hitresult"></param> /// <returns></returns> public virtual bool IsValidHitResult(HitResults hitresult) { switch (hitresult) { case HitResults.Hit300: case HitResults.Hit100: case HitResults.Hit50: case HitResults.HitMiss: return(true); default: return(false); } }
public double CalculateHitScore() { if (!_scoreIsCalculated) { /*double timeReduction = 1 - (FlaggedAreaSize()/ (end - start)); * double eventsHit = (double)events.Where(x => x.isHit).Count() / events.Count; * score = ((TIME_WEIGHT * timeReduction) * (HIT_WEIGHT * eventsHit)) / (HIT_WEIGHT + TIME_WEIGHT); * _scoreIsCalculated = true; * return score;*/ HitResults hitResult = CalculateHitResult(); score = (2 * (hitResult.hits / ((double)hitResult.misses + hitResult.hits)) //Precision * (hitResult.eventHits / ((double)hitResult.eventsTotal))) //recall / ((hitResult.hits / ((double)hitResult.misses + hitResult.hits)) //Precision + (hitResult.eventHits / ((double)hitResult.eventsTotal))); //recall _scoreIsCalculated = true; return(score); } else { return(score); } }
public double CalculateCoveredScore() { if (!_scoreVotingIsCalculated) { /*double timeReduction = 1 - (FlaggedAreaSize()/ (end - start)); * double eventsHit = (double)events.Where(x => x.isHit).Count() / events.Count; * score = ((TIME_WEIGHT * timeReduction) * (HIT_WEIGHT * eventsHit)) / (HIT_WEIGHT + TIME_WEIGHT); * _scoreIsCalculated = true; * return score;*/ HitResults hitResult = CalculateHitResult(); double covered = FlaggedAreaSize(); double totalArea = CalculateTotalNormalArea(); _scoreVotingIsCalculated = true; _coveredScore = (2 * (hitResult.hits / ((double)hitResult.misses + hitResult.hits)) //Precision * (1 - (covered / totalArea))) //recall / ((hitResult.hits / ((double)hitResult.misses + hitResult.hits)) //Precision + (1 - (covered / totalArea))); //recall return(score); } else { return(score); } }
public HitResults CalculateHitResult() { if (!_calculatedHitResult) { int Hits = 0; int EventHits = 0; int EventTotal = events.Count; int Misses = 0; foreach (Events ev in events) { if (ev.isHit) { EventHits++; } } foreach (var pointOfIn in poi.GetFlaggedAreas()) { if (pointOfIn.Item1 > start && pointOfIn.Item2 < end) { bool hitted = false; foreach (var ev in events) { if (pointOfIn.Item1 < ev.GetTimestampStart() && ev.GetTimestampEnd() < pointOfIn.Item2) { Hits++; hitted = true; break; } else if (pointOfIn.Item1 >= ev.GetTimestampStart() && pointOfIn.Item2 >= ev.GetTimestampEnd() && pointOfIn.Item1 <= ev.GetTimestampEnd()) { Hits++; hitted = true; break; } else if (pointOfIn.Item1 <= ev.GetTimestampStart() && pointOfIn.Item2 <= ev.GetTimestampEnd() && pointOfIn.Item2 >= ev.GetTimestampStart()) { Hits++; hitted = true; break; } else if (ev.GetTimestampStart() <= pointOfIn.Item1 && pointOfIn.Item2 <= ev.GetTimestampEnd()) { Hits++; hitted = true; break; } } if (hitted == false) { Misses++; } } _calculatedHitResult = true; } _hitResult = new HitResults(EventHits, Hits, Misses, EventTotal); return _hitResult; } else { return _hitResult; } }
public HitResults CalculateHitResult() { if (!_calculatedHitResult) { int Hits = 0; int EventHits = 0; int EventTotal = events.Count; int Misses = 0; foreach (Events ev in events) { if (ev.isHit) { EventHits++; } } foreach (var pointOfIn in poi.GetFlaggedAreas()) { if (pointOfIn.Item1 > start && pointOfIn.Item2 < end) { bool hitted = false; foreach (var ev in events) { if (pointOfIn.Item1 < ev.GetTimestampStart() && ev.GetTimestampEnd() < pointOfIn.Item2) { Hits++; hitted = true; break; } else if (pointOfIn.Item1 >= ev.GetTimestampStart() && pointOfIn.Item2 >= ev.GetTimestampEnd() && pointOfIn.Item1 <= ev.GetTimestampEnd()) { Hits++; hitted = true; break; } else if (pointOfIn.Item1 <= ev.GetTimestampStart() && pointOfIn.Item2 <= ev.GetTimestampEnd() && pointOfIn.Item2 >= ev.GetTimestampStart()) { Hits++; hitted = true; break; } else if (ev.GetTimestampStart() <= pointOfIn.Item1 && pointOfIn.Item2 <= ev.GetTimestampEnd()) { Hits++; hitted = true; break; } } if (hitted == false) { Misses++; } } _calculatedHitResult = true; } _hitResult = new HitResults(EventHits, Hits, Misses, EventTotal); return(_hitResult); } else { return(_hitResult); } }