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); }
public Mochila Clone() { Mochila temp = new Mochila(this.CapacidadeMaxima); foreach (IComponente it in this.Componentes) temp.AddComponente((Item)it); return temp; }
public Mochila Clone() { Mochila temp = new Mochila(this.CapacidadeMaxima); foreach (IComponente it in this.Componentes) { temp.AddComponente((Item)it); } return(temp); }
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 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); }
//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; }