public override List <ISolucao> GerarVizinhanca()
        {
            List <ISolucao> vizinhos = new List <ISolucao>();

            Random random = new Random();

            for (int c = 0; c < Solucao.Componentes.Count; c++)
            {
                Mochila temp = ((Mochila)Solucao).Clone();

                Item item = (Item)temp.Componentes[c];

                temp.RemoveComponente(item);

                int espaco = temp.CapacidadeMaxima - temp.CapacidadeAtual;

                while (espaco > 0)
                {
                    List <Item> comps = ItensDisponiveis.Where(x => x.Peso <= espaco &&
                                                               !temp.Componentes.Contains(x) && x != item).ToList();

                    Item selected = comps.Where(x => (int)x.Utilidade == comps.Max(z => (int)z.Utilidade))
                                    .FirstOrDefault();

                    temp.AddComponente(selected);

                    espaco = temp.CapacidadeMaxima - temp.CapacidadeAtual;
                }

                vizinhos.Add(temp);
            }

            return(vizinhos);
        }
Ejemplo n.º 2
0
        public Mochila Clone()
        {
            Mochila temp = new Mochila(this.CapacidadeMaxima);

            foreach (IComponente it in this.Componentes)
                temp.AddComponente((Item)it);

            return temp;
        }
Ejemplo n.º 3
0
        public Mochila Clone()
        {
            Mochila temp = new Mochila(this.CapacidadeMaxima);

            foreach (IComponente it in this.Componentes)
            {
                temp.AddComponente((Item)it);
            }

            return(temp);
        }
Ejemplo n.º 4
0
        public override void GerarPopulacaoInicial()
        {
            Random rnd    = new Random();
            int    modulo = TamanhoIndividuo % 2;
            int    metade = (TamanhoIndividuo - modulo) / 2;

            for (int individuo = 0; individuo < TamanhoPopulacao; individuo++)
            {
                IIndividuo ind = new Mochila(TamanhoIndividuo);
                for (int cromossomo = 0; cromossomo < metade; cromossomo++)
                {
                    if (((Mochila)ind).Peso < CapacidadeMochila)
                    {
                        int ativa = rnd.Next(2);
                        ind.Cromossomos[cromossomo] = ativa;
                        if (ativa > 0)
                        {
                            ((Mochila)ind).Peso += Itens[cromossomo].Peso;
                        }

                        ativa = rnd.Next(2);
                        ind.Cromossomos[cromossomo + metade] = ativa;
                        if (ativa > 0)
                        {
                            ((Mochila)ind).Peso += Itens[cromossomo + metade].Peso;
                        }
                    }
                    else
                    {
                        ind.Cromossomos[cromossomo]          = 0;
                        ind.Cromossomos[cromossomo + metade] = 0;
                    }

                    if (modulo > 0)
                    {
                        int ativa = rnd.Next(2);
                        ind.Cromossomos[TamanhoIndividuo - 1] = ativa;
                        if (ativa > 0)
                        {
                            ((Mochila)ind).Peso += Itens[TamanhoIndividuo - 1].Peso;
                        }
                    }
                }
                Populacao.Add(ind);
            }
        }
Ejemplo n.º 5
0
        public override IIndividuo RealizarCruzamento(IIndividuo a, IIndividuo b)
        {
            IIndividuo novo   = new Mochila(TamanhoIndividuo);
            int        modulo = TamanhoIndividuo % 2;
            int        metade = (TamanhoIndividuo - modulo) / 2;

            for (int indice = 0; indice < metade; indice++)
            {
                novo.Cromossomos[indice] = a.Cromossomos[indice];
            }

            for (int indice = metade; indice < TamanhoIndividuo; indice++)
            {
                novo.Cromossomos[indice] = b.Cromossomos[indice];
            }

            return(novo);
        }
Ejemplo n.º 6
0
        //Introducir la mayor cantidad de items a una mochila
        static void Main(string[] args)
        {
            var mochila = new Mochila(MaxCapacidad);

            var items = Enumerable.Range(MaxCapacidad / 2, Random.Next(MaxCapacidad / 2, MaxCapacidad))
                        .Select(f => new Item()
            {
                Tamaño = Random.Next(0, MaxCapacidad)
            })
                        .ToList();

            for (int i = 0; i < items.Count; i++)
            {
                var  itemActual = items[i];
                Item siguiente  = null;

                if (i + 1 < items.Count)
                {
                    siguiente = items[i + 1];
                }

                var item = itemActual;

                if (siguiente != null && siguiente?.Tamaño <= itemActual.Tamaño)
                {
                    item = siguiente;
                }

                if (item.Tamaño > mochila.Capacidad)
                {
                    continue;
                }
                mochila.AgregarItem(item);
            }

            Console.WriteLine($"Total items: {items.Count} (tamaño: {items.CalcularTamaño()} )");

            Console.WriteLine(
                $"Utilizado: {mochila.Items.CalcularTamaño()} de {MaxCapacidad} ({mochila.Items.CalcularTamaño() / (decimal) MaxCapacidad:P2}) en {mochila.Items.Count} item(s)");
        }
        public override void GerarPopulacaoInicial()
        {
            Random rnd = new Random();
            int modulo = TamanhoIndividuo % 2;
            int metade = (TamanhoIndividuo - modulo) / 2;
            for (int individuo = 0; individuo < TamanhoPopulacao; individuo++)
            {
                IIndividuo ind = new Mochila(TamanhoIndividuo);
                for (int cromossomo = 0; cromossomo < metade; cromossomo++)
                {
                    if (((Mochila)ind).Peso < CapacidadeMochila)
                    {
                        int ativa = rnd.Next(2);
                        ind.Cromossomos[cromossomo] = ativa;
                        if (ativa > 0)
                        {
                            ((Mochila)ind).Peso += Itens[cromossomo].Peso;
                        }

                        ativa = rnd.Next(2);
                        ind.Cromossomos[cromossomo+metade] = ativa;
                        if (ativa > 0)
                        {
                            ((Mochila)ind).Peso += Itens[cromossomo+metade].Peso;
                        }
                    }
                    else
                    {
                        ind.Cromossomos[cromossomo] = 0;
                        ind.Cromossomos[cromossomo + metade] = 0;
                    }

                    if (modulo > 0)
                    {
                        int ativa = rnd.Next(2);
                        ind.Cromossomos[TamanhoIndividuo-1] = ativa;
                        if (ativa > 0)
                        {
                            ((Mochila)ind).Peso += Itens[TamanhoIndividuo - 1].Peso;
                        }
                    }

                }
                Populacao.Add(ind);
            }
        }
 public GeraMochila(int t)
 {
     Solucao = new Mochila(TamanhoIndividuo);
     CapacidadeMochila = t;
 }
        public override IIndividuo RealizarCruzamento(IIndividuo a, IIndividuo b)
        {
            IIndividuo novo = new Mochila(TamanhoIndividuo);
            int modulo = TamanhoIndividuo % 2;
            int metade = (TamanhoIndividuo - modulo) / 2;

            for (int indice = 0; indice < metade; indice++)
                novo.Cromossomos[indice] = a.Cromossomos[indice];

            for (int indice = metade; indice < TamanhoIndividuo; indice++)
                novo.Cromossomos[indice] = b.Cromossomos[indice];

            return novo;
        }
Ejemplo n.º 10
0
 public GeraMochila(int t)
 {
     Solucao           = new Mochila(TamanhoIndividuo);
     CapacidadeMochila = t;
 }