5由机器语言到高级语言
用高级语言进行问题求解:
计算机语言和编译器是计算机系统最重要的抽象和自动化机制。
算法、计算机语言与计算机程序:
常量:以十进制的形式写在程序中的
变量:对应着一个或若干个存储单元,保存数据,在程序执行过程中内容可以不断变化
保留字:编译器靠保留字识别程序
表达式:比较表达式(结果为true或false),算术表达式(结果为数值),逻辑表达式(结果为true或false)
不同表达式可互相组合形成复杂表达式,类型以最外层运算为准
数学上的函数只是一个符号表达,计算机程序中的函数则是一段可以执行的程序。
程序:算法的一种机器相容的表示,是利用计算机程序设计语言对算法描述的结果,是可以在计算机上执行的算法。
程序设计过程:编辑源程序à编译à链接à执行
计算机语言程序设计环境:编辑、编译、连接、调试、运行一体化平台
将简单模式转换成汇编语言语句序列,用常量值和变量地址进行替换,组合次序调整,得到最后的汇编语言程序。
高级语言:符号化+语句化+结构化à编译化à机器语言程序
6程序与递归
程序:计算系统千变万化复杂功能的表达手段
构造程序的基本手段:组合、抽象
构造方法:递归、迭代
递归与迭代是描述具有自相似性的无限对象(或过程)的一种手段
抽象:将经常使用的、可由低层次系统实现的一些复杂动作,进行命名,以作为高层次系统的指令被使用。
递归:怎样在表达中既去掉省略号,而又能表达近乎无限的内容
递归的典型视觉形式:自相似性事物的无限重复性构造
计算学科中的递归源自于数学中的递推
定义 | 优点 | 缺点 | |
递归 | 程序调用自身的编程技巧称为递归 | 1)大问题化为小问题,可以极大的减少代码量; 2)用有限的语句来定义对象的无限集合.; 3)代码更简洁清晰,可读性更好 | 1)递归调用函数,浪费空间; 2)递归太深容易造成堆栈的溢出;
|
迭代 | 利用变量的原值推算出变量的一个新值,迭代就是A不停的调用B. | 1)迭代效率高,运行时间只因循环次数增加而增加; 2)没什么额外开销,空间上也没有什么增加。 | 1) 不容易理解; 2) 代码不如递归简洁; 3) 编写复杂问题时困难。 |
二者关系 | 1) 递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。 2) 能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出./*相对*/ |
此问题能用递归解决,不能用迭代解决
有5个盘子需要从A移动到C时需求解4个盘子借助C从A移动到B,然后AàC,最后4个盘子借助A从B移动到C。
有4个盘子需要从A移动到C时需求解3个盘子借助C从A移动到B,然后AàC,最后3个盘子借助A从B移动到C。
有3个盘子需要从A移动到C时需求解2个盘子借助C从A移动到B,然后AàC,最后2个盘子借助A从B移动到C。
……
有5个盘子需要从A移动到B时需求解4个盘子借助B从A移动到C,然后AàB,最后4个盘子借助A从C移动到B。
有4个盘子需要从A移动到B时需求解3个盘子借助B从A移动到C,然后AàB,最后3个盘子借助A从C移动到B。
有3个盘子需要从A移动到B时需求解2个盘子借助B从A移动到C,然后AàB,最后2个盘子借助A从C移动到B。
……
Y树
迭代:具有无限自相似性步骤的表达,循环-替代-递推----迭代
递归:具有无限自相似性步骤的表达,自身调用自身,高阶调用低阶
原始递归函数----复合与递归
7算法
“是否会编程“本质上是“能否想出求解问题的算法”,其次才是将算法用计算机可以识别的形式书写出来。
算法----计算机与软件的灵魂
是一个有穷规则的集合,它用规则规定了解决某一特定类型问题的运算序列,或者规定了任务执行或问题求解的一系列步骤。广义上的算法包括音乐乐谱,太极拳普等。
能行性:如上图中算法使用的都是基本运算(除法、赋值、逻辑判断)和典型的“重复/循环“与”迭代“;另外能行性也包括必须在有限时间内完成。
算法类问题:由一个算法可以解决的问题,寻找一个(唯一的)方法(算法)以解决同一类型的无穷多个单个问题系列的问题。
算法类问题示例:
数学建模:用数学语言描述实际现象的过程,即建立数学模型的过程
数学模型是对实际问题的一种数学表述,是关于部分现实世界为某种目的的一个抽象的简化的数学结构。
将现实世界的问题抽象成数学模型,就可能发现问题的本质及其能否求解,甚至找到求解该问题的方法和算法。
如图:如果能抽象成数学模型,则可将一个具体问题的求解,扩广为一类问题的求解!
问题抽象及数学建模:
算法策略设计:
TSP问题的难解性:随着城市数量的上升,TSP问题的“遍历”方法计算量剧增,计算资源将难以承受。2001年解决了德国15112个城市的TSP问题,使用了美国Rice大学和普林斯顿大学之间互连的、速度为500MHz的Compaq EV6 Alpha处理器组成的110台计算机,所有计算机花费的时间之和为22.6年
最优解VS.可行解
遍历、搜索算法,分治算法,贪心算法,动态规划算法
贪心算法(今朝有酒今朝醉):一定要做当前情况下的最好选择,否则将来可能会后悔,故名“贪心”。
TSP问题的贪心算法求解思想:从某一个城市开始。每次选择一个城市,直到所有城市都被走完。
每次在选择下一个城市的时候,只考虑当前情况,保证迄今为止经过的路径总距离最短。
算法的数据结构设计:
即问题或算法相关的数据之间的逻辑关系及存储关系的设计。(如何将数学模型中的数据转为计算机可以存储和处理的数据)
数据结构是数据的逻辑结构、存储结构及其操作的总称,它提供了问题求解(算法)的数据操纵机制
“变量”及其存储:变量名相当于存储单元的地址,变量值相当于存储单元的内容,这种映射关系是由编译器在编译的过程中动态地为变量名赋予存储单元的地址完成的。
“变量”与“指针变量”:v为变量的地址,指向变量的起始存储单元地址;*p相当于存储单元的内容为其他变量地址的地址。
不同类型变量占用存储单元的个数不同。
不区分左子树和右子树:
区分左子树和右子树:
数据结构不同,数据之间的操作方法也是不同的
若要定位具体的存储单元,由数据结构/编译器决定。
逻辑上是二维的按行、列下标来操作一个元素,如M[2,3]或M[2][3];物理上仍旧是一维存储的,由“表起始地址+(行下标-1)*列数+列下标”。这种转换可由系统自动完成,程序中只需按下标操作即可,即如M[2][3]。
算法的控制结构设计:
即算法的计算规则或计算步骤设计。(如何构造和表达处理的规则,以便能够按规则逐步计算出结果)
程序流程图:
欧几里得算法流程图:
步骤描述法:
自然语言表示的算法容易出现二义性、不确定性等问题
算法的实现----程序设计:
算法分析与计算复杂性:
主要关注点:循环的层数
O(n3)等为多项式级别时间复杂性(可执行的)
O(3n)等为非多项式级别时间复杂性(难执行的)
指数级别时间复杂性,
阶乘级别时间复杂性等。
P:确定性多项式时间可求解问题
NP:非确定性多项式时间可求解问题
多项式时间内可以验证一个解是不是这个问题的解
算法复杂性:求解一个问题的某一个算法本身的复杂性
问题的计算复杂性:求解出问题的精确解所必需的复杂性(P&NP)
8怎样研究算法-遗传算法研究示例
算法复杂性:求解一个问题的某一个算法本身的复杂性
问题的计算复杂性:求解出问题的精确解所必需的复杂性(P&NP)
P类问题:可求解类问题
NP类问题:包含P类问题,多为难求解问题
NPC类问题:NP类问题子集,完全非确定性多项式问题,多为难求解问题
NPC à 遍历(计算)à 精确解 难于计算,时间复杂性高
NPC à 算法(降低计算量)à 近似解 à 使近似解趋近于精确解
现实世界中的问题分类:
可求解问题:计算机在有限时间内能够求解的
难求解问题:计算机在有限时间内不能求解的
不可计算问题:计算机完全不能求解的
问题的计算复杂性:
问题的一种特性,即利用计算机求解问题的难易性(难以程度)
计算复杂性的衡量标准:时间复杂度+空间复杂度:
时间复杂度:计算所需的步数或指令条数
空间复杂度:计算所需的存储空间大小
----通常表达为关于问题规模n的一个函数O(f(n)
加密算法应该设计成NPC类问题:
用户找不出系统口令,且用户随机输入口令后系统可以判断口令是否正确。
NPC类问题求解示例:
TSP问题的遍历算法:穷举法或称遍历法,对解空间中的每一个可能解进行验证,直到所有的解都被验证是否正确,便能得到精确的结果----精确解 可能是O(n!)或O(na) (a为整数)
TSP问题的贪心算法:近似解求解算法 应该是O(na) Δ=|近似解 — 精确解| 满意解:Δ充分小时的近似解 (精度换时间)
TSP问题的仿生学算法:进化算法,遗传算法,蚁群算法,蜂群算法……
生物学中的遗传和进化:
遗传与进化+优胜劣汰
基本概念:
种群 vs. 个体 vs. 染色体
染色体 vs. 基因
基因型 vs. 表现型
个体的适应度(Fitness)
选择(Selection)
复制(Reproduction)
交配/杂交(Crossover)
突变(Mutation)
基因型:染色体
表现型:个体
终止条件:到达一定代数;不产生新的解等
NPC问题求解:
1、NPC问题理论上可通过枚举-验证的遍历算法来进行
穷举法(遍历法):对解空间中的每一个可能解进行验证,直到所有的解都被验证是否正确,便能得到精确的结果—精确解 O(n!)或O(an)
2、不求精确解,而求近似解-满意解
随机搜索方法: 在解空间中随机选择一些可能解进行验证,求出所选择可能解(子解空间)中的最优解—近似解
基于概率论(概率模型)--随机选择;子空间越大,求得满意解的可能性越大,但耗时也会加长;求出的近似解并不能保证是满意解
3、为提高近似解的质量,可采取导向性随机搜索方法
导向性随机搜索法:对随机点的选取进行导向(导向到接近最优解的方向或路径)
基于概率论--随机选择;随机选择的可能解与前一可能解相比,更偏向于满意解;万一初始解就很差怎么办?
4、为进一步提高近似解的质量,可采取导向性群(体)随机搜索方法
导向性群(体)随机搜索法:同时对多个随机点的选取进行导向(导向到接近最优解的方向或路径),多条搜索路径
基于概率论--随机选择;多条路径下的优化,总比一条路径的最优要更优一些;遗传算法就是这样一种导向性群随机搜索算法;同一时刻多条路径上的解集合即为一个种群。多次选择,即多代进
对于NP问题,当没有其他更好的算法可以使用时,可以考虑选择遗传算法
遗传算法的适用条件:
(1)已知“解空间”,即可能解的表现型和基因型
(2)关于可能解的“适应度”函数的计算方法(适应度用于判断一个可能解接近精确解的程度或方向)
遗传算法提供了一种求解复杂系统问题的通用框架
例1:“会议室租用问题
例2:“航班机组成员”选择问题
例3:“软件测试用例”选择问题
一维的集覆盖问题
此问题的解:<X1,X2…Xn>,其中Xn取0或1,取1表示使用资源,取0表示不使用资源
约束条件:在解中一个任务至少有一个资源可以完成这个任务(s.t.)
问题理解很重要,从问题出发寻找算法
数学建模对于正确理解问题很关键
可从问题角度寻找针对问题的特定的算法
遗传算法设计要点:
可能解:假设一个问题的解的形式为X,由X的取值空间或定义域给定的任何一个X值被称为可能解
可行解:而一个问题通常有很多个关于可能解的约束,即不是任何一个X值都满足约束,我们可将满足问题约束的那些X值称为可行解
近似解:而由一个算法在任何一组可行解中求出的最优解被称为是近似解
满意解:而符合用户期望的近似解被称为是满意解
最优解:所有可行解中的最优解的问题是最优解
具体问题à过程/步骤中的设计技巧à可能解的编码技巧
策略选择的多样性:
策略选择的随机性:
交叉操作本质上是一种组合,其组合所形成的可能解空间依然是庞大的,难以确定性的遍历每个组合
基于概率的随机处理方法也是遗传算法的核心处理机制
交叉概率:在一个群体中,个体被选择出进行交叉的概率
交叉策略按前述的各种策略进行,每一种策略都是一子解空间
随机可依据问题选择不同的概率模型,进行处理
概率模型的不同,交叉策略(多样性,随机性)选择的不同构成了丰富多彩的遗传算法。
交叉策略比较:
“点交叉”将覆盖更大的可能解空间,产生更多种新可能解,增加获得最优解的机会;
“行交叉”、“列交叉”大大地压缩了可能解的解空间,产生的可能解都是可行解(编码方案将约束条件考虑进去了)
策略选择需要折中:选择搜索更加广泛的解空间呢,还是选择压缩搜索空间?
不同的交叉策略对算法的求解质量和收敛速度等方面是有影响的,没有一种设计能够面面俱到,因此如何在算法不同方面性能之间权衡,也是遗传算法设计过程的关键所在,体现了一定程度的技术性和艺术性。
变异在遗传算法的设计中不能设置的过于频繁
现在算法很多,不可能一一介绍,此处更多是借助遗传算法给一个算法学习方法上的指导