public override void Execute()
        {
            List <Impact> impactList = new List <Impact>();

            foreach (IntVar var in m_IntVarList)
            {
                if (!var.IsBound())
                {
                    IntSearch.IntSearchGoal search = m_Search.Create(var);
                    GoalOr goalOr   = search.Create() as GoalOr;
                    Goal[] goalList = goalOr.GoalList;

                    int start = SumCardinality(m_IntVarList);

                    int impact = 0;
                    foreach (ConstraintVar constraint in goalList)
                    {
                        var.Solver.StateStack.Begin();

                        Solver.PropagationQueue.IsViolated = false;

                        constraint.Update();

                        impact += start - SumCardinality(m_IntVarList);

                        var.Solver.StateStack.Cancel();
                    }

                    impactList.Add(new Impact(var, impact));
                }

                Solver.PropagationQueue.IsViolated = false;
            }

            if (impactList.Count > 0)
            {
                impactList.Sort(new Impact.Comparer());

                IntVar[] intVarList = new IntVar[impactList.Count];
                for (int idx = 0; idx < impactList.Count; ++idx)
                {
                    intVarList[idx] = impactList[idx].m_Var;
                }

                Add(new IntGenerate(Solver, intVarList, m_SelectVar, m_Search));
//				Add( new GoalAnd( m_SearchNew( intVarList[ 0 ], m_SelectVarValue ), this ) );
            }
        }
Exemple #2
0
            public override void Execute()
            {
                if (m_Cover.IsBound())
                {
                    return;
                }

                int index = m_Cover.Select();

                if (index > m_Cover.m_Avail.Max)
                {
                    Fail();
                    return;
                }

                //ExecuteDelegate add = delegate { m_Cover.Add( index ); };

                Goal choice1 = new GoalAnd(new AddIndex(m_Cover, index), m_Cover.m_Avail != index);
                Goal choice2 = m_Cover.m_Avail != index;
                Goal search  = new GoalOr(choice1, choice2);

                Add(new GoalAnd(search, this));
            }