Dudas simples de matemáticas

Aviso desde la moderación a navegantes

Este es el hilo de dudas simples de matemáticas. Lo que se logra preguntando dudas complejas aquí es que otra gente con dudas más sencillas no las transmitan por pensar que pueden quedar en "evidencia" dada la "sencillez" de su pregunta; y nada más lejos de la realidad.

Para algo concreto más allá de lo simple, recomendamos crear un nuevo hilo. Intentemos fomentar que la gente que tenga dudas simples de matemáticas vengan a este hilo. Quienes tengan dudas simples de física a este otro. Y quienres deseen una explicación sencilla de algún fenómeno a este otro. Intentemos hacer de Ciencia un subforo accesible y donde todos sientan que pueden aportar.
laZAr0

#300 Jajaja, hostia tú, pues está curioso. He abierto el enlace de la wikipedia y es que es exáctamente eso. Pero desgraciadamente entiendo muy poco, nunca he utilizado algoritmos, y mis matemáticas se quedaron en algunas ecuaciones diferenciales sencillas que utilizaba en las clases de matemáticas y física aplicadas a la biología, nada muy destacable, por lo tanto me he perdido en el 11/9OPT+1.

Pero sí, he hecho algo parecido a lo que describes, he cogido lápiz y papel y como ves los he ordenado todos de mayor a menor y los he ido sacando así, utilizando siempre los trozos sobrantes de los listones mayores para obtener el siguiente mayor posible.

Pero al final de todos los cálculos, he llegado a la conclusión de que me sobraría 1 listón de 340cm, que me ha parecido "me sobra mucho, casi uno entero", por lo que ya me he puesto a darle vueltas, ¿y si utilizo los dos primeros que me sobran de 155 para sacar los 2 de 70cm y los 2 de 80cm en lugar de utilizaros para sacar los 4 de 145?. Entonces me han surgido infinidad de posibilidades y opciones en mi cerebro y he venido aquí a preguntar cómo se haría de la manera más óptima.

No sabía que se llamase "Bin packing problem", pero imaginaba que algo existiría del estilo. Muchas gracias por tu respuesta.

Supongo que se podrá hacer con el ordenador utilizando esos algoritmos ¿no?, si me puedes dar cómo queda exactamente después comparto cómo me había quedado a mi con la cuenta de la vieja y comparamos.

Muchas gracias por todo. :D

2 respuestas
hda

#299 #300 #301 Qué cosa más bonita acaba de ocurrir :)

1
Mirtor

#301 Lo de \( \frac{11}{9}OPT+1 \) entiendo que se refiere a que, en el peor de los casos, comprarás once novenos más uno del número de tablones teóricamente ideal y óptimo.

Es decir, si para tu problema el número de tablones óptimo es 10, usando ese método, en el peor de los casos, comprarás \( \frac{11}{9}10+1=13.222≈14 \) tablones

1 1 respuesta
Ulmo

#300 ¿Seguro que es NP? Creo que es NP solo a partir de 2 dimensiones, si son listones de 1 sola dimensión (aqui solo importa la longitud) juraría que el algoritmo es ordenar los listones por tamaño y ya esta.

Es decir, pillas el mayor y si no tienes ningún cacho sobrante que te sirva pillas madera nueva, y así de forma iterativa.

2 respuestas
laZAr0

#303 No lo pillo, ¿el valor OPT, es decir el "10" ése que pones en tu ejemplo de dónde lo sacaría?, ¿qué es, la suma de las longitudes de todos los listones entre lo que mide un listón?

1 respuesta
Mirtor

#305 Sería el valor óptimo que conseguirías de utilizar el algoritmo bueno pero chungo. El valor teórico, vaya.

Eso de 10 ha sido una inventada, era un ejemplo

1 respuesta
laZAr0

#306 Ya ya, sé que era un ejemplo. A mi me salió esto haciendo lo de ordenarlos de mayor a menor e ir utilizando los sobrantes para el siguiente mayor posible:

Me salían 13, que es lo que ya dije en mi primer post de forma implícita:

#299laZAr0:

Nadie quiere comprar por ejemplo 15 listones si sólo necesita 13

Y la duda me surge al ver que me quedaba un listón de mas de 280 cm y varios de entre 30 y 60, por lo que supuse que quizás habría una manera mejor para que sobrase menos. A partir de aqui sigo igual de perdido que cuando posteé la primera vez.

#306 Es que no entiendo una mierda, porque supongamos que lo que yo he hecho me da que son 13 lo óptimo, ¿para que voy a multiplicarlo por 11/9 y sumar 1 si ya sé que me hacen falta 13? Creo que estoy demasiado cansado y estoy empezando a decir estupideces. :wtf:

XD

2 respuestas
B

#304 y tan seguro como que si quieres te paso mi PFC xD (ahora en serio si te interesa el libro de Chen: Introduction to tractability, disponible en su web, le dedica bastantes capitulos). NP-completo, no existe algoritmo que aproxime mejor que 3/2 aunque si que existe una AFPAS (Asymptotic fully polynomical approximation scheme), es decir que puedes aproximarte asintoticamente a \((1+\epsilon)OPT\) para cualquier \(\epsilon\). Si hubiese un algoritmo que aproximase (no asintoticamente) a \(\frac{3}{2}OPT\) entonces podrias resolver el integer partition problem o el sum-of-sets problem que son famosamente NP-completos.

#307 13 no es lo optimo, 13 es lo que te sale por el cuento de la vieja xD. Es lo que dice mirtor, con ese algoritmo la mayoria de veces te dara lo optimo, pero en el peor de los casos te dara un poco mas que lo optimo. La verdad es que implementar el algoritmo optimo para este problema con relativamente pocas variables (y ademas repetidas, que tambien simplifican) me parece un poco palo jajajaja, pero si quieres encontrar la mejor manera, un algoritmo facil de implementar es probar todas las permutaciones de los elementos y hacer un Best Fit con esos.

1 1 respuesta
laZAr0

#308 Vale gracias por todo, supongo que cuando me despeje un poco volveré a probar las diferentes variantes.

Un abrazo.

1 respuesta
B

#309 dicho todo esto ( #304 ) lo de ordenar de mayor a menor en la graaaan mayoria de los casos (en promedio vaya) te va a dar el optimo. Para que no sea optimo tienes que tener objetos de medidas muy especificas (en plan 4/7, 7/11, etc.). Asi que es muuuuy probable que no puedas hacerlo mejor que en 13. Estoy buscando un algoritmo genetico que implemente para mi PFC, si lo encuentro lo voy a correr a ver si sale algo mejor, pero lo dudo.

1 1 respuesta
laZAr0

#310 jajaja, vale gracias, pero no hacía falta que te molestases tanto. :muac:

B

ahora que se esta ahblando de algoritmos hago una pregunta (que alomejor no deberia ir en este hilo). pero como funcionan este tipo de algoritmos??

el programa va guardando los datos y los usa en la siguiente generacion?
seria algo parecido a un programa que resuelve una ecuacion por ejemplo usando un metodo numerico que se va aumentando la precision?
una generacion seria como una interaccion?

Alguien tiene ejemplos o algo que saciendo mi curiosidad?

1 respuesta
B

#312 basicamente el algoritmo (realmente lo correcto es llamarle metaheuristica) funciona asi:

  • Tienes una manera de codificar la solucion/accion del algoritmo. Tienes una funcion a optimizar (es decir puedes comparar dos soluciones)
  • Tienes una manera de combinar dos soluciones distintas y producir una nueva.
  • Tienes una manera de cambiar aleatoriamente una solucion y probar otra.

Entonces lo que haces es lo siguiente:
Pruebas \(2k\) soluciones generadas por ti al azar o como sea. Te quedas con la mitad que mejor funciona, las combinas entre ellas y las cambias, hasta que tienes nuevas \(2k\) soluciones a probar. Repites hasta encontrar la mejor.

Para mi el mejor ejemplo de genetic algorithms es este:https://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

2 2 respuestas
B

#313 basicamente creas una seriel de resultados, los comparas y te quedas con los que mejor te cuadren?

1
Millonet1

Joder, esto ha sido precioso :'')

1
B

#307 encontre el algoritmo genetico, incluso implemente el optimo, y 13 es lo mejor que puedes hacer.

2 1 respuesta
laZAr0

#316 Muchas gracias por tu tiempo amigo, me ayudaste de verdad. Ya volveré con más dudas, siempre lo hago. Un abrazo. :P

1
n3krO

Duronman, donde implementas tus algoritmos?

2 respuestas
B

#318 a que te refieres con eso?

B

#318 para este usé MATLAB porque era el que usaba en el PFC. Ahora todo lo hago con Python (numpy y scipy son MVP) para pruebas, R para estadística, y C++ (BLAS,LAPACK,GPL,Boost) para codigo serio y multiprocesador.

También estoy probando Julia pero no está tan verificado como Python. De hecho lo empecé a usar cuando se estaba estrenando y todavía tenía bugs en operaciones elementales. Ahora ha mejorado muchísimo.

PD: Por qué todo quisqui en esta página tiene custom title menos yo? xD

2 respuestas
hda

#320 cuda cuda cuda cuda cuda

1 respuesta
B

#321 cierto, no lo he contado porque la mayoría de multiprocesador que hago es MPI y uso muy poco GPU/FPGA. También he usado en algun momento Hadoop y Spark para "big data". Pero ahora estoy en un curso de advanced computer graphics y a ver si le doy al GPU :D .

2
n3krO

#320 Que ventajas tiene python ante matlab para probar los algoritmos?

Aprendiste C#? Ventajas de C++ frente a C#? (aparte de que C++ es compilado a codigo ensamblador)

3 respuestas
Zerokkk

#313 Una pregunta, ¿no lo convierte esa característica en una especie de machine learning por aprendizaje reforzado? Osea, no es exactamente así; en el ML usamos una red de nodos (neuronas) que constituyen una parte de la solución y tienen un peso asignado, el cual cambia con el tiempo (según aprende la máquina), y en los algoritmos genéticos me imagino que irá por "mutaciones" en la DNA String, según he leído por ahí. Esta DNA string me imagino que no será más que los datos para la solución, en el caso de la mona lisa, seguramente cada trocito sea un objeto con tres variables (los tres puntos de coordeandas que conforman los polígonos), ¿me equivoco?

Visto así, la diferencia se vuelve difusa, a ver si puedes explicar un poco más cuál es la diferencia, a nivel de cómo funciona, entre un algoritmo de ML por reinforced learning, y un algoritmo genético. También molaría saber de qué datos se conforma el DNA String y cómo muta de una solución a otra.

#323 Yo creo que te acabas de responder a ti mismo xD. Creo que C++ compila directo a assembly, mientras que C# pasa por un lenguaje intermediario, como Java hace con Bytecode...

Python creo que se usa por la simplicidad de entenderlo, más que otra cosa.

2 respuestas
B

#323 que como tengas que hacer muchos calculos matlab y esos programas petan, mejor hacer el codigo desde 0 en otro lenguaje

B

#323 ninguna a nivel de eficiencia, me gusta porque es gratis y no necesito licencias chunguis xD. Usan las mismas librerías por debajo así que en velocidad andan a la par, y ya luego es cuestión de preferencias (a mí me gusta la programación orientada a objetos y la comunidad de python por ejemplo, por no decir que los vectores empiezan por 0 como tiene que ser xD). Nunca aprendí C#, sorry.

#324 mhmm las maneras de actualizar son distintas y mucho más aleatorio. Pero vaya, es que dentro de ML hay tantos algoritmos que seguramente alguno se parecerá a GA. Toda esta nomenclatura es marketing imho.

2 respuestas
B

#326 matlab no funciona igual que maple?

2 respuestas
n3krO

#324 La cosa es que un codigo en C# me parece muchisimo mas elegante que un codigo en C++ que normalmente es mas engorroso...

2 respuestas
B

#327 nope maple es cálculo simbólico aunque tiene funcionalidades de numérico... yo compararía a maple más con mathematica.

1 respuesta
B

#329 creia que tmb era simbolico y lo hacia mas lento a la hora de hacer numeros

1 respuesta