« 十年之007:用文字图表符号呈现的算法十年之009:生活算法是一种行动规则 »

十年之008:生活算法案例

    生活算法可以根据不同的复杂度来进行区分。有些是所包含的形式相对少,总体相对简单,有些则是反复嵌套、包含的形式相对多,总体相对复杂。无论是复杂还是简单,对于学习者来说都是重要的。我们通过简单的事情后面的相对简单的“生活算法”来明白事情的规律,形成规则。用确认的规则来降低复杂事情后面的“生活算法”的复杂度,使事情变的更容易。有了生活算法的帮助,可以使复杂的事情简单起来,可以对简单的事情进行更深入的理解。

    “算法”是针对方法与步骤的。能够体现在生活中的各个方面。在解决问题时除了方法与步骤外,算法还需要与目标层级、各要素关系等相结合。在生活中,算法是方法、是步骤,最终的目的不是为了算法本身,而是解决问题。

    在这种视角下,生活算法是由一个个环节、模块组成的,利用生活算法可以对很多事情进行研究,同时对许多事情有了另一个角度的理解。

    1.生活算法问题1-生活中的电话移机问题

    前几天,朋友佟君搬家后面对了一个不大不小的问题,她记录下来了自己的过程与想法:

信息时代不能没有信息技术

    星期六搬到新家,在处理一些日常生活琐事中感受到了信息技术在日常生活中的重要性。

    以电话移机过程中的几个步骤为例:

    1.网络查询天通苑所属电话局——2.电话咨询乘车路线——3.网通(北七家)营业厅(告知要先在总局办迁出手续)——4.西单营业厅办迁出手续——5.回网通(北七家)营业厅。折腾了一整天,很累!路上我想如果能够灵活运用好现代信息技术,通过网络或电话咨询直接问清办理手续就没必要跑多余的路了。在生活中象这种事情非常多,所以我觉得随着社会的不断进步,在我们的信息技术课中应该不断地增加信息技术应用内容(如网络的各种应用、电话、IC、IP、掌上电脑……)
……

    利用图表、符号,可以将解决“电话移机”的方法与步骤画出下图:

   利用生活算法,可以将复杂的生活活动明确化,这样就会使事情变得简单起来,这就是生活算法中的特点。象上面佟君的例子中,每个步骤要用1到2个小时左右。能够提前明确步骤,不绕弯路就会节省大量的时间。其实热爱徒步的驴友、喜欢历史故事的许多人都是在别人的例子中去寻找属于自己的路。

    如果具体地从算法角度说,在“电话移机”的例子中可以体现出算法的分治法、动态法等。  在分析、解决问题时,主要应用了算法中的分治法,可以将“电话移机”这个大问题将分解成若干小的问题。有乘车(1)、总局办事(1)、乘车(2)、现电话局办事(2)、乘车(3)、总局办事(2)……。子问题如果是相似的,就可以把它们设计为是一个解决模块。 这样第一次解决了,其他各次仅按照本次,较简单重复即可。“电话移机”这样问题的解将是各子问题的解按一定次序的组合。

    在解决问题中也能够应用出动态规划算法。人总是灵活的,不是按照流程机械地重复。如果某个子问题的解决对整体有着重要影响,就会对其相应调整,这样就会对整体解决问题有着更好的影响。

    在整个活动中的过程为:提出问题,预设方案-利用技术手段获取信息-提出方案(算法)-在实践中修正方案。

    在两种不同的分析对比中,可以用自然语言表达算法使用了“一、二、三”编号的技巧,而利用图表、符号表达的算法可能会比自然语言更简明。

    2.生活算法问题2-统筹学经典问题泡茶

    生活算法与统筹科学有着重要的关系。如果利用生活算法对其进一步分析,往往能够从中发现更多的、更有意思的内容。

    烧水就是统筹学中的典型例子。不过在生活中“烧水”可能会比以前了解到的更复杂一些。

    当独自一个人去解决一个方面的问题,一般会使用串行的工作方式,先去解决这件事情,再去解决那件事情。其中有些事情之间是有先后次序的,不能随意颠倒次序。

    为了泡壶茶喝,需要进行的步骤有:洗烧开水的壶,洗茶壶、茶杯,灌水,取茶叶,烧开水,等水烧开了泡茶……。“泡茶”这件事,包含着多个模块的动作,还可以用多种不同的形式、多种工作方式完成。

 

烧水的分析图

    第一种方案:洗开水壶再灌自来水,烧开水;在烧水时,洗茶壶、茶杯,取茶叶;等水烧开了,泡茶喝。这是串行的工作方式。 由一个人按照次序一步步地进行下去。当然这是最笨的一种方法,在生活中的熟手很少采用,因为其中很多时候都是在等待。类似的选择并不是说不可能出现,象在与朋友聊天时有些人就愿意选择花费时间长一些的。

     第二种方案:做事情前总要先想一想解决方案和:烧开水花费的时间较多,可以在烧开水的同时做一些事情。 这样就可以节省了时间。对于泡茶这件事情而言,其中的第2、3、4步骤可以同时进行。一种烧水,一边就可以做好准备工作了。对各个模块的工作而言,这是一种并行形式的工作。 而对于个人来说,他要一步步地完成每个步骤,仍然是一种串行方式。

    第三种方案:如果有两个朋友A和B一起喝茶。大家可以将整个任务分解开,一起完成。 可以这样分工:A负责洗开水壶,烧开水,B负责洗茶壶、茶杯,取茶叶。在水烧开了以后两个人共同泡茶。这无论对于人,还是对于烧水的各个子任务都是并行的工作方式。

    串行是按照先后次序实行或实施的,并行则是同时的。对于计算机和程序设计算法而言,并行算法的难度与复杂度远远大于串行算法。而在我们生活中,复杂与简单的事情却随时发生着。“简单”生活的复杂远远超过了我们的想象。这也是我们需要进一步研究生活算法的原因之一吧。

    3.生活算法问题3-装包算法问题

    有些生活算法会非常接近程序设计算法,会有着与程序设计算法相似的复杂度。 生活中的装包就有这样的特点

    基本问题:   背包问题-需要对容量为C的背包进行装载。从N个物品中选取装入背包的物品,不同的物品的重量为W(I),分别对应的价值P(I)。如何装包?

    【算法】:    在装包过程中,可以考虑的算法有: 
    算法1:贪心算法准则1-在剩余的物品中找出一个可以装入背包的价值最大的物品。 
    算法2:贪心算法准则2-从剩余的物品中找出可以装入背包的重量最小的物品。 
    算法3:贪心算法准则3-计算价值密度,用价值除以物品重量,P(I)/W(I)。从剩余的物品中选择可装入包的P(I)/W(I) 的物品。
    算法4:贪心算法之K阶优化-从装好的包中取出K件物品,并放入另外K件,如果获得的结果比原来的好,则选择新的方案,否则保持原有状态。用这种方案可以优化整个放入物品的序列。
    算法5:动态规划算法-用递归进行计算求解。每装入一件物品后,计算基于现有状况下,再装包的最优解。当然这种装包方法需要比较复杂的计算。
    算法6:……

     【变形问题】:   装包问题只是一种代表,这样的研究往往代表着生活中一类问题。

    基本问题是一种理想状态,在具体实践中还会有着更复杂的要求。例如: 
    •货郎的背包:一个走街串巷的货郎的背包应当如何装载?
    •公司经理的背包:做为一名经理,要外出参加产品推销会需要如何装载自己背包? 
    •野外生存者的背包:如何进行装载野外生存者的背包? 
    ……

     具体的生活会有不同的、具体的要求。公司经理装包时首先考虑到完成自己任务的必须工具,如笔记本电脑、便携式投影仪等,然后再考虑自己的生活用品;货郎在需要体力能够承受的前提下进行装包;野外生存者需要首先不是物品价值,而是野外最关键的物品,此时手电筒可能会比Gameboy游戏机更重要……。根据生活中的不同要求选择不同的装载算法。算法可以上升成为解决一类问题的策略。

    而掌握了算法、策略会在其他的各种活动中同样有着重要作用。

    4.生活算法问题4-网站制作的学习过程问题 (附)

    技术不仅仅是硬件、设备,还应当包括应用设备的方法、过程。生活算法分析能更好地体现与技术产品的互动关系中。

    生活中的算法分析需要明确两类关系,一类是层级/结构关系,另一类是流程次序关系。信息技术课的教学中也有着典型的体现。例如,指导做一个简单的相册网站的算法分析:
    结构分析

    首先是网站规划。需要让学生首先清楚目标将是什么样子的,即规划的内容。网站的结构主要有分支型和顺序型:

    分支型网站的结构:

    顺序型网站的结构:

    步骤分析 在明确了目标的结构关系之后,可以进一步设计自己的工作流程:

    在这里用图表的形式可以清楚地表现出来两种不同的关系。一种是层级/关系,把目标的结构用图表的形式表现出来。另一种是应用技术的次序关系,是工作的流程图。

    熟练掌握技术的人需要在明确网站的层级/结构关系后才能明确自己的工作流程。在算法分析中,对层级/结构的分析是为了更准确、真实地找到解决问题的方法与步骤。结构是为次序服务的,使次序更明确。

  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们

日历

最新评论

最近发表

Powered By Z-Blog 1.7 Laputa Build 70216

Copyright 2003-2007 芸心芹意 bean.being.org.cn Some Rights Reserved.