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 ) ); } }
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)); }