예제 #1
0
        public PaletteGroupNode(List <ConcurrentDictionary <Int32, int> > allPals, int maxPal) : base()
        {
            MaxNumberOfColorsPerPalette = maxPal;
            Content          = new ConcurrentDictionary <int, int>();
            remainder        = new List <ConcurrentDictionary <int, int> >();
            FinishedPalettes = new List <ConcurrentDictionary <int, int> >();
            Parent           = null;
            ConcurrentDictionary <Int32, int> rootContent = allPals.First();

            foreach (var kvp in rootContent)
            {
                Content.TryAdd(kvp.Key, kvp.Value);
            }

            allColors = new ConcurrentDictionary <int, int>();
            foreach (var p in allPals)
            {
                foreach (var c in p)
                {
                    if (!Content.ContainsKey(c.Key))
                    {
                        allColors.TryAdd(c.Key, c.Value);
                    }
                }
            }
            colorStartNumber = allColors.Count + Content.Count;
            paletteCost      = ((allPals.Count - 1) / 2) + 1;

            foreach (var p in allPals)
            {
                if (p.Count > Content.Count || PaletteProcessor.CountDiffs(Content, p) != 0)
                {
                    if (p.Count == MaxNumberOfColorsPerPalette)
                    {
                        FinishedPalettes.Add(p);
                    }
                    else
                    {
                        remainder.Add(p);
                    }
                }
            }

            updateCost();
            updateHeuristic();
        }
 private void calculatePaletteValue()
 {
     if (pval >= 0)
     {
         return;
     }
     if (Parent != null)
     {
         PaletteMixerAsterNode p = (PaletteMixerAsterNode)Parent;
         if (Content == Parent.Content)
         {
             Parallel.ForEach(p.FinishedPalettes, kvp =>
             {
                 FinishedPalettes.Enqueue(kvp);
             });
             FinishedPalettes.Enqueue(best.Key);
         }
         else
         {
             Parallel.ForEach(p.FinishedPalettes, kvp =>
             {
                 FinishedPalettes.Enqueue(kvp);
             });
             Parallel.ForEach(p.Content, kvp =>
             {
                 if (PaletteProcessor.CountDiffs(kvp.Key, best.Key) > 0)
                 {
                     Content.TryAdd(kvp.Key, kvp.Value);
                 }
             });
             if (best.Key.Count == MaxPalette)
             {
                 FinishedPalettes.Enqueue(best.Key);
             }
             else
             {
                 Content.TryAdd(best.Key, best.Value);
             }
         }
     }
     gotBest = false;
     pcost   = FinishedPalettes.Count;
     pheur   = Content.Count;
     pval    = (pcost * WeightCost) + (pheur * WeightHeuristic);
 }
예제 #3
0
 public override bool Contains(ConcurrentDictionary <int, int> cont)
 {
     return(Content.Count >= cont.Count && PaletteProcessor.CountDiffs(Content, cont) == 0);
 }
예제 #4
0
 public override int MergeSize(ConcurrentDictionary <int, int> cont)
 {
     return(Math.Max(cont.Count, Content.Count) + PaletteProcessor.CountDiffs(cont, Content));
 }
예제 #5
0
 public override int Distance(ConcurrentDictionary <int, int> cont)
 {
     return(-PaletteProcessor.CountEquals(Content, cont));
 }
예제 #6
0
 public override int MergeSize(KeyValuePair <ConcurrentDictionary <int, int>, ConcurrentDictionary <TileKey, int> > cont)
 {
     return(PaletteProcessor.CountDiffs(Content.Key, cont.Key) +
            Math.Max(Content.Key.Count, cont.Key.Count));
 }
        public override void Expand(params object[] args)
        {
            ConcurrentDictionary <Int32, int>       p;
            ConcurrentDictionary <TileKey, int>     tl;
            ConcurrentQueue <PaletteMixerAsterNode> childs = new ConcurrentQueue <PaletteMixerAsterNode>();

            p = best.Key;
            Content.TryRemove(p, out tl);

            if (p.Count < MaxPalette)
            {
                Parallel.ForEach(Content, kvp =>
                {
                    if (PaletteProcessor.CountDiffs(p, kvp.Key) +
                        Math.Max(p.Count, kvp.Key.Count) <= MaxPalette)
                    {
                        PaletteMixerAsterNode newNode             = new PaletteMixerAsterNode();
                        ConcurrentDictionary <Int32, int> paux    = new ConcurrentDictionary <int, int>();
                        ConcurrentDictionary <TileKey, int> tlaux = new ConcurrentDictionary <TileKey, int>();
                        Parallel.ForEach(p, c =>
                        {
                            paux.TryAdd(c.Key, c.Value);
                        });
                        Parallel.ForEach(kvp.Key, c =>
                        {
                            paux.TryAdd(c.Key, c.Value);
                        });
                        Parallel.ForEach(tl, t =>
                        {
                            tlaux.TryAdd(t.Key, t.Value);
                        });
                        Parallel.ForEach(kvp.Value, t =>
                        {
                            tlaux.TryAdd(t.Key, t.Value);
                        });

                        newNode.MaxPalette = MaxPalette;
                        newNode.Parent     = this;
                        newNode.best       = new KeyValuePair <ConcurrentDictionary <int, int>, ConcurrentDictionary <TileKey, int> >(paux, tlaux);
                        newNode.gotBest    = true;
                        newNode.updateCost();
                        newNode.updateHeuristic();

                        childs.Enqueue(newNode);
                    }
                });
            }

            PaletteMixerAsterNode n = new PaletteMixerAsterNode();

            n.Content    = Content;
            n.best       = best;
            n.MaxPalette = MaxPalette;
            n.Parent     = this;
            n.gotBest    = true;
            n.updateCost();
            n.updateHeuristic();

            childs.Enqueue(n);

            foreach (var ch in childs)
            {
                Children.Add(ch);
            }
        }
예제 #8
0
        public override void Expand(params object[] args)
        {
            int best = 0;
            int cur  = 0;
            ConcurrentDictionary <Int32, int>         curpal = null;
            List <ConcurrentDictionary <Int32, int> > childs = new List <ConcurrentDictionary <int, int> >();
            PaletteGroupNode newNode;

            Children = new List <AstarNode <ConcurrentDictionary <Int32, int> > >();

            PaletteGroupNode parent = (PaletteGroupNode)Parent;

            if (Content.Count < MaxNumberOfColorsPerPalette)
            {
                List <ConcurrentDictionary <Int32, int> > aux = new List <ConcurrentDictionary <int, int> >();
                foreach (var p in remainder)
                {
                    aux.Add(p);
                }

                while (aux.Count > 0)
                {
                    curpal = PaletteProcessor.GetDiffs(Content, aux.First());
                    aux.RemoveAt(0);
                    cur = 0;

                    if (curpal.Count <= MaxNumberOfColorsPerPalette)
                    {
                        foreach (var p in remainder)
                        {
                            if (PaletteProcessor.CountDiffs(curpal, p) == 0)
                            {
                                cur++;
                            }
                        }
                        if (cur > best)
                        {
                            best = cur;
                            Children.Clear();
                        }
                        if (cur == best)
                        {
                            newNode         = new PaletteGroupNode();
                            newNode.Content = curpal;
                            Children.Add(newNode);
                        }
                    }
                }
            }

            ConcurrentDictionary <Int32, int> newCont;
            PaletteGroupNode n;

            foreach (var node in Children)
            {
                newCont = new ConcurrentDictionary <Int32, int>();
                n       = (PaletteGroupNode)node;
                n.MaxNumberOfColorsPerPalette = MaxNumberOfColorsPerPalette;
                foreach (var kvp in n.Content)
                {
                    newCont.TryAdd(kvp.Key, kvp.Value);
                }
                foreach (var kvp in Content)
                {
                    newCont.TryAdd(kvp.Key, kvp.Value);
                }

                n.Content = newCont;

                n.allColors = new ConcurrentDictionary <int, int>();
                foreach (var c in allColors)
                {
                    if (!n.Content.ContainsKey(c.Key))
                    {
                        n.allColors.TryAdd(c.Key, c.Value);
                    }
                }

                n.FinishedPalettes = new List <ConcurrentDictionary <int, int> >();
                foreach (var p in FinishedPalettes)
                {
                    n.FinishedPalettes.Add(p);
                }

                n.remainder = new List <ConcurrentDictionary <int, int> >();

                foreach (var p in remainder)
                {
                    if (PaletteProcessor.CountDiffs(n.Content, p) != 0)
                    {
                        n.remainder.Add(p);
                    }
                }
                n.Parent = this;
                n.updateCost();
                n.updateHeuristic();
            }

            if (remainder.Count > 0)
            {
                newNode = new PaletteGroupNode();
                newNode.MaxNumberOfColorsPerPalette = MaxNumberOfColorsPerPalette;
                newNode.Parent           = this;
                newNode.Content          = remainder.First();
                newNode.remainder        = new List <ConcurrentDictionary <int, int> >();
                newNode.FinishedPalettes = new List <ConcurrentDictionary <int, int> >();

                foreach (var p in FinishedPalettes)
                {
                    newNode.FinishedPalettes.Add(p);
                }
                newNode.FinishedPalettes.Add(Content);

                newNode.allColors = new ConcurrentDictionary <int, int>();
                foreach (var c in allColors)
                {
                    if (!newNode.Content.ContainsKey(c.Key))
                    {
                        newNode.allColors.TryAdd(c.Key, c.Value);
                    }
                }

                foreach (var p in remainder)
                {
                    if (PaletteProcessor.CountDiffs(newNode.Content, p) != 0)
                    {
                        newNode.remainder.Add(p);
                    }
                }

                newNode.updateCost();
                newNode.updateHeuristic();
                Children.Add(newNode);
            }
            if (Children.Count == 0)
            {
                FinishedPalettes.Add(Content);
            }
        }