예제 #1
0
 public void Insertar(Trabajo T)
 {
     if (!Existe(T))
     {
         if (raiz == null)
         {
             raiz = T;
         }
         else
         {
             Trabajo anterior = null, reco;
             reco = raiz;
             while (reco != null)
             {
                 anterior = reco;
                 if (precioTotal(T) < precioTotal(reco))
                 {
                     reco = reco.izq;
                 }
                 else
                 {
                     reco = reco.der;
                 }
             }
             if (precioTotal(T) < precioTotal(anterior))
             {
                 anterior.izq = T;
             }
             else
             {
                 anterior.der = T;
             }
         }
     }
 }
예제 #2
0
 public Trabajo(int id, List <Disenador> disenadores, Ubicacion ubicacion, Seccion seccion)
 {
     Id          = id;
     Disenadores = disenadores;
     Ubicacion   = ubicacion;
     Seccion     = seccion;
     izq         = null;
     der         = null;
 }
예제 #3
0
 private void Cantidad(Trabajo reco)
 {
     if (reco != null)
     {
         cant++;
         Cantidad(reco.izq);
         Cantidad(reco.der);
     }
 }
예제 #4
0
 public Trabajo()
 {
     Id          = 0;
     Disenadores = new List <Disenador>();
     Ubicacion   = null;
     Seccion     = null;
     izq         = null;
     der         = null;
 }
예제 #5
0
        public int precioTotal(Trabajo T)
        {
            int total = 0;

            total += T.Seccion.Precio;
            foreach (Disenador d in T.Disenadores)
            {
                total += d.Salario;
            }
            return(total);
        }
예제 #6
0
 private void CantidadNodosHoja(Trabajo reco)
 {
     if (reco != null)
     {
         if (reco.izq == null && reco.der == null)
         {
             cant++;
         }
         CantidadNodosHoja(reco.izq);
         CantidadNodosHoja(reco.der);
     }
 }
예제 #7
0
 private void RetornarAltura(Trabajo reco, int nivel)
 {
     if (reco != null)
     {
         RetornarAltura(reco.izq, nivel + 1);
         if (nivel > altura)
         {
             altura = nivel;
         }
         RetornarAltura(reco.der, nivel + 1);
     }
 }
        public List <Trabajo> RamificacionyPoda(Trabajo t)
        {
            Trabajo        anterior = new Trabajo();
            List <Trabajo> trabajos = new List <Trabajo>();
            Trabajo        aux      = t;

            while (aux != null)
            {
                trabajos.Add(aux);
                anterior = aux;
                aux      = aux.izq;
            }
            return(trabajos);
        }
예제 #9
0
 public void MayorValorl()
 {
     if (raiz != null)
     {
         Trabajo anterior = new Trabajo();
         Trabajo reco     = raiz;
         while (reco.der != null)
         {
             anterior = reco;
             reco     = reco.der;
         }
         Console.WriteLine("Mayor valor del árbol:" + precioTotal(anterior));
     }
 }
예제 #10
0
        public List <Trabajo> Mutacion(int n, Trabajo raiz)
        {
            var     tiempo = Stopwatch.StartNew();
            Trabajo Padre1;
            Trabajo Padre2;
            Trabajo temp = raiz, anterior, preanterior; a++;

            preanterior = temp; a++;
            temp        = temp.izq; a++;
            anterior    = temp; a++;
            temp        = temp.izq; a++;
            while (temp != null)
            {
                c++;
                preanterior = anterior; a++;
                anterior    = temp; a++;
                temp        = temp.izq; a++;
            }
            c++;
            if (anterior.der != null)
            {
                c++;
                preanterior = anterior.der; a++;
            }
            Padre1 = anterior; a++;
            Padre2 = preanterior; a++;

            // ciclo para encontar al menor o sea al primer padre



            List <Trabajo> padres = new List <Trabajo> {
                Padre1, Padre2
            };

            a++;
            for (int i = 0; i < n; i++)  // for para hacer las n generaciones
            {
                c++;
                Console.WriteLine("Generacion: " + i);
                padres = mutar(padres);
                a++;
            }
            c++;
            Console.WriteLine("Asignaciones: " + a);
            Console.WriteLine("Comparaciones: " + c);
            Console.WriteLine("Tiempo " + tiempo.Elapsed.TotalMilliseconds);
            return(padres);
        }
예제 #11
0
 private void ImprimirEntre(Trabajo reco)
 {
     if (reco != null)
     {
         ImprimirEntre(reco.izq);
         Console.WriteLine("Id: " + reco.Id + " PrecioTotal: " + precioTotal(reco));
         Console.WriteLine("     Seccion:" + reco.Seccion.Nombre + " Seccion Horario:" + reco.Seccion.Horario + " Precio:" + reco.Seccion.Precio);
         Console.WriteLine("          Ubicacion:" + reco.Ubicacion.Nombre + " Diurno:" + reco.Ubicacion.Diurno + " Nocturno:" + reco.Ubicacion.Nocturno);
         foreach (Disenador d in reco.Disenadores)
         {
             Console.WriteLine("              Disenador:" + d.Nombre + " Nocturno:" + d.Nocturno + " Diurno:" + d.Diurno + " Salario" + d.Salario);
         }
         ImprimirEntre(reco.der);
     }
 }
예제 #12
0
        public List <Trabajo> mutar(List <Trabajo> padres)
        {
            Trabajo t1 = creaTrabajo(padres);
            Trabajo t2 = creaTrabajo(padres);

            padres.Add(t1); a++;
            padres.Add(t2); a++;
            // impresion de los dos padres y los dos hijos
            imprimirT(padres);

            List <int> precioTrabajo = new List <int> {
                precioTotal(padres[0]), precioTotal(padres[1]), precioTotal(t1), precioTotal(t2)
            }; a++;

            precioTrabajo.Sort(); a++;



            List <Trabajo> mejoresDeLaGen = new List <Trabajo>();

            a++;
            foreach (Trabajo t in padres)
            {
                c++;
                if (precioTotal(t) == precioTrabajo[0] || precioTotal(t) == precioTrabajo[1])
                {
                    c++;
                    mejoresDeLaGen.Add(t); a++;
                    if (mejoresDeLaGen.Count() == 2)
                    {
                        c++;
                        break;
                    }
                }
                a++;
            }
            c++;
            Console.WriteLine("Los mejores de la generacion fueron: ");
            imprimirT(mejoresDeLaGen);
            return(mejoresDeLaGen);
        }
예제 #13
0
 public void BorrarMenor()
 {
     if (raiz != null)
     {
         if (raiz.izq == null)
         {
             raiz = raiz.der;
         }
         else
         {
             Trabajo atras = raiz;
             Trabajo reco  = raiz.izq;
             while (reco.izq != null)
             {
                 atras = reco;
                 reco  = reco.izq;
             }
             atras.izq = reco.der;
         }
     }
 }
예제 #14
0
        public bool Existe(Trabajo T)
        {
            Trabajo reco = raiz;

            while (reco != null)
            {
                if (T.Id == reco.Id)
                {
                    return(true);
                }
                else
                if (T.Id > reco.Id)
                {
                    reco = reco.der;
                }
                else
                {
                    reco = reco.izq;
                }
            }
            return(false);
        }
예제 #15
0
        public List <Trabajo> RamificacionyPoda(Trabajo t)
        {
            var            tiempo = Stopwatch.StartNew();
            int            a = 0, c = 0;
            Trabajo        anterior = new Trabajo();
            List <Trabajo> trabajos = new List <Trabajo>();
            Trabajo        aux      = t; a++;

            while (aux != null)
            {
                c++;
                trabajos.Add(aux);
                anterior = aux;
                aux      = aux.izq;
                a       += 3;
            }
            c++;

            Console.WriteLine("**Algoritmo de Ramificacion y Poda**");
            Console.WriteLine("Asignaciones" + a);
            Console.WriteLine("Comparaciones " + c);
            Console.WriteLine("Tiempo " + tiempo.Elapsed.TotalMilliseconds);
            return(trabajos);
        }
예제 #16
0
        public Trabajo creaTrabajo(List <Trabajo> padres)
        {
            int s   = r.Next(0, 2); //NUMERO RANDOM PARA SECCION
            int u   = r.Next(0, 2); //NUMERO RANDOM PARA UBICACION
            int dis = r.Next(0, 2); //NUMERO RANDOM PARA CANTIDAD DE DISENADORES

            a += 3;
            //nuevo trabajo
            Trabajo t1 = new Trabajo();

            // se agrega seccion y ubicacion y la cantidad de jugadores de cada padre random
            t1.Seccion   = padres[s].Seccion;
            t1.Ubicacion = padres[u].Ubicacion;
            int cantDisenadores = padres[dis].Disenadores.Count();

            a += 3;

            int horario        = t1.Seccion.Horario; a++; //horario predefido para disenadores
            List <Disenador> d = new List <Disenador>();  //lista donde se guardan los disenadores del nuevo trabajo


            a++;
            for (int j = 0; j < cantDisenadores; j++)
            {
                c++;
                int indDisenador = r.Next(0, disenadores.Count); //genera random el disenador
                if (horario == 1)                                // 7am a 4pm
                {
                    c++;
                    if ((disenadores[indDisenador].Diurno == 1) || (disenadores[indDisenador].Diurno == 2))
                    {
                        c++;
                        d.Add(disenadores[indDisenador]); a++;
                    }
                    else
                    {
                        c++;
                        j--; a++;
                    }
                }
                else if (horario == 2) // 7am a 11am
                {
                    c++;
                    if (disenadores[indDisenador].Diurno == 2)
                    {
                        c++;
                        d.Add(disenadores[indDisenador]); a++;
                    }
                    else
                    {
                        c++;
                        j--; a++;
                    }
                }
                else if (horario == 3)  // 7pm a 4am
                {
                    c++;
                    if (disenadores[indDisenador].Nocturno == 3 || disenadores[indDisenador].Nocturno == 4)
                    {
                        c++;
                        d.Add(disenadores[indDisenador]); a++;
                    }
                    else
                    {
                        c++;
                        j--; a++;
                    }
                }
                else if (horario == 4)  // 7:00pm a 11:00pm
                {
                    c++;
                    if (disenadores[indDisenador].Nocturno == 4)
                    {
                        c++;
                        d.Add(disenadores[indDisenador]); a++;
                    }
                    else
                    {
                        c++;
                        j--; a++;
                    }
                }
            }
            c++;
            t1.Disenadores = d; a++;
            return(t1);
        }
예제 #17
0
 public ArbolBinarioOrdenado()
 {
     raiz = null;
 }