Ejemplo n.º 1
0
        internal void CoreUpdate()
        {
            if (m_IsUpdated)
            {
                return;
            }

            m_IsUpdated = true;

            // dominance

            for (int i = 0; i < m_Items.Count; ++i)
            {
                for (int j = i + 1; j < m_Items.Count; ++j)
                {
                    ObjectiveItem <T> left  = m_Items[i];
                    ObjectiveItem <T> right = m_Items[j];

                    int d = ObjectiveItem <T> .Dominance(left, right);

                    if (d > 0)
                    {
                        left.m_BetterThan.Add(right);
                        right.m_WorseThan.Add(left);
                    }
                    else if (d < 0)
                    {
                        right.m_BetterThan.Add(left);
                        left.m_WorseThan.Add(right);
                    }
                }
            }

            // frontiers
            HashSet <ObjectiveItem <T> > agenda = new HashSet <ObjectiveItem <T> >(m_Items);
            HashSet <ObjectiveItem <T> > skips  = new HashSet <ObjectiveItem <T> >();

            int level = 0;

            while (agenda.Any())
            {
                level += 1;

                List <ObjectiveItem <T> > exclude = new List <ObjectiveItem <T> >(m_Items.Count);

                foreach (var item in agenda)
                {
                    if (item.WorseThan.All(x => skips.Contains(x)))
                    {
                        exclude.Add(item);

                        item.m_FrontierLevel = level;
                    }
                }

                m_Frontiers.Add(level, exclude);

                agenda.ExceptWith(exclude);
                skips.UnionWith(exclude);
            }
        }