Exemple #1
0
        public ActionResult getMethodeElementaire([FromBody] DataMethod item)
        {
            Console.WriteLine("Traitement en cours");
            // Selon le numéro de méthode choisi on chois une option différente
            switch (item.numMethod)
            {
            case 1:
                return(Json(getMethodeEnumerationTotale(item)));

            case 2:
                return(Json(getMethodeElementaireBranchBound(item)));

            case 3:
                return(Json(getMethodeElementaireDynamiqueDense(item)));

            case 4:
                return(Json(getMethodeGloutonne(item)));

            case 5:
            //return `Relaxation en continu`;

            default:
                break;
            }

            Console.WriteLine("Traitement fini");
            return(Json(item));
        }
Exemple #2
0
        private DataMethod getMethodeElementaireDynamiqueDense(DataMethod item)
        {
            DateTime start = DateTime.Now;

            int[] m = new int[(int)item.b + 1];

            for (int i = 0; i < item.a.Count; i++)
            {
                for (int j = (int)item.b; j >= 0; j--)
                {
                    m[j] = j < item.a[i] ? m[j] : Math.Max(m[j], m[j - item.a[i]] + item.c[i]);
                }
            }

            item.cout = m[(int)item.b];



            TimeSpan dur = DateTime.Now - start;

            item.timer = dur.ToString();


            return(item);
        }
Exemple #3
0
        public ActionResult getRandom(double alpha, int nbObjet)
        {
            DataMethod result = new DataMethod();
            Random     r      = new Random();
            double     t      = 0.00;

            result.result = new List <int>();
            result.timer  = "";
            result.cout   = 0;

            result.a = new List <int>();
            result.c = new List <int>();

            for (int i = 0; i < nbObjet; i++)
            {
                result.a.Add(r.Next(10, 100));
                result.c.Add(r.Next(10, 100));
            }

            foreach (var item in result.a)
            {
                t += item;
            }

            result.b = alpha / 100 * t;

            return(Json(result));
        }
Exemple #4
0
        private object getMethodeGloutonne(DataMethod item)
        {
            // Variable utile pour le temps d'execution
            DateTime start = DateTime.Now;

            // on transforme nos tableau de int en double
            // Car on va faire des calcul de division
            double[] c  = new double[item.c.Count];
            double[] a  = new double[item.a.Count];
            int      nb = 0;

            // On calcule le total des poids
            foreach (var val in item.a)
            {
                a[nb] = (double)val;
                nb++;
            }

            nb = 0;
            // On calcule le total des cout
            foreach (var val in item.c)
            {
                c[nb] = (double)val;
                nb++;
            }

            //On recherche la valeur optimal inferieur
            item.bi = (int)get_inf_value(item, item.a.Count, item.b, c, a);


            // on transforme nos tableau de int en double
            // Car on va faire des calcul de division
            c  = new double[item.c.Count];
            a  = new double[item.a.Count];
            nb = 0;
            foreach (var val in item.a)
            {
                a[nb] = (double)val;
                nb++;
            }
            nb = 0;
            foreach (var val in item.c)
            {
                c[nb] = (double)val;
                nb++;
            }

            //On recherche la valeur optimal inferieur
            item.bs = (int)get_sup_value(item, item.a.Count, item.b, c, a);

            // Fin du traitement on calcule le temps systeme passé
            TimeSpan dur = DateTime.Now - start;

            item.timer = dur.ToString();

            //on renvoie l'objet
            return(item);
        }
Exemple #5
0
        private DataMethod getMethodeElementaireBranchBound(DataMethod item)
        {
            DateTime start = DateTime.Now;

            item.cout = sousArbre(item.b, item.a, item.c, item.a.Count, item.result);

            TimeSpan dur = DateTime.Now - start;

            item.timer = dur.ToString();

            return(item);
        }
Exemple #6
0
        private double get_sup_value(DataMethod item, int n, double capacity, double[] values, double[] weights)
        {
            double value = 0.0;

            // On trie le tableau de valeurs et poids selon les valeurs
            Array.Sort(values, weights, Comparer <double> .Create((x, y) => y.CompareTo(x)));

            double[] ratio = new double[n];
            //on calcule le ration de chacun
            for (int i = 0; i < n; ++i)
            {
                ratio[i] = values[i] / weights[i];
            }

            //on range le ratio et le poids
            Array.Sort(ratio, weights, Comparer <double> .Create((x, y) => y.CompareTo(x)));

            //liste qui permet de restreindre a un élément le calcul
            List <int> conta = new List <int>();

            for (int i = 0; i < n; i++)
            {
                //Si la capicité vaut 0 alors on retour la valeur
                if (capacity == 0)
                {
                    return(value);
                }

                // On recupère le a si la capacité est suffisante
                double a = weights[i] < capacity ? weights[i] : capacity;

                if (a == capacity)
                {
                    value = value + a * ratio[i];
                }
                // SI a n'est pas deja dans le contenu
                if (!conta.Contains((int)a))
                {
                    conta.Add((int)a);

                    value      = value + a * ratio[i];
                    weights[i] = weights[i] - a;

                    capacity = capacity - a;
                }
            }
            return(value);
        }
Exemple #7
0
        ///==========================================================================
        // Methode Enumeration Totale (ATTENTION METHODE TRES GOURMANDE)
        // Cette méthode va resoudre notre solution de façon binaire
        // Elle va mettre toute les possibilités en binaire (1 indiquant que l'objet sera présent et 0 non)
        // De la on va prendre la solution max qui ne dépasse pas le poids
        ///==========================================================================
        public DataMethod getMethodeEnumerationTotale(DataMethod item)
        {
            item.result = new List <int>();
            DateTime start = DateTime.Now;

            // On va se creer la liste des possibilités qui sera ben binaire
            List <List <int> > possibilites = new List <List <int> >();

            // On est donc a 2 puissance nbObjet possible
            for (int i = 0; i < (Math.Pow(2, item.a.Count)); i++)
            {
                String binary = Convert.ToString(i, 2); // On convertie notre nombre en binaire
                int    Size   = binary.Length;

                // On rajoute les 0 du début binaire (Pour la phase de calcul)
                for (int j = 0; j < (item.a.Count - Size); j++)
                {
                    binary = "0" + binary;
                }

                List <int> subList = new List <int>();

                for (int k = 0; k < item.a.Count; k++)
                {
                    if (binary[k] == '1')
                    {
                        subList.Add(k);
                    }
                }
                possibilites.Add(subList);
            }

            int max = 0;

            // On cherche parmi toute nos possibilités
            // La cout max qui ne depasse pas le poid
            foreach (var sub in possibilites)
            {
                int result = 0;
                int cout   = 0;

                foreach (var number in sub)
                {
                    result += item.a[number];
                    cout   += item.c[number];
                }

                // Si le resultate est inferieur a la capacité max du sac
                // et le cout est maximisé
                if (result < item.b && cout > max)
                {
                    max         = cout;
                    item.cout   = cout;
                    item.result = sub;
                }
            }

            // Calcul du temps calcul
            TimeSpan dur = DateTime.Now - start;

            item.timer = dur.ToString();

            return(item);
        }