Ejemplo n.º 1
0
SolverResult
OLCTriangle::Solve(bool exhaustive)
{
  if (trace_master.size() < 3) {
    ClearTrace();
    is_complete = false;
    return SolverResult::FAILED;
  }

  if (!running) {
    // branch and bound is currently in finished state, update trace
    UpdateTrace(exhaustive);
  }

  if (!is_complete || running) {
    if (n_points < 3) {
      ResetBranchAndBound();
      return SolverResult::FAILED;
    }

    if (is_closed)
      SolveTriangle(exhaustive);

    if (!SaveSolution())
      return SolverResult::FAILED;

    return SolverResult::VALID;
  } else {
    return SolverResult::FAILED;
  }
}
Ejemplo n.º 2
0
/** 
 * @brief Adds a new GPS fix to analysis
 * 
 * @param gps New GPS fix to use in analysis
 */
void CContestMgr::Add(const CPointGPSSmart &gps)
{
  static unsigned step = 0;
  const unsigned STEPS_NUM = 4;
  
  // OLC-Plus
  _trace.Push(gps);
  if(step % STEPS_NUM == 0) {
    // Solve FAI-OLC
    std::auto_ptr<CPointGPS> prevFront(_traceLoop.Front() ? new CPointGPS(_traceLoop.Front()->GPS()) : 0);
    std::auto_ptr<CPointGPS> prevBack(_traceLoop.Back() ? new CPointGPS(_traceLoop.Back()->GPS()) : 0);
    if(BiggestLoopFind(_trace, _traceLoop))
      SolveTriangle(_traceLoop, prevFront.get(), prevBack.get());
  }
  _trace.Compress();
  if(step % STEPS_NUM == 1) {
    // Solve OLC-Classic and FAI 3TPs
    SolvePoints(_trace, false, false);
  }
  SolveOLCPlus();

  if(step % STEPS_NUM == 2) {
    // Solve OLC-Classic and FAI 3TPs for predicted path
    SolvePoints(_trace, false, true);
  }
  
  // OLC-League
  _traceSprint.Push(gps);
  _traceSprint.Compress();
  if(step % STEPS_NUM == 3)
    // Solve OLC-Sprint
    SolvePoints(_traceSprint, true, false);
  
  step++;
}