software patterns pattern example book design design-patterns architecture

design - patterns - ¿Alguna vez has obtenido una solución de programación de la naturaleza?



software architecture patterns pdf (15)

Cuando das un paso atrás y miras ...

  • la naturaleza de los animales, insectos, plantas y los problemas que han resuelto orgánicamente
  • tal vez incluso la naturaleza y el equilibrio del universo

¿Alguna vez has sido capaz de resolver un problema derivando un enfoque de la naturaleza?

He oído hablar de los Algoritmos Ant Colony pudiendo optimizar la cadena de suministro, entre otras cosas. También la "geometría de la naturaleza" de Fractal se ha aplicado a una amplia gama de problemas.

Ahora que la primavera está aquí de nuevo y el mundo está volviendo a la vida, me pregunto si alguien tiene algunas experiencias que puedan compartir.

Gracias

PD: recomendaría ver el episodio Nova de " Cazar la dimensión oculta " en fractales.


Creamos un "error" programáticamente ... una vez ...


Cualquiera sea el concepto en la naturaleza, donde podemos hacer un modelo matemático (Ecuación Diferencial) podemos aplicarlos a la programación ya que los últimos se basan en la lógica y la base matemática, uno más que otros.

Creo que también podemos pensarlo al revés, por ejemplo, el patrón del observador, hay muchas especies que también implementan ese patrón, cadena de responsabilidad, etc.

Es una forma interesante de pensar ...

Buen amigo!


El concepto extremadamente simple de "manejo de excepciones" es la aplicación más poderosa y directa de la naturaleza en cualquier software.

Cualquier organismo vivo hace su mejor esfuerzo para adaptarse a las circunstancias cambiantes que le rodean, y para avanzar en la vida y lograr su objetivo de supervivencia. Muchas circunstancias excepcionales se presentan para evitar su objetivo, pero los organismos luchan con fuerza e intentan encontrar la forma más óptima de hacer el trabajo. Nuestras vidas diarias están llenas de tales experiencias.

El manejo de excepciones también ayuda a cualquier software a trabajar para lograr su objetivo sin pasar por las dificultades encontradas.

Pero una cosa que falta en los softwares es algo que realmente debería estar allí. Dice así :

Los seres humanos siguen aprendiendo de sus errores, almacenando todo lo que encuentran en sus cabezas, y la próxima vez que surja ese problema, saben cómo evitarlo / resolverlo. Pero la primera vez que ocurre, saben que lo evitan de sus hábitos normales (manejando la excepción usando la excepción de la clase de base común), pero luego aprenden que hay una forma especializada de manejarlo (clase de excepción especializada como FileDoesNotExistException). Nunca van a un taller de reparación para actualizarse, aunque reciben asesoramiento de amigos. Espero que ustedes entiendan la esencia de lo que estoy tratando de decir.

Un software también debe seguir aprendiendo sin mostrar a sus usuarios el mensaje "Sitio bajo actualización" y manejar problemas desconocidos utilizando la clase de Excepción simple. Sin embargo, se publican nuevas versiones, pero me gustaría que desarrollemos un software de autoaprendizaje que funcione todo el tiempo y que se actualice a sí mismo, sin bajar nunca.


La amenaza de daystar constantemente me obliga a evaluar y reevaluar mis algoritmos para una máxima eficiencia.


Mi software de música (ver mi perfil) usa el proceso evolutivo para crear música, de una manera un tanto análoga a The Blind Watchmaker (que creó imágenes en lugar de música) de Richard Dawkins.


Muy a menudo.

A veces he ido a dar un paseo por el bosque mientras medito sobre un problema. Y la mayoría de las veces, las soluciones que encuentro tienen algo que ver con los árboles.

También trabajé en ideas de UI inspiradas en la física. Usar conceptos como gravedad, magnetismo o repulsión eléctrica para organizar elementos en la pantalla.

También escuché una vez una charla interesante sobre SOA, lo creas o no. La idea central de la charla fue que diferentes subsistemas en una arquitectura SOA deberían cooperar a la manera de las células en un sistema biológico. El tema fue muy esclarecedor en cuanto a cómo un sistema complejo realmente puede funcionar, incluso si está construido a partir de componentes débilmente acoplados.


Personalmente, nunca resolví un problema aplicando ideas de la naturaleza. Sin embargo, he resuelto problemas mediante la aplicación de soluciones de otras personas inspiradas en la naturaleza.

Muchos algoritmos de diseño de gráficos y algoritmos de diseño en general se basan en mecánica (resortes, gomas elásticas, gravedad) o en un comportamiento simple similar a un insecto (siga a su líder, maximice / minimice la distancia).

Y, por supuesto, me gusta la programación orientada a objetos, que fue desarrollada por Nygaard y Dahl para simulaciones de objetos físicos del mundo real, y fue perfeccionada por Alan Kay, un microbiólogo que modeló OO explícitamente de la forma en que las células simples pueden formar organismos complejos capaz de un comportamiento complejo. Entonces, en cierto sentido, todos los que hacen OO, derivan indirectamente su programa de la naturaleza.


Recuerdo haber leído un libro de un matemático sobre el campo de las matemáticas, y mencionó un ejemplo de la naturaleza. Su ejemplo de la naturaleza me ayudó a mejorar un diseño en el que estaba trabajando.

Su ejemplo fue este: conducía y vio algunas aves en un cable telefónico. Los pájaros estaban espaciados uniformemente. Esto no sucedió porque había un ave que gobernaba y le decía a cada uno dónde sentarse. Más bien, cada ave tenía dentro de sí un cierto "algoritmo" para decidir qué hacer cuando venía otro pájaro. Las aves prefieren maximizar su espacio libre, supongo.

Esto me ayudó en un momento en el que era bastante nuevo en OO. Seguí tendiendo a hacer las cosas de procedimiento y tengo inteligencia centralizada en "objetos de Dios". Leí esto y me di cuenta de que los objetos individuales podían enfocarse solo en las cosas que necesitaban saber y preocuparse, y aún así, el resultado a nivel de imagen completa podría ser lo que usted desea. Que el resultado correcto puede "emerger" sin ser "controlado".


Todavía no he resuelto el problema, pero creo que la solución definitiva para la reputación, el "karma" o cualquier variación en la búsqueda de un consenso entre un grupo de personas radica en el trabajo de Maynard Smith descrito en Evolution and the Theory of Games. Específicamente, desarrolla el concepto de una Estrategia evolutivamente estable (ESS), que es un patrón de comportamiento que es robusto contra los malos actores externos.

Si asumimos que todos son altruistas, entonces las cosas son simples. Lo que Maynard Smith llama la estrategia "Dove" de aplazar siempre a los demás es una estrategia eficiente en el sentido de que nadie pierde el tiempo luchando. Pero no es un ESS, porque puede ser invadido desde afuera por actores egoístas. Esto sería análogo a un sitio que solo tiene votos ascendentes. Fallaría porque cualquiera podría votar cualquier cosa a la cima.

Los sistemas más sofisticados como y Slashdot fomentan principalmente votos ascendentes, pero permiten votos hacia abajo. Son más robustos contra las personas que no están "cooperando", pero siguen siendo vulnerables a los "juegos". En ambos casos, es fácil ganar reputación rápidamente al ser el primero en publicar, al publicar algo divertido en lugar de útil, y acciones similares.


Trabajo en el procesamiento de imágenes, tratando con objetos de blobby que están demasiado cerca para distinguirlos por simple umbralización. Implementé un algoritmo de cuenca hidrográfica, la idea es que si visualiza los objetos como colinas en un mapa y calcula la línea divisoria de aguas entre las dos colinas, puede averiguar dónde termina un objeto y dónde comienza el otro.

Quería mejorar este algoritmo y, como un poco excursionista, me encontré en lo alto del Lake District mirando por encima del panorama, cortando las colinas y los valles con los dedos (para vergüenza de mi otra mitad). También se me conoce por molestar a los caminantes con preguntas como: "¿dónde termina esta colina y comienza la siguiente? ¿Por qué? ¿Y por qué no contaron ese montículo?"

Sin embargo, aún no llegué a llevar mi computadora portátil conmigo. :)


Una cosa que he entendido bien de la ley de conservación de la energía de la naturaleza, "la cantidad total de errores en el producto es constante. Un error nunca se soluciona, simplemente se convierte en otro error ". :-)

Bromas aparte, estoy muy agradecido de utilizar idiomas como C ++ en mi trabajo, donde los conceptos (por ejemplo, herencia, amigo) se derivan del sistema social.


Una vez trabajé con el autor de Terragen para incorporar algunos de sus algoritmos de representación atmosférica en un programa de representación de paisajes que había escrito. Me impresionó mucho que el código realmente emulara la atmósfera: alimentaste con negro como tu color base (porque el cielo está negro en el espacio) y el color de la fuente de luz (efectivamente blanco, un ligero toque de amarillo), varios valores para la altura de la atmósfera, la densidad y la descomposición rojo / verde / azul lo patearon por completo, produciendo un bonito cielo azul degradado y un sol amarillo brillante, o si colocaste el sol correctamente, un bonito cielo azul y azul oscuro y una puesta de sol.

En realidad, no era particularmente complejo, solo algunas ecuaciones matemáticas extremadamente bien elegidas que emulaban el comportamiento de, como máximo, una docena de parámetros diferentes, pero estaba bellamente ensamblado. A partir de entonces, pasé mucho tiempo jugando con él y finalmente reescribiéndolo por completo para GLSL, pero ciertamente me enseñó algunas cosas sobre cómo abordar un cierto tipo de problema.




El departamento de CS de mi antigua universidad ha tenido un interés histórico por los algoritmos inspirados en la naturaleza desde los años setenta (creo que el término académico correcto es Computación natural . Así es como entré en contacto con algunos de esos algoritmos, especialmente las estrategias de Evolución , redes neuronales conocidas, y el arte exótico de la computación Membrana . También hice una clase sobre minería de datos, donde estudiamos algunos algoritmos que permitían que un sistema informático aprendiera de un conjunto de datos.

Yo diría que todo tipo de algoritmo que hace que la computadora "learn" algo pertenece a la categoría que se deriva de la naturaleza. Por lo tanto, incluso los algos bastante básicos como el ingenuo Bayes caen en esta categoría, y probablemente todos los usemos de una forma u otra, por ejemplo, para filtrar el correo electrónico no deseado.

Personalmente, solo he implementado este tipo de algoritmos en clases universitarias o en mis experimentos personales de programación. Creo que generalmente se enseña que son poderosos aunque en muchos casos menos eficaces que los algoritmos deterministas "clásicos". Por lo tanto, siempre se debe preferir un algoritmo determinista, ¡si hay uno que resuelva el problema! Solo cuando el problema es demasiado complejo para ser resuelto usando algoritmos determinísticos, la computación natural puede ofrecer una mejor solución. Desde mi experiencia personal esto es realmente cierto. Un pequeño ejemplo: la estrategia de evolución que implementé para resolver acertijos Sudoku me llevó medio día implementarla y ejecutarla durante varias horas para encontrar la misma solución que el clásico algoritmo de retroceso encontrado en menos de un segundo (lo que me llevó menos de treinta minutos escribir). ;-))

Solo recuerdo que un compañero de estudios utilizó estrategias de evolución para resolver el problema de cómo distribuir de manera óptima un conjunto de archivos en varios DVD para su archivo, que creo que es una aplicación del problema de la mochila o el problema del empaquetamiento, y funcionó bastante bien . Aparentemente, los algoritmos de colonia de hormigas también se pueden usar para esto. De todos modos, gracias por esta interesante pregunta.