Exemplo n.º 1
0
            static public bool UpdateOnCount(IntVarList varList)
            {
                int min   = varList.MinInterval.Min;
                int max   = varList.MaxInterval.Max;
                int count = max - min + 1;

                if (count < 256)
                {
                    Value[] valList = new Value[count];

                    int valCount = 0;

                    foreach (IntVar var in varList)
                    {
                        foreach (int val in var)
                        {
                            int idx = val - min;

                            if (valList[idx].m_Value == 0)
                            {
                                ++valCount;

                                valList[idx].m_Variable = var;
                            }

                            ++valList[idx].m_Value;
                        }
                    }

                    if (valCount < varList.Count)
                    {
                        return(true);
                    }

                    for (int idx = 0; idx < count; ++idx)
                    {
                        if (valList[idx].m_Value == 1)
                        {
                            IntVar var = valList[idx].m_Variable;

                            if (!var.IsBound())
                            {
                                int val = min + idx;

                                var.Intersect(val);
                            }
                        }
                    }
                }

                return(false);
            }
Exemplo n.º 2
0
        private void Update2()
        {
            int sum_min = 0;
            int sum_max = 0;

            for (int i = 0; i < VarList.Count; ++i)
            {
                IntDomain dom = VarList[i].Domain;

                sum_min += dom.Min;
                sum_max += dom.Max;
            }

            if (m_Value < sum_min || m_Value > sum_max)
            {
                Violate();
                return;
            }

            for (int idx = 0; idx < VarList.Count; ++idx)
            {
                IntVar var = VarList[idx];

                int min = m_Value - (sum_max - var.Max);
                int max = m_Value - (sum_min - var.Min);

                if (min > var.Min || max < var.Max)
                {
                    sum_min -= var.Min;
                    sum_max -= var.Max;

                    var.Intersect(min, max);

                    if (var.Domain.IsEmpty())
                    {
                        return;
                    }

                    sum_min += var.Min;
                    sum_max += var.Max;

                    if (m_Value < sum_min || m_Value > sum_max)
                    {
                        Violate();
                        return;
                    }

                    idx = -1;
                }
            }
        }