你有没有从大自然中获得编程解决方案?

时间:2009-04-03 06:45:07

标签: design-patterns architecture

当你退后一步看......

  • 动物,昆虫,植物的性质及其有机解决的问题
  • 甚至可能是宇宙的本质和平衡

您是否能够通过从自然界中获得一种方法来解决问题?

我听说Ant Colony Algorithms能够优化供应链等等。 Fractal的“自然几何”也被应用于各种各样的问题。

现在春天又来了,世界又复活了,我想知道是否有人可以分享一些经验。

由于

PS我建议观看关于分形的“Hunting the Hidden Dimension”Nova剧集。

15 个答案:

答案 0 :(得分:20)

我记得有一位数学家读过一本关于数学领域的书,他提到了一个来自大自然的例子。他在大自然中的榜样帮助我改进了我正在研究的设计。

他的榜样是这样的:他正在开车,他在电话线上看到了一些鸟儿。这些鸟间隔均匀。这不是因为有一些全能的鸟在告诉每个人在哪里坐着。相反,每只鸟本身都有一定的“算法”,用于决定当另一只鸟来到时要做什么。我想,鸟儿喜欢最大化他们的自由空间。

当我对OO相当新的时候,这对我有所帮助。我一直倾向于使事情变得程序化,并在“上帝对象”中集中智慧。我读到这一点并意识到单个对象可能只关注他们需要知道和关心的事物,然而在大图像级别的结果仍然可以是你想要的。正确的结果可以“出现”而不受“控制”。

答案 1 :(得分:7)

我个人从来没有通过应用大自然的想法来解决问题。但是,我通过应用其他人的灵感来解决问题。

许多图形布局算法和布局算法一般都基于力学(弹簧,橡皮筋,重力)或简单的昆虫行为(跟随你的领导者,最大化/最小化距离)。

当然,我喜欢由Nygaard和Dahl开发的面向物体的编程,用于模拟物理现实世界的物体,并且由简单细胞可以简单地模仿OO的微生物学家Alan Kay完善。形成能够复杂行为的复杂生物。因此,从某种意义上说,每个做OO的人都是间接从自然界中获取他的程序。

答案 2 :(得分:3)

我从事图像处理工作,处理过于接近的简单阈值处理的blobby对象。我实施了一个分水岭算法 - 这个想法是,如果你将对象可视化为地图上的山丘,并计算两个山丘之间的分水岭线,你可以找出一个物体结束而另一个物体开始的地方。

我想改进这个算法,因为一个徒步旅行者发现自己在湖区高高地望着用手指切割山丘和山谷的全景(很多我的另一半的尴尬)。我也知道会给这些步行者提出一些问题,比如“这座山在哪里结束,下一座山从哪里开始?为什么?为什么你不算这个小丘?”

然而,我还没有把我的笔记本电脑拿出来。 :)

答案 3 :(得分:3)

无论自然界中有什么概念,我们可以在哪里制作数学模型(微分方程),我们可以将它们应用于编程,因为最后一个基于逻辑和数学基础,比其他基础更多。

我认为我们也可以反思它,例如观察者模式,有很多物种也实施这种模式,责任链等等。

这是一种有趣的思考方式......

好一个朋友!

答案 4 :(得分:3)

我们以编程方式创建了一个“bug”......一次......

答案 5 :(得分:2)

经常。

我有时在思考问题的同时在福雷斯特散步。而且我经常遇到的解决方案与树木有关。

我还参与了物理学启发的UI创意。使用重力,磁力或电力排斥等概念来组织显示屏上的项目。

我曾经听过有关SOA的有趣话题,信不信由你。该演讲的核心思想是SOA架构中的不同子系统应该以生物系统中的单元格的方式进行协作。关于复杂系统如何实际工作,这个主题非常有启发性,即使它是由松散耦合的组件构成的。

答案 6 :(得分:1)

其中最着名的是neural networks

答案 7 :(得分:1)

我的音乐软件(请参阅我的个人资料)使用进化过程创建音乐,其方式与Richard Dawkins的盲人制表师(创建图像而非音乐)类似。

答案 8 :(得分:1)

我的旧大学的CS部门对自七十年代以来受大自然启发的算法产生了历史性的兴趣(我认为正确的学术术语是Natural computation。这就是我接触其中一些算法的原因,特别是Evolution strategies,众所周知的神经网络,以及Membrane computing的奇特艺术。我还做了一个关于数据挖掘的课程,在那里我们研究了一些允许计算机系统从一组数据中学习的算法

我想说,使计算机"learn"成为某种东西的每种算法都属于从自然中衍生出来的类别。因此,即使像朴素贝叶斯这样的基本算法也属于这一类,我们可能都会以某种方式使用它们,例如:过滤掉垃圾邮件。

就个人而言,我只在大学课程或个人编程实验中实现了这种算法。我认为通常教会它们是强大的,尽管在许多情况下效率低于“经典”确定性算法。因此,应始终首选确定性算法 - 如果有解决问题的话!只有当问题太复杂而无法使用确定性算法求解时,自然计算才能提供更好的解决方案。根据我的个人经验,这确实是事实。一个小例子:我为解决数独谜题而实施的进化策略花了我半天的时间来实现并运行了几个小时来找到经典回溯算法在一秒钟内找到的相同解决方案(这花了我不到三十分钟的时间来写; - ))

我只记得一位同学使用进化策略来解决如何将一组文件最佳地分配到几张DVD上进行存档的问题,这就是我认为背包问题或装箱问题的应用,以及它工作得很好。显然,蚁群算法也可用于此。无论如何,感谢这个有趣的问题。

答案 9 :(得分:1)

我还没有解决这个问题,但我认为,对于声誉,“业力”或者在一群人中找到共识的任何变化的最终解决方案都在于Maynard Smith在“进化论”和“游戏理论”中描述的作品。具体而言,他开发了一种进化稳定策略(ESS)的概念,这种策略是对外部不良行为者强有力的行为模式。

如果我们假设每个人都是无私的,那么事情就很简单。梅纳德·史密斯所谓的“鸽子”策略总是推迟到别人身上是一种有效的策略,因为没有人会浪费时间。但它不是一个ESS,因为它可以被自私的演员从外面入侵。这类似于只有upvotes的网站。它会失败,因为任何人都可以投票给任何人。

像Stack Overflow和Slashdot这样的更复杂的系统主要鼓励upvotes,但允许downvotes。他们对那些没有“合作”的人更加强大,但他们仍然容易受到“游戏”的影响。在这两种情况下,通过发布第一个发布的内容,通过发布有趣而非有用的内容以及类似的操作,很容易快速提升声誉。

答案 10 :(得分:1)

我使用基于进化生物学的Genetic Algorithms来检测超大规模集成电路中的故障

以下链接将为您提供遗传算法的基本解释和遗传算法的C ++库。

Introduction to Genetic Algorithms

C++ Library of Genetic Algorithm Components

答案 11 :(得分:0)

daystar的威胁不断迫使我评估并重新评估我的算法以获得最大效率。

答案 12 :(得分:0)

我从conservation of energy的自然法则中理解了一件事,“产品中的错误总量是不变的。一个Bug永远不会被修复。它只会被转换为另一个错误 “!! : - )

除此之外,我非常感谢在我的工作中使用像C ++这样的语言,其中概念(例如:继承,朋友)来自社交系统。

答案 13 :(得分:0)

非常简单的“异常处理”概念是任何软件中最强大,最直接的自然应用。

任何生物体都能最好地适应周围不断变化的环境,并在生活中实现其生存目标。许多特殊情况介于两者之间以阻止其实现目标,但有机体努力奋斗并试图找到最佳方式来完成手头的工作。我们的日常生活充满了这样的经历。

异常处理也有助于任何软件努力实现其目标,避免遇到任何困难。

但软件中缺少的一件事是我真的必须在那里。它是这样的:

人类不断学习他们的错误,将他们遇到的所有事情存储在他们的头脑中,下次出现这样的问题时,他们知道如何避免/解决它。但是第一次发生时,他们知道要避免它们的正常习惯(使用公共基类Exception处理异常),但他们后来才知道有一种特殊的处理方法(像FileDoesNotExistException这样的专门异常类)。虽然他们接受朋友的建议,但他们从未到维修店进行更新。我希望你们有人能够了解我想说的话。

软件也应继续学习,不向用户显示“升级后的网站”消息,并使用普通的Exception类处理未知问题。虽然发布了新版本,但我希望我们应该开发一个全天候运行和自学软件,它可以升级自己,而不会下降。

答案 14 :(得分:0)

我与Terragen的作者做了一些工作,将他的一些大气渲染算法合并到我编写的景观渲染程序中。令我印象最深刻的是,代码实际上模仿了气氛 - 你用黑色作为你的基色(因为天空在空间中是黑色的)和光源颜色(有效白色,可能是一点点黄色),各种值大气高度,密度和红色/绿色/蓝色衰变然后踢掉整个东西 - 它产生了一个漂亮的蓝色渐变天空和一个发光的黄色太阳 - 或者如果你正确定位太阳正好红色到深蓝色的天空和日落。 / p>

实际上它并不是特别复杂 - 只是一些非常精心选择的数学方程模拟了最多十几个不同参数的行为 - 但它很精美。之后我花了很多时间玩它 - 并最终完全重写GLSL,但它确实教会了我一些关于如何处理某类问题的事情。