/// <summary> /// Run method /// </summary> public override void Run() { ClearBest(); trail = new Trail(); Solve(0); trail.Undo(0); Fail(); }
/// <summary> /// saolve method /// </summary> /// <param name="level"> /// The level. /// </param> protected internal virtual void Solve(int level) { var objective = network.Objective; while (!Aborted) { if (IsOption(Minimize)) { if (bestValue < IntDomain.MaxValue) { var d = (IntDomain)objective.Domain; d = d.Delete(bestValue, IntDomain.MaxValue); if (d.Empty) { break; } objective.UpdateDomain(d, trail); } } else if (IsOption(Maximize)) { if (bestValue > IntDomain.MinValue) { var d = (IntDomain)objective.Domain; d = d.Delete(IntDomain.MinValue, bestValue); if (d.Empty) { break; } objective.UpdateDomain(d, trail); } } var sat = Satisfy(); if (Aborted || !sat) { break; } var v0 = SelectVariable(); // Console.WriteLine((v0 == null ? "null" : v0.ToString()) + " level=" + level); if (v0 == null) { // if it is the sameweight or better of the best solution // long timeSpentToCheck = DateTime.Now.Ticks; var solutionWeight = GetSolutionWeight(); // timeSpentToCheck = DateTime.Now.Ticks - timeSpentToCheck; if ((IsBetterSolution(solutionWeight) && SolverStrategy == StrategyMethod.Soft) || SolverStrategy != StrategyMethod.Soft) { solution = new Solution(network) { Weight = solutionWeight }; Console.WriteLine("solution: " + solution); solution.Time = GetElapsedTime(); // -timeSpentToCheck; Success(); } break; } if (v0.Domain is IntDomain) { var d = (IntDomain)v0.Domain; switch (SolverStrategy) { // Soft Constraints case StrategyMethod.Soft: var val = GetValueWithSoftConstraint(v0); if (!Aborted) { var t0 = trail.Size(); v0.UpdateDomain(new IntDomain(val), trail); Solve(level + 1); trail.Undo(t0); } if (!Aborted) { v0.UpdateDomain(d.Delete(val), trail); continue; } break; case StrategyMethod.Step: var value = d.Minimum(); if (!Aborted) { var t0 = trail.Size(); v0.UpdateDomain(new IntDomain(value), trail); Solve(level + 1); trail.Undo(t0); } if (!Aborted) { v0.UpdateDomain(d.Delete(value), trail); continue; } break; case StrategyMethod.Enum: var iter = v0.Domain.Elements(); while (!Aborted && iter.MoveNext()) { var t0 = trail.Size(); v0.UpdateDomain((Domain)iter.Current, trail); Solve(level + 1); trail.Undo(t0); } break; case StrategyMethod.Bisect: int mid; if (d.Minimum() + 1 == d.Maximum()) { mid = d.Minimum(); } else { mid = (d.Minimum() + d.Maximum()) / 2; } if (!Aborted) { var t0 = trail.Size(); v0.UpdateDomain(d.CapInterval(d.Minimum(), mid), trail); Solve(level + 1); trail.Undo(t0); } if (!Aborted) { var t0 = trail.Size(); v0.UpdateDomain(d.CapInterval(mid + 1, d.Maximum()), trail); Solve(level + 1); trail.Undo(t0); } break; } } else { var iter = v0.Domain.Elements(); while (!Aborted && iter.MoveNext()) { var t0 = trail.Size(); // Domain d1 = v0.Domain; v0.UpdateDomain((Domain)iter.Current, trail); // if (v0.Domain.Elements() != d1.Elements()) Solve(level + 1); trail.Undo(t0); } } break; } }