Autor Tema: ¿Pasar por puntos por los caminos menos costosos?

0 Usuarios y 1 Visitante están viendo este tema.

05 Marzo, 2025, 02:46 pm
Leído 5585 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
No sé si es un problema de esos:


Se quiere que el personaje llegue a los 8 cuadrados naranja tocando la menor cantidad de escaleras posible. Tocar no significa sólo escalar o bajar, el hecho de pasarla por delante también se considera tocar.

Nunca intenté resolver un problema de este tipo, y de momento no puedo pensarlo mucho ¿ideas?

05 Marzo, 2025, 03:28 pm
Respuesta #1

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
No sé si es un problema de esos:


Se quiere que el personaje llegue a los 8 cuadrados naranja tocando la menor cantidad de escaleras posible. Tocar no significa sólo escalar o bajar, el hecho de pasarla por delante también se considera tocar.

Nunca intenté resolver un problema de este tipo, y de momento no puedo pensarlo mucho ¿ideas?

Ahora no tengo tiempo de ponerme a mirarlo, pero quizá te sea útil mirar por internet cosas de teoría de grafos (no estoy muy puesto en esto, no me sé de memoria las leyes que hay que saberse, lo tendría que mirar también).

Saludos.

05 Marzo, 2025, 04:12 pm
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino

06 Marzo, 2025, 03:12 am
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Una táctica


1ro nombrar los puntos a pasar o waypoints , entrada salida  y los 8 cuadrados  de la A a la H.
2do cada recorrido entre 2 waypoints tiene muchas formas de realizarse, anota la trayectoria que menos escaleras pasa.
3ro haz un diagrama con las conexiones posibles entre way points  algo  similar a la imagen que te puse y coloca la mínima  distancia entre puntos como lo hice de ejemplo.





4to busca el recorrido que pase por todos los way point y sume la menor cantidad de escaleras


Creo haberlo logrado en 17 pero revisa


Si puedes desarrollar una IA  que lo resuelva para n puntos cualesquiera (muchos puntos ) y obtenga la ruta mínima, presentate a trabajar en Google, Amazon, Ebay, Mercado Libre,DHL, Alibaba,Fedex ,etc  ;)

hay $$n=10$$ puntos o way points y  $$(n-1)n/2=45$$  caminos entre puntos para marcarle  distancia mínima,  y muchísimos de caminos posibles que unen la entrada con la salida pasando por todos los puntos de la A a la H, justamente tienes que buscar en qué orden pasar por ellos para que la distancia(numero de escaleras) sea $$mínima$$.




 
Saludos  \(\mathbb {R}^3\)

07 Marzo, 2025, 08:36 am
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Es más o menos lo que había pensado antes de leerte, pero ayuda.

Siguiendo tu ejemplo empecé a diagramar:

Pero parece en este caso más enredar que aclarar.
Los colores representarían el coste.

En mi caso no hay salida, o sea, se sale cuando se toca los 8 puntos.

Voy a intentar hacer un programa, ya tengo la idea, aunque claro puede que sea más complicado de lo que pensé. Más que el 3 en línea no creo, y esto es parecido.

Ojo, puede que pasar más de 1 vez por el mismo punto sirva, creo.
Lo que más me costó idear o entender está relacionado con eso: Cuando terminaría el programa, cómo sé que no hay un camino más corto. Pero creo que ya resolví eso también.

En fin, aunque puede que tarde mucho en terminarlo.

07 Marzo, 2025, 10:42 am
Respuesta #5

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Sé lo muy básico de eso.

Pues lo mismo me pasa a mí.

Una pregunta, ¿es para un juego que quieres hacer tú o para algo ya hecho? Si eres tú el que va a trazar los circuitos, entonces es fácil, porque primero trazas un camino y después otros más largos; es sencillo diseñar otros más largos si vas construyendo el circuito sin imposiciones. Lo difícil es cuando no lo haces tú, cuando el problema viene dado por unas circunstancias externas de forma que tú no pones las condiciones (o no todas). Así que depende mucho de eso que te pregunto.

Saludos.

07 Marzo, 2025, 11:06 am
Respuesta #6

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola, Tachikomaia, la idea no es complejizar el problema,  sino en ilustrarte que esto que te planteas, es un caso de optimizacion,  que es muy similar a los que usan empresas de logística y distribución de productos y pagan muy bien a quienes se los resuelven.


Es claro que puedes subir y bajar pasar dos veces por el mismo lugar pero no siempre eso hace que el costo total sea el menor. Si tu como primer paso, conoces la ruta óptima entre cada par de puntos, solo te queda averiguar cual es la ruta que suma menos que va de la entrada a la salida y pasa por los 8 puntos en cierto orden, si repetir una escalera o un punto esta dentro de la ruta óptima ya lo has tenido en cuenta en el primer paso.
Hay $$8!=40320$$ rutas para hacer diferentes cada una sumará igual o diferente y solo unas pocas o quizá una sola sea la óptima  o la de menor coste.


Calcula el coste de las 45 o 36 rutas entre pares de puntos, luego corre un programa que sume el coste de cada una de las 8! rutas posibles y quedadate con los que suman menos.Ten en cuenta que ir de 1 a 2 te cuesta lo mismo que ir de 2 a 1.


Si la vista como grafo te complica haz una tabla de doble entrada, filas con nombres entrada  12345678, salidas dices que no necesitas. Y lo mismo con las columnas, en la fila 1 columna 2 por el coste de ese camino de ir de 1 a 2 qué será el misma que el de la fila 2 columna 1, es una tabla de 9x9 y ahora solo necesitas 36 costes de rutas para completar  ya que la diagonal tiene coste cero.
Esta tabla es una matriz wue puedes cargar en tu programa, y hallar la solución  óptima en menos de 1 segundo.


Saludos
Saludos  \(\mathbb {R}^3\)

07 Marzo, 2025, 04:20 pm
Respuesta #7

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
feriva:
Donkey Kong es el 1er juego lanzado para la consola Famicom, también conocida como Family Game, y que básicamente es una versión previa a la 1er consola de Nintendo.
Las imágenes que puse son de ese juego, sólo agregué flechas de colores y en el 1er caso números.
El juego original fue lanzado para, Arcade creo que se llama, máquinas tragamonedas. Trata sobre subir hacia donde está el gorila, y en ese momento él sube, así unas 3 veces lo que lleva a distintas pantallas y finalmente una en que debes retirar unos tornillos. La versión de Nintendo, la que ves, fue simplificada, pero es basicamente lo mismo, es la pantalla en que debes retirar los tornillos, lo que yo llamé pasar por los puntos.
Ninguna versión del juego, que yo sepa, te premia por tocar menos escaleras, eso es como un reto o variante que estoy intentando lograr en el juego. Hay muchos retos que pueden inventarse en juegos ya hechos, pero eso no es inventar juegos realmente, no estoy inventando un juego, sino una competencia o reto en un juego ya hecho.

El coste de las rutas tampoco lo inventé yo, puedes contar tú mismo cuántas escaleras hay que tocar para ir de un punto a otro.


Bueno, ya que estamos escribo acá lo que escribí en mi libreta caminando:
Esto es una versión simplificada.
Código: [Seleccionar]
// CX_Y significa coste de ir desde X a Y.
// X e Y son los puntos, numerados porque es más fácil variarlos así.
// I se refiere al punto de inicio.
CI_1 = 50;
C1_I = 50;
CI_2 = 2;
C2_I = 2;
C1_2 = 3;
C2_1 = 3;
// Es como un triángulo en que conviene ir 1ero al punto 2 y luego al 1.
SerieConocida1 = "I";
SeriesConocidas = 1;
SerieaContinuar = 0;
function ContinuarOtraSerie() {
   ¿Hay?
   if (SerieaContinuar < SeriesConocidas) {
      // Sí, continuarla entonces:
      SerieaContinuar++;
      SerieContinuandose = eval("SerieConocida"+SerieaContinuar);
      IrA = 0;
   } else {
      // Mostrar mejor serie.
      gotoAndStop(fin);
   }
}
Aún no está completo.

07 Marzo, 2025, 10:55 pm
Respuesta #8

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
feriva:
Donkey Kong es el 1er juego lanzado para la consola Famicom, también conocida como Family Game, y que básicamente es una versión previa a la 1er consola de Nintendo.


Sí, pero yo pensé que lo ponías como ejemplo para después hacer tus cosas propios. Conozco ese juego porque a mis hijos les regalaba en navidades la Atari, después la Nintendo, la Juan Boy, la Game Gear (con el gato Sonic, que mi hijo mayor la rompió a los dos días porque la enchufó a la red) en fin. Y cuando salía de tocar el piano a las tantas de la noche, como cobraba al día, me iba al Vips, que estaba abierto hasta las tres de la madrugada, y a veces les compraba un juego o un muñeco del Spiderman o de La Masa... Unos mal criados, vamos; así han salido, tan vagos como su padre :D

Saludos.

08 Marzo, 2025, 09:40 am
Respuesta #9

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Me di cuenta de que no es necesario, en este tipo de problemas, marcar el coste de cada conexión, ya que si por ejemplo para ir de A a C hay que pasar por B, entonces en vez de AC se hará ABC, es lo mismo. Aunque puede complicar el método de solución.

El método que yo usaba para este problema no es eficiente. En vez de tanto paso a paso, pudiéndose ir repetidas veces a los mismos puntos, o poniendo código para evitarlo, conviene simplemente generar las posibles rutas, algo como:
Ruta1 = "ABCDEFGH";
Ruta2 = "ABCDEFHG";
Etc, y luego ver cual tiene menor coste. En este caso hay que tener todos los costes, o sea lo que comenté en el párrafo anterior no sirve.

Sé cómo generar una lista así, pero de un modo que me parece poco eficiente, mirando las listas a ver si el punto está incluído, usando ifs... Le pregunté a GPT, dijo:
En Macromedia Flash 5, utilizando ActionScript, puedes generar todas las palabras posibles de 8 caracteres utilizando solo las letras de la "A" a la "H" sin repetir ninguna letra. Esto se trata de generar todas las **permutaciones** de 8 elementos tomados de un conjunto de 8.

### **Enfoque: Generación de Permutaciones**
Dado que el conjunto tiene exactamente 8 caracteres y queremos formar palabras de 8 caracteres sin repetir, debemos generar todas las permutaciones posibles del conjunto `["A", "B", "C", "D", "E", "F", "G", "H"]`.

El número total de permutaciones es:
\[
8! = 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 40,320
\]

A continuación, te muestro cómo hacerlo en **ActionScript de Flash 5**:

---

### **Código en ActionScript (Flash 5) para generar permutaciones**
```actionscript
// Definir los caracteres disponibles
var caracteres:Array = ["A", "B", "C", "D", "E", "F", "G", "H"];
var resultados:Array = []; // Aquí almacenaremos las permutaciones

// Función recursiva para generar permutaciones
function generarPermutaciones(prefijo:String, disponibles:Array):Void {
    if (disponibles.length == 0) {
        resultados.push(prefijo); // Si no quedan más caracteres, almacenamos la palabra generada
        return;
    }
   
    for (var i:Number = 0; i < disponibles.length; i++) {
        var nuevoPrefijo:String = prefijo + disponibles; // Agregar la letra actual al prefijo
        var nuevaLista:Array = disponibles.slice(); // Copiar la lista sin modificar el original
        nuevaLista.splice(i, 1); // Eliminar la letra actual para no repetirla
        generarPermutaciones(nuevoPrefijo, nuevaLista); // Llamada recursiva
    }
}

// Iniciar la generación de permutaciones
generarPermutaciones("", caracteres);

// Mostrar resultados en la salida (puedes usarlos como quieras)
for (var j:Number = 0; j < resultados.length; j++) {
    trace(resultados[j]); // Muestra cada permutación en la consola de salida
}
```

---

### **Explicación del Código**
1. **Definimos los caracteres disponibles:** `["A", "B", "C", "D", "E", "F", "G", "H"]`.
2. **Creamos la función `generarPermutaciones(prefijo, disponibles)`**, que:
   - Recibe un `prefijo` (la palabra en construcción).
   - Recibe `disponibles` (los caracteres que aún pueden usarse).
   - Si no quedan más caracteres en `disponibles`, la palabra está completa y se almacena en `resultados`.
   - Si aún hay caracteres, se elige uno, se lo agrega al `prefijo`, se elimina de `disponibles`, y se llama a la función nuevamente con los valores actualizados.
3. **Llamamos a la función con un prefijo vacío `""` y la lista completa de caracteres.**
4. **Finalmente, mostramos todas las combinaciones usando `trace()`.**

---

### **Salida esperada**
Este código generará y mostrará todas las 40,320 permutaciones en la consola de salida de Flash.

**Ejemplo de algunas permutaciones generadas:**
```
ABCDEFGH
ABCDEFHG
ABCDEGFH
ABCDEGHF
ABCEDFGH
ABCEDFHG
...
HGFEDCBA
```

Cada palabra tiene exactamente 8 caracteres sin repeticiones.

---

### **Conclusión**
Este código en **ActionScript 1.0** (compatible con Flash 5) genera todas las permutaciones posibles de las letras de "A" a "H" sin repetir ninguna. La lógica es completamente recursiva y eficiente para este tamaño de problema.

Si necesitas almacenar estos resultados en un campo de texto en Flash o exportarlos, puedes modificar el código para agregarlos a un `TextField` o guardarlos en un archivo.

¡Espero que esto te ayude! 🚀


Proximamente intentaré más entender ese código.