你有没有从大自然衍生出一个编程解决scheme?
当你退后一步看…
- 动物的性质,昆虫,植物及其有机解决的问题
- 甚至可能是宇宙的本质和平衡
你有没有能够通过从自然中获得一种方法来解决问题?
我听说过蚁群algorithm能够优化供应链等等。 分形的“自然几何”也被应用于广泛的问题。
现在spring又到了,世界又回来了,我想知道有没有人可以分享一些经验。
谢谢
PS我会build议观看“ 狩猎隐藏的维度 ”新星情节分形。
我记得有一位math家读了一本关于math领域的书,他提到了一个自然界的例子。 他从大自然的例子帮助我改进了我正在devise的一个devise。
他的例子是这样的:他在开车,他在电话线上看到一些鸟儿。 鸟儿间隔均匀。 这并不是因为有一些独裁的小鸟在告诉每个人坐哪里。 相反,每只鸟在其内部有一个“algorithm”,用于决定另一只鸟来临时该做什么。 我想,鸟类喜欢最大化自由空间。
这对于我来说OO相当陌生的时候帮助了我。 我一直倾向于把事情做成程序化的,对“上帝之物”有集中的智慧。 我读到这个,意识到单个物体只能集中在他们需要了解和关心的事物上,而大的图像水平的结果可能仍然是你想要的。 没有被“控制”,正确的结果就会“出现”。
我个人从未运用自然界的观点来解决问题。 但是,我通过运用别人的灵感来解决问题。
许多graphics布局algorithm和布局algorithm通常基于力学(弹簧,橡皮筋,重力)或简单的类昆虫行为(跟随你的领导者,最大化/最小化距离)。
当然,我喜欢Nygaard和Dahl开发的面向对象编程,用于模拟物理现实世界的对象,并由Alan Kay完成,这个微生物学家是在简单的细胞可以形成复杂的生物体之后明确地模拟OO的微生物学家能够复杂的行为。 所以,从某种意义上说,做OO的每个人都是间接地从自然中获得他的程序。
我从事image processing,处理过于靠近阈值的区域。 我实现了一个分水岭algorithm – 这个想法是,如果将对象可视化为地图上的小丘,并计算两个山丘之间的分水岭线,则可以计算出一个对象结束,另一个开始的地方。
我想改进这个algorithm,因为有一个徒步旅行者发现自己在湖区高处俯视着用我的手指切割山丘和山谷的全景(很大程度上是为了我另一半的尴尬)。 我也知道他们会提出一些问题,比如说:“这个山头和下一个山头在哪里开始?为什么?你为什么不指望那个小山呢?”
尽pipe如此,我还没有把我的笔记本电脑拿出来。 🙂
无论在自然界的哪个概念中,我们可以在哪里创build一个math模型(微分方程),我们可以将它们应用于编程,因为最后一个是基于逻辑和math基础的,比其他的更重要。
我想我们也可以把它想回去,比如观察者模式,也有很多种实现这个模式的物种,责任链等等。
它是一个有趣的方式来思考…
好朋友!
我们以编程方式创build了一个“bug”…曾经…
常常。
我有时在思考问题的时候去散步。 而且我常常遇到的解决办法与树木有关。
我也从事物理学的UI思想。 使用重力,磁力或电排斥等概念来组织显示器上的项目。
我也曾经听过一个关于SOA的有趣的话题,不pipe你信不信。 谈话的核心思想是SOA架构中的不同子系统应该以生物系统中的细胞方式进行合作。 这个问题高度地阐明了一个复杂的系统如何实际工作,即使它是由松散耦合的组件构成的。
其中最着名的是neural network 。
我的音乐软件(参见我的个人资料)使用演变过程来创build音乐,方式有点类似于理查德·道金斯(Richard Dawkins)的“盲人钟表师” (创造图像而不是音乐)。
自从七十年代以来,我的旧大学的计算机科学系对自然界的algorithm产生了历史性的兴趣(我认为正确的学术术语是自然计算 ,所以我接触了一些algorithm,特别是进化策略 ,已知的neural network和膜计算的奇特艺术,我也做了一个关于数据挖掘的课,我们研究了一些algorithm,让一个计算机系统从一组数据中学习。
我会说,使计算机“学习”某种东西的algorithm都属于从自然界衍生出来的范畴。 因此,即使像朴素贝叶斯那样相当基本的algorithm也属于这一类,我们可能都以某种方式使用它们来过滤掉垃圾邮件。
就个人而言,我只是在大学课程或个人编程实验中实现了这种algorithm。 我认为这是普遍的教导,他们是强大的,虽然在许多情况下比“经典”确定性algorithm效率低下。 因此,确定性algorithm应该始终是首选 – 如果有解决问题的方法! 只有当问题太复杂,使用确定性algorithm才能解决时,自然计算才能提供更好的解决scheme。 从我个人的经验来看,这其实是真的。 一个小例子:我为了解决数独谜题而实施的进化策略花了我半天的时间来实现,并跑了几个小时,find了经典的回溯algorithm在一秒钟内find的解决scheme(这花了我不到三十分钟的时间;-))
我只记得一个同学使用进化策略来解决如何将一组文件优化分发到几张DVD上进行存档的问题,这是我认为是背包问题或者装箱问题的一个应用,而且效果很好。 显然,蚁群algorithm也可以用于此。 无论如何,感谢这个有趣的问题。
我还没有解决这个问题,但是我认为,最终的解决scheme是名誉,“业力”或者在一群人之间达成共识的任何变化,都在于梅纳德·史密斯在“进化论”和“游戏理论”中描述的工作。 具体来说,他发展了一个演化稳定策略(ESS)的概念,这是一种对外部不良行为者有效的行为模式。
如果我们假定每个人都是无私的,那么事情就很简单。 梅纳德·史密斯(Maynard Smith)所谓的“鸽子”(Dove)策略总是推迟到别人的时间,这是一个有效的策略,没有人浪费时间。 但这不是一个ESS,因为它可以被自私的行为者从外面侵入。 这将类似于只有upvotes的网站。 这将失败,因为任何人都可以投票给顶部。
Stack Overflow和Slashdot等更复杂的系统主要鼓励upvotes,但允许downvotes。 对于不“合作”的人来说,他们更有力,但他们仍然容易受到“游戏”的影响。 在这两种情况下,通过发布一些有趣而不是有用的东西以及类似的动作,很快就能够迅速提升声望。
我使用基于进化生物学的遗传algorithm来检测超大规模集成电路中的故障
以下链接将为您提供遗传algorithm和C ++遗传algorithm库的基本说明。
遗传algorithm介绍
遗传algorithm组件的C ++库
daystar的威胁不断迫使我评估和重新评估我的algorithm以获得最大的效率。
有一件事我从自然界的能量守恒定律中得到了很好的理解,“ 产品中的错误总数是不变的,一个错误永远不会被修复,只会变成另一个错误 ! 🙂
除此之外,我非常感谢在我的作品中使用C ++这样的语言,其中的概念(例如:inheritance,朋友)是从社会系统中派生出来的。
非常简单的“exception处理”概念是任何软件中最强大,最直接的应用。
任何活的生物体都能适应周围环境的变化,并能在生活中实现自己的生存目标。 许多特殊情况之间来阻止其目标,但有机体艰苦奋斗,并试图find最好的方式来做手头的工作。 我们的日常生活充满了这样的经历。
exception处理也可以帮助任何软件绕过遇到的任何困难来实现其目标。
但是软件中缺less的一件事情是我真正想要的。 它是这样的:
人类不断从错误中学习,将所遇到的一切存储在脑海中,下一次出现这种问题时,他们就会知道如何避免/解决问题。 但是第一次发生的时候,他们知道要避免它的正常习惯(使用通用的基类Exception来处理exception),但是后来他们知道有一种专门的方法来处理它(专门的exception类如FileDoesNotExistException)。 他们从不去维修店去更新,虽然他们接受了朋友的build议。 我希望你们能够理解我想说的话。
一个软件也应该继续学习,而不要向用户显示消息“正在升级的站点”和使用简单的Exception类来处理未知的问题。 新版本发布虽然,但我希望我们应该开发一个全天候运行和自学的软件,自我升级,而不会停止。
我曾经和Terragen的作者做过一些工作,把他的一些大气渲染algorithm合并到我写的一个风景渲染程序中。 这个代码实际上模仿了大气层,让我印象深刻 – 你用黑色作为基本颜色(因为太空中的天空是黑色的)和光源颜色(实际上是白色的,也许是微微的黄色触摸)大气的高度,密度和红色/绿色/蓝色的衰变,然后把所有的东西都踢出去 – 从而产生了一个漂亮的蓝色gradle的天空和灿烂的黄色太阳 – 或者如果你把太阳正确地定位在一个漂亮的红色到深蓝色的天空和日落。
其实这并不是特别复杂 – 只是一些非常精心挑选的math方程式,模拟最多十几个不同参数的行为 – 但却是精美的结合在一起。 之后我花了很多时间玩这个游戏 – 最后把它完全改写成GLSL,但是它的确给了我一些关于如何解决某类问题的东西。