Undo() public method

public Undo ( int size0 ) : void
size0 int
return void
Example #1
0
 /// <summary>
 /// Run method
 /// </summary>
 public override void Run()
 {
     ClearBest();
     trail = new Trail();
     Solve(0);
     trail.Undo(0);
     Fail();
 }
Example #2
0
 /// <summary>
 /// Run method
 /// </summary>
 public override void Run()
 {
     ClearBest();
     trail = new Trail();
     Solve(0);
     trail.Undo(0);
     Fail();
 }
Example #3
0
        /// <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;
            }
        }