public override void RandomInitialization(Random myRandom) { Weight = 0; var opciones = MyProblem.GetVariables(); while (Weight <= MyProblem.Capacity) { var p = myRandom.Next(opciones.Count); SelectObject(opciones[p].Position); opciones.RemoveAt(p); var availableWeight = MyProblem.Capacity - Weight; opciones.RemoveAll(x => x.Weight > availableWeight); if (opciones.Count == 0) { break; } } Evaluate(); for (var i = 0; i < MyProblem.TotalItems; i++) { Velocity[i] = -4 + 8 * myRandom.NextDouble(); } for (var i = 0; i < MyProblem.TotalItems; i++) { LocalBestObjects[i] = Objects[i]; } LocalBestFitness = Fitness; }
public void Tweak(Random aleatorio, ArrayList parListaTabu) { // Paso 1 = Intercambiar un objeto seleccionado por uno no seleccionado var seleccionados = new List <KeyValuePair <int, double> >(); for (var i = 0; i < MyProblem.TotalItems; i++) { if (Objects[i] == 1) { seleccionados.Add(new KeyValuePair <int, double>(i, MyProblem.Weight(i))); } } int p; var noSeleccionados = new List <KeyValuePair <int, double> >(); var pruebas = 0; do { p = aleatorio.Next(seleccionados.Count); var pesoDisponible = MyProblem.Capacity - (Weight - seleccionados[p].Value); for (var i = 0; i < MyProblem.TotalItems; i++) { if (Objects[i] == 0 && MyProblem.Weight(i) <= pesoDisponible && !estaEnlalistaTabu(i, parListaTabu)) { noSeleccionados.Add(new KeyValuePair <int, double>(i, MyProblem.Weight(i))); } } pruebas++; if (pruebas >= 3) { return; // No trato de hacer TweFak } } while (noSeleccionados.Count == 0); Objects[seleccionados[p].Key] = 0; Weight -= seleccionados[p].Value; var q = aleatorio.Next(noSeleccionados.Count); Objects[noSeleccionados[q].Key] = 1; Weight += noSeleccionados[q].Value; Complete(aleatorio, new List <int>()); Evaluate(); }