AutoCad - anidar 3 bucles while

 
Vista:
Imágen de perfil de Juanma
Val: 171
Bronce
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

anidar 3 bucles while

Publicado por Juanma (140 intervenciones) el 26/02/2023 14:07:18
Hola,
Sigo buscando un código capaz de optimizar el corte de perfiles comerciales.
Para eso, creo que una buena solución sería proceder de la siguiente forma:

- ordenar de mayor a menor los trozos a cortar.
- seleccionar todos los trozos que tienen casi la longitud de los perfiles comerciales (5800 a 6000 mm)
- seleccionar los trozos que de 2 en 2, suman una longitud de los perfiles comerciales
- seleccionar los trozos que de 3 en 3, suman una longitud de los perfiles comerciales
- seleccionar los trozos que de 4 en 4, suman una longitud de los perfiles comerciales
- seleccionar los trozos que de 5 en 5, suman una longitud de los perfiles comerciales

- a partir de aquí ya los trozos son lo suficientemente chicos como para hacer un buen encaje simplemente poniéndolos de mayor a menor, y buscando el siguiente que quepa cuando no quepa el que le toca. (esto es lo que tengo implementado, y según el caso, ya hace bastante buen encaje)

También he pensado que la forma de encontrar los elementos que sumen, por ejemplo, de 3 en 3, la longitud del perfil comercial, es mediante bucles while anidados, para recorrer la lista buscando las distintas combinaciones de 3 elementos distintos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Juanma
Val: 171
Bronce
Ha mantenido su posición en AutoCad (en relación al último mes)
Gráfica de AutoCad

anidar 3 bucles while

Publicado por Juanma (140 intervenciones) el 11/03/2023 01:06:08
Muchas gracias por contestar, pero la verdad es que ya por fín conseguí hacer que los bucles anidados funcionaran.

Algo parecido a lo que me propones pero en Autolisp es lo que he conseguido programar en mi versión 4.

A medida que creo la lista nueva, voy borrando de la anterior, así cada vez quedan menos elementos sobre los que hacer bucles, pero esto me dió problemas al principio, por que no me dí cuenta de que si selecciono el 5 y el 9, al borrar el 5, ya no puedo borrar, el 9, sino que tengo que borrar el 8 (el 9 ahora es el 8).

aunque hay que poner varias restricciones a los bucles, por que se vuelve muy pesado según los datos.

comencé con las que tu me propones, pero entonces, como tardaba incluso varios minutos, pensé como limitar cálculos:

- como está ordenado de mayor a menor, si el primer elemento no es al menos mayor que la mitad de la barra, salte del bucle.
- 1/3 para los trios, 1/4 para los cuartetos, y 1/5 para la suma de 5.
- igual con el trozo mas pequeño, si el mas pequeño de la lista no es, al menos menor que 1/2 barra, ni entres en el bucle de parejas, ya que no existirá ninguna pareja que quepa en una barra ( algo raro y muy evidente a la vista) pero lo mismo con los demás supuestos.
- siguiendo esa política, en los bucles anidados, por ejemplo el que busca trios:
si los 2 primeros elementos, no suman al menos 2/3 de barra, salte del bucle ( igual, como van de mayor a menor, si los 2 primeros no llegan a 4 m, no existe un 3 que llegue a 6 m es tontería seguir calculando)



lo que yo hace mi rutina es:

- ordenar de mayor a menor los trozos,
- recorrer la lista buscando parejas que sumen como tu dices,(son 2 bucles anidados)
- recorrer la lista buscando trios que sumen como tu dices,(son 3 bucles anidados)
- igual pero de4...
- igual pero de 5...
a partir de aquí, implemento la versión anterior de mi lisp (versión 3):
lo que hace es que sigue colocando trozos de mayor a menor, pero cuando no cabe el siguiente, busca uno que quepa, y luego otro, si es que cabe, y así hasta que ya no caben mas, y empieza otra vez por los trozos restantes mas grandes, en la siguiente barra.

es curioso, que según el caso, la versión 3 llega a hacerlo mejor que la 4, aparte de que es mucho mas rápida, y queda un orden mas estético.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar