Ejemplo n.º 1
0
        public ISolution RandomSolution()
        {
            KnapsackSolution solution      = new KnapsackSolution(); // creation d'une liste de box : loadedContent.
            List <Box>       possibleBoxes = boxes;                  // Liste de boxes disponibles.

            double     enableSpace    = MaxWeight;                   // Espace disponibles.
            List <Box> availableBoxes = possibleBoxes.Where(x => (x.Weight <= enableSpace)).ToList();

            // on tire au sort des boîtes une à une parmi les boîtes disponibles.
            // Trie : tous les boxes de possibleBoxes dont le poids est inferieur ou egale à enableSpace.

            while (enableSpace > 0 && availableBoxes.Count != 0)
            {            // Pour s’assurer qu’il s’agit d’une solution viable, on vérifie que l’espace disponible est suffisant.
                int index = randomGenerator.Next(0, availableBoxes.Count);
                solution.LoadedContent.Add(availableBoxes.ElementAt(index));
                enableSpace = MaxWeight - solution.Weight;
                // enableSpace diminue au fur et a mesure que l'on ajoute des box dans la solution.
                availableBoxes = possibleBoxes.Except(solution.LoadedContent).Where(x => (x.Weight <= enableSpace)).ToList();
                // On tire au sort des boîtes une à une parmi les boîtes disponibles et non encore utilisées.

                /* Trie : tous les boxes de possibleBoxes dont le poids est inferieur ou egale à enableSpace
                 * et pas contenu dans solution.LoadedContent.*/
            }

            return(solution);
        }
        protected override void UpdateSolutions()         // Consiste à mettre à jour les différentes solutions.
        {
            List <Box> possibleBoxes = ((KnapsackProblem)pb).Boxes();

            foreach (ISolution genericSolution in currentSolutions)
            {             // On parcoure la liste de toute la population de solutions.
                KnapsackSolution solution = (KnapsackSolution)genericSolution;

                if (!solution.Equals(bestSoFarSolution))
                {                 /*Pour chacune, s’il ne s’agit pas de la meilleure trouvée jusqu’à présent, on va lui ajouter
                                   * un élément de cette dernière, et un élément de la meilleure de la population actuelle.
                                   * Les éléments tirés au sort ne sont ajoutés que s’ils ne sont pas déjà présents dans le sac à dos.*/
                    //On recupere aleatoirement un element contenu dans bestActualSolution.
                    int index   = KnapsackProblem.randomGenerator.Next(0, ((KnapsackSolution)bestActualSolution).LoadedContent.Count);
                    Box element = ((KnapsackSolution)bestActualSolution).LoadedContent.ElementAt(index);

                    if (!solution.LoadedContent.Contains(element))
                    { // On s'assure que la nouvelle solution ne contient pas deja Box element.
                        solution.LoadedContent.Add(element);
                    }
                    //On recupere aleatoirement un element contenu dans bestSoFarSolution.
                    index   = KnapsackProblem.randomGenerator.Next(0, ((KnapsackSolution)bestSoFarSolution).LoadedContent.Count);
                    element = ((KnapsackSolution)bestSoFarSolution).LoadedContent.ElementAt(index);
                    if (!solution.LoadedContent.Contains(element))
                    {
                        solution.LoadedContent.Add(element);
                    }

                    while (solution.Weight > ((KnapsackProblem)pb).MaxWeight)
                    {
                        /*Après cet ajout, le sac peut avoir un poids trop important. On élimine alors
                         * aléatoirement des boîtes jusqu’à repasser sous la limite du poids.*/
                        index = KnapsackProblem.randomGenerator.Next(0, solution.LoadedContent.Count);
                        solution.LoadedContent.RemoveAt(index);
                    }

                    double enableSpace = ((KnapsackProblem)pb).MaxWeight - solution.Weight;
                    // On calcule l'espace disponible dans le sac.
                    List <Box> availableBoxes = possibleBoxes.Except(solution.LoadedContent).Where(x => (x.Weight <= enableSpace)).ToList();

                    /* Trie : Toutes les boxes contenus dans possibleBoxes a l'exception des boxes déja contenu
                     * dans la soution et dont le poids est inferieur ou egale a l'espace disponible.*/

                    while (enableSpace > 0 && availableBoxes.Count != 0)
                    {
                        // Ajout d'un element de availableBoxes tiré au hazard dans la solution.
                        index = KnapsackProblem.randomGenerator.Next(0, availableBoxes.Count);
                        solution.LoadedContent.Add(availableBoxes.ElementAt(index));

                        enableSpace    = ((KnapsackProblem)pb).MaxWeight - solution.Weight;
                        availableBoxes = possibleBoxes.Except(solution.LoadedContent).Where(x => (x.Weight <= enableSpace)).ToList();
                    }
                }
            }
        }
        KnapsackSolution solution;                         // Reference de la solution.

        protected override void ConstructSolution()        // Constrution de la solution.
        {
            KnapsackProblem problem = (KnapsackProblem)pb; // Probleme pb passer en parametre.
            List <Box>      boxes   = problem.Boxes();     // Liste de boxes du probleme pb.

            solution = new KnapsackSolution();             // Creation de la solution (loadedContent = new List<Box> ()).

            foreach (Box currentBox in boxes.OrderByDescending(x => x.Value / x.Weight))
            {
                // L'on classe les boxes par ordre decroissant (Valeur/Kg).

                double spaceLeft = problem.MaxWeight - solution.Weight;
                // On evalue a chaque tour de boucle la valeur de l'espace disponible.
                if (currentBox.Weight < spaceLeft)
                {
                    // S'il y a encore de l'espace on ajout le box.
                    solution.LoadedContent.Add(currentBox);
                }
            }
        }
        public override bool Equals(object _object) // Comparaison de deux solutions.
        {
            KnapsackSolution solution = (KnapsackSolution)_object;

            if (solution.loadedContent.Count != loadedContent.Count || solution.Value != Value || solution.Weight != Weight)
            {
                // Si Nombre de box différent | Valeur differente | Poids différent.
                return(false);
            }
            else
            {
                foreach (Box box in loadedContent)
                {
                    if (!solution.loadedContent.Contains(box))
                    {
                        // On teste alors si chaque boîte contenue dans le premier sac à dos se retrouve dans le deuxième.
                        return(false);
                    }
                }
            }
            return(true);
        }
Ejemplo n.º 5
0
        public List <ISolution> Neighbourhood(ISolution _currentSolution)
        {
            List <ISolution> neighbours    = new List <ISolution>();
            List <Box>       possibleBoxes = boxes;

            for (int i = 0; i < NB_NEIGHBOURS; i++) // Creation du voisinage.
            {
                KnapsackSolution newSol = new KnapsackSolution((KnapsackSolution)_currentSolution);
                // On recupere la solution courante : Base d'une solution du voisinage.
                int index = randomGenerator.Next(0, newSol.LoadedContent.Count);
                // On recupere l'index : position d'une box de la solution en cours de création.
                newSol.LoadedContent.RemoveAt(index);
                // On retire la boxe de la solution.

                double     enableSpace    = MaxWeight - newSol.Weight; // Poids disponible dans la solution.
                List <Box> availableBoxes = possibleBoxes.Except(newSol.LoadedContent).Where(x => (x.Weight <= enableSpace)).ToList();

                /* Trie : tous les boxes de possibleBoxes dont le poids est inferieur ou egale à enableSpace
                 * et pas contenu dans newSol.LoadedContent.*/

                while (enableSpace > 0 && availableBoxes.Count != 0)
                {// A chaque itération.
                    index = randomGenerator.Next(0, availableBoxes.Count);
                    // On recupere l'index : position aleatoire d'une boxe de availableBoxes.
                    newSol.LoadedContent.Add(availableBoxes.ElementAt(index));
                    // Ajout de la boite placé a cette position dans newSol.
                    enableSpace = MaxWeight - newSol.Weight;
                    // Réevaluation de l'espace disponible.
                    availableBoxes = possibleBoxes.Except(newSol.LoadedContent).Where(x => (x.Weight <= enableSpace)).ToList();

                    /* Trie : tous les boxes de possibleBoxes dont le poids est inferieur ou egale à enableSpace
                     * et pas contenu dans newSol.LoadedContent.*/
                }

                neighbours.Add(newSol); // Ajout du voisin crée dans la liste des voisins.
            }
            return(neighbours);
        }
 public KnapsackSolution(KnapsackSolution _solution)
 {
     // Constructeur qui copie le contenu de la solution passée en paramètre.
     loadedContent = new List <Box>();
     loadedContent.AddRange(_solution.loadedContent);
 }