• Viernes 29 de Marzo de 2024, 09:24

Autor Tema:  Cómo guardar rutas?  (Leído 2340 veces)

principiantecsharp

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Cómo guardar rutas?
« en: Miércoles 14 de Agosto de 2013, 14:22 »
0
Ante todo gracias por leer mi pregunta y aviso que quizás pregunto algo obvio, pero soy  muy novato.

El problema que tengo es que quiero hacer rutas (por ejemplo obtenidas aplicando HEURÍSTICA DEL VECINO MÁS PRÓXIMO), y no sé cómo guardar, o que variable crear para tenerlas almacenadas en un programa de consola en C#.

Por ahora tengo los puntos en una "struct", y las distancias entre ellos en una matriz (simétrica).

El caso es que me gustaría poder guardar las rutas que construya aplicando esa heurística teniendo para cada una de ellas, el orden de los puntos y ya guardar información como la distancia, el tiempo etc.
Y no solo eso, sino que fueran agrupando distinto número de puntos. Por ejemplo:
Ruta1: 1,2(pasa por esos puntos), su distancia es 3 y su tiempo 20.
Ruta2: 1,3(pasa por 1 y  3), y su  distancia es 6 y  su tiempo 40.
......
Ruta234: 3,5,8,4,1 (pasa por el punto 3, siguiendo 5,8,4 y acabando en 1), y su distancia es 134 y su tiempo 231.

Había pensado en algo estilo:

 struct Ruta
         {
             public Ordren p;
             public float l;
             public float t;             
             

         }

         y luego crear un vector o lo que fuese llamado "Orden" en el cual almaceno el orden de los puntos.

Lo he probado y no me sale, ni el construir las rutas ni el crearme las variables.

Vuelvo a darles las gracias y  espero sus respuestas.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Cómo guardar rutas?
« Respuesta #1 en: Miércoles 14 de Agosto de 2013, 20:32 »
0
Vas por buen camino, aunque me parece que necesitas aprender un poco mas sobre el lenguaje C#.

Bueno, por lo que comentas, para almacenar los puntos, dado que el numero de puntos puede ser variable, en lugar de usar un vector, lo mejor es usar una lista enlazada, y preguntar cuantos punto se van a guardar, cuando necesites saber cuantos elementos has guardado puede usar la propiedad Count de List<>.

Te dejo un pequeño ejemplo para que te des una idea:

Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    struct Ruta
    {
        public List<int> p;
        public float l;
        public float t;
    }

    class Program
    {

        [STAThread]
        static void Main(string[] args)
        {
            Ruta[] ruta = new Ruta[5];
            int puntos;
            string res1, res2;

            for (int i = 0; i < 5; i++)
            {
                Console.Write("Cuantos puntos: ");
                res1 = Console.ReadLine();
                puntos = Convert.ToInt32(res1);
                ruta[i].p = new List<int>();
                for (int j = 0; j < puntos; j++)
                {
                    res2 = Console.ReadLine();
                    ruta[i].p.Add(Convert.ToInt32(res2));
                }
            }

            Console.ReadKey();

        }
    }
}


Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

principiantecsharp

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re:Cómo guardar rutas?
« Respuesta #2 en: Jueves 15 de Agosto de 2013, 18:09 »
0
Muchas gracias ProfesorX por tu respuesta.
Ahora el siguiente paso de mi problema, es a manera de establecer las rutas, a ver si alguien me puede ayudar siguiendo este mismo hilo.

Las rutas que pretendo encontrar son todas las que existan obtenidas aplicando la heurística del vecino más próximo. Quiero guardar todos los casos para luego trabajar  con ellos, las rutas no deben repetir puntos.
Por ejemplo si tengo 4 puntos más el inicial que llamo 0:
Las de solo un punto, que siempre las tendré: 0-1-0, 0-2-0, 0-3-0, 0-4-0.
Las de dos puntos, que también las deberé coger todas: 0-1-2-0, 0-1-3-0, 0-1-4-0, 0-2-3-0, 0-2-4-0, 0-3-4-0.
Y a partir de aquí sí que el orden es importante. En las rutas con tres puntos, necesito en cada caso la más corta:
Para mí no es lo mismo en 1,2,3: 0-1-2-3-0, que 0-3-1-2-0 o 0-2-3-1-0. Y de estas solo necesito la más corta según distancias. Lo mismo con los conjuntos 1,2,4; 1,3,4; 2,3,4.
Luego en este ejemplo de 4 puntos, me quedaría hacer la ruta de menos distancia  con 1,2,3,4.

Ahora la parte del programa resumida sería esta:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;


namespace ConsoleApplication1
{
    class Program
    {
        static int ne, nr;
        static int i;
        static float cv;
        static int nposibilidades, ContadorRutas1, ContadorRutas2, nclientesruta, puntoactual;

        static double[,] Mdist;


        struct tipoPunto
        {

            public int Y;
            public int Z;
            public float p;
           


        }

        struct InfoRuta
        {
            public List<int> o;
            public float l;
            public float t;
            public float p;

        }



        private static void Main(string[] args)
        {

            //Introducción de datos           

            i = 1;


            Console.WriteLine(" Numero de puntos:");
            ne = Convert.ToInt32(Console.ReadLine());

            tipoPunto[] punto = new tipoPunto[ne + 1];

            Console.WriteLine(" Velocidad:");
            cv = Convert.ToSingle(Console.ReadLine());
           

            //Introducción de los datos del punto de partida.

           
            Console.WriteLine(" Y:");
            punto[0].Y = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine(" Z:");
            punto[0].Z = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine(" p:");
            punto[0].p = Convert.ToSingle(Console.ReadLine());

           

            //Introducción de datos de los otros puntos.

           

            while (i <= ne)
            {

                Console.WriteLine(" Entrar nuevo punto");
                Console.WriteLine(" Y:");
                cliente.Y = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine(" Z:");
                cliente.Z = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine(" p:");
                cliente.cs = Convert.ToSingle(Console.ReadLine());

               

                i = i + 1;

            }

            //Calculo de la matriz de distancias.

            Mdist = new double[ne + 1, ne + 1];

            for (int f = 0; f < Mdist.GetLength(0); f++)
            {
                for (int c = 0; c < Mdist.GetLength(1); c++)
                {

                    Mdist[f, c] = Math.Sqrt(Math.Pow(cliente[c].Y - cliente[f].Y, 2) + Math.Pow(cliente[c].Z - cliente[f].Z, 2));
                    Console.WriteLine(Mdist[f, c]);




                }
            }



            //Calculo número de rutas.
            nr = CalculaNumRutas(ne);

            //Calculo de rutas.

            ContadorRutes1 = 1;
            InfoRuta[] ruta = new InfoRuta[nr];
            nclientsruta = 1;
            ContadorRutes2 = 1;

            while (ContadorRutes1 <= nr)
            {

                nposibilitats = CalculPosibilitats(ne, nclientsruta);
                ContadorRutes2 = 1;

                while (ContadorRutes2 <= nposibilitats)
                {
                    ruta[ContadorRutes1].p = new List<int>();
                   
                    for (int j = 0; j < nclientsruta & puntactual <= ne; j++)
                    {


                        ruta[ContadorRutes1] = RutaSeleccionada(nclientsruta, puntactual, ruta[ContadorRutes1]);

                        puntactual = puntactual + 1;

                    }

                   
                    ContadorRutes2 = ContadorRutes2 + 1;
                    ContadorRutes1 = ContadorRutes1 + 1;

                }

                nclientsruta = nclientsruta + 1;

            }












        }

Y es  RutaSeleccionada(nclientsruta, puntactual, ruta[ContadorRutes1]); donde tenía pensado resolver el tema de las rutas.
Com ya dige, mis conocimientos son muy limitados y posiblemente haya maneras de optimizarlo, pero por eso pido ayuda.

Gracias de nuevo.