算法设计方法小结

本文总结了常用的5种算法设计办法和理念.

 

最优化问题(optimization problem)

         每个最优化问题都包含一组限制条件(constraint)和一个优化函数(optimization function), 符合限制条件的问题求解方案可称为可行解(feasible solution), 能够

使得优化函数取得最佳值的可行解称为"最优解" (optimal solution)

 

【方法一】贪心法(greedy method)

算法思想:在贪婪算法中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的准则下)。决策一旦作出,就不可再更改。作出贪婪决策

的依据称为贪婪准则(greedy criterion)

典型例子:最短路径、找零钱、货箱装船、拓扑排序、最小生成树

 

【方法二】分而治之算法

算法思想:分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以如下做:

                   a. 它分成两个或多个更小的问题;

                   b. 分别解决每个小问题;

                   c. 把各个小问题的解答组合起来,即可得出原问题的答案。

小问题通常与原问题相似,可以递归地使用分而治之策略来解决。

典型例子:找出伪币、金块问题、矩阵分块相乘、残缺棋盘、归并排序、快速排序、距离最近的点对

 

【方法三】动态规划(dynamic programming)

算法思想:和贪婪算法一样,在动态规划中,可将一个问题的解决方案视为一系列决策的结果。不用的是,在贪婪算法中,每采用一个次贪婪准则做出一个不可撤回

的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。动态规划方法采用最优原则(principle of optimality)来建立用于计算最优解的递归式。

所谓最优原则即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次决策产生)的最优决策。由于对于有些问题的某些递归式来说并不一定能保证最优原则,

因此在求解问题时有必要对它进行验证。若不能保持最优原则,则不可应用动态规划方法。

个人观点: 动态规划的数学表现是递归、排列组合,在递归过程中会出现重复计算问题,为了解决这个开销,使用二维表格保存已计算出的结果,以便复用!

典型例子:最短路径、0/1背包问题、矩阵乘法链、元件折叠

 

【回溯法】

        寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需要的解。理论上,当候选解数量

有限并且通过检查所有或部分候选解能够得到所需解时,上述方法是可行的。

 

算法思想:回溯(backtracking)是一种系统地搜索问题解答的方法。为了实现回溯,首先需要为问题定义一个解空间(solution space),这个空间必须至少包含

问题的一个解(可能是最优的)。在迷宫老鼠问题中,我们可以定义一个包含从入口到出口的所有路径的解空间;在具有n 个对象的0 / 1背包问题中解空间的一个

合理选择是2^n个长度为n 的0 / 1向量的集合,这个集合表示了将0或1分配给x的所有可能方法。

 

回溯方法的步骤如下:
1) 定义一个解空间,它包含问题的解。
2) 用适于搜索的方式组织该空间。
3) 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。
回溯算法的一个有趣的特性是在搜索执行的同时产生解空间。

 

【分支界定】

         类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间。然而与回溯法不同的是,回溯算法使用深度优先方法搜索树结构,而分枝定界

一般用宽度优先或最小耗费方法来搜索这些树。

算法思想:分枝定界(branch and bound)是另一种系统地搜索解空间的方法,它与回溯法的主要区别在于对E-节点的扩充方式。每个活节点有且仅有一次机会变成

E-节点。当一个节点变为E-节点时,则生成从该节点移动一步即可到达的所有新节点。在生成的节点中,抛弃那些不可能导出(最优)可行解的节点,其余节点加入活

节点表,然后从表中选择一个节点作为下一个E-节点。从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过程才结束。

 

  

1.问题描述 给定一个N*N 的方形网格,设其左上角为起点,坐标为(1,1),X 轴向右为正,Y 轴 向下为正,每个方格边长为1。一辆汽车从起点出发驶向右下角终点,其坐标为(N,N)。 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守 如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在 起点与终点处不设油库。 (2)当汽车行驶经过一条网格边时,若其X 坐标或Y 坐标减小,则应付费用B,否则 免付费用。 (3)汽车在行驶过程中遇油库则应加满油并付加油费用A。 (4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费用A)。 (5)(1)~(4)中的各数N、K、A、B、C均为正整数。 算法设计: 求汽车从起点出发到达终点的一条所付费用最少的行驶路线。 数据输入: 输入数据。第一行是N,K,A,B,C的值,2 <= N <= 100, 2 <= K <= 10。第二行起是一个N*N 的0-1方阵,每行N 个值,至N+1行结束。方阵的第i 行第j 列处的值为1 表示在网格交叉点(i,j)处设置了一个油库,为0 时表示未设油库。 各行相邻的2 个数以空格分隔。 结果输出: 将找到的最优行驶路线所需的费用,即最小费用输出. Sample input 9 3 2 3 6 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 Sample output 12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值