コード例 #1
0
        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;
        }
コード例 #2
0
        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();
        }