算法设计与分析课程设计报告样本

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

课程设计名称: 算法设计与分析

系 : 三系

学生姓名: 吴阳

班级: 12软件(2)班

学号: 0311232

成绩:

指导教师: 秦川

开课时间: 年一学期

一、问题描述

1.普通背包问题

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。选择装入的背包的物品, 使得装入背包中的物品的总价值最大, 在选择物品i装入背包时, 能够选择物品i的一部分, 而不一定要全部装入背包, 1≤i≤n。

2.0/1背包问题

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。选择装入的背包的物品, 使得装入背包中的物品的总价值最大, 在选择物品i装入背包时, 对于每种物品i只有两种选择, 即装入背包或者不装入背包, 不能将物品装入背包多次, 也不能只装入部分的物品i。

3.棋盘覆盖问题

在一个2k x 2k个方格组成的棋盘中恰有一个方格与其它的不同称为特殊方格, 想要求利用四种L型骨牌( 每个骨牌可覆盖三个方格) 不相互重叠覆盖的将除了特殊方格外的其它方格覆盖。

二、问题分析

1.普通背包问题

对于背包问题, 若它的一个最优解包含物品j, 则从该最优解中拿出所含的物品j的那部分重量W, 剩余的将是n-1个原重物品1, 2, ······, j-1, j+1, ·····, n以及重为Wi-W的物品j 中可装入容量为C-W的背包且具有最大价值的物品。

2.0/1背包问题

如果当前背包中的物品的总容量是cw, 前面的k-1件物品都已经决定好是否要放入包中, 那么第k件物品是否放入包中取决于不等式 cw + wk <= M (其中, wk为第k件物品的容量, M为背包的容量)( 此即约束条件)

然后我们再寻找限界函数, 这个问题比较麻烦, 我们能够回忆一下背包问题的贪心算法, 即物品按照物品的价值/物品的体积来从大到小排列, 然后最优解为( 1, 1, 1......., 1, t, 0, 0, ......) , 其中0<=t<=1;

因此, 我们在确定第k个物品到底要不要放入的时候(在前k-1个物品已经确定的情况下), 我们能够考虑我们能够达到的最大的价值, 即我们能够经过计算只放入一部分的k物品来计算最大的价值。我们要确保当前选择的路径的最大的价值要大于我们已经选择的路径的价值。这就是该问题的限界条件。经过该条件, 能够减去很多的枝条, 大大节省运行时间。

3.棋盘覆盖问题

每次都对分割后的四个小方块进行判断, 判断特殊方格是否

在里面。这里的判断的方法是每次先记录下整个大方块的左上角方格的行列坐标, 然后再与特殊方格坐标进行比较, 就能够知道特殊方格是否在该块中。如果特殊方块在里面, 这直接递归下去求即可, 如果不在, 这根据分割的四个方块的不同位置, 把右下角、 左下角、 右上角或者左上角的方格标记为特殊方块, 然后继续递归。在递归函数里, 还要有一个变量s 来记录边的方格数, 每次对方块进行划分时, 边的方格数都会减半, 这个变量是为了方便判断特殊方格的位置。其次还要有一个变nCount 来记录L 型骨牌的数量。

三、 建立数学模型

1.普通背包问题

普通背包问题的数学描述为: 在选择物品i 装入背包时, 能够选择物品i 的一部分, 而不一定要全部装入背包, 1≤i ≤n 。C>0,wi>0,vi>0,1≤i ≤n,要求找出一个n 元0-1向量( x1,x2,x3,·····, xn) ,xi ∈{0,1}, 1≤i ≤n,使得∑=n

i wixi 1≤C,

而且∑=n

xi 1i vi 达到最大。

2.0/1背包问题

0-1背包问题的数学描述为: 不能将物品装入背包多次, 也不能只装入部分的物品i 。 C>0,wi>0,vi>0,1≤i ≤n,要求找出一个n 元0-1向量( x1,x2,x3,·····, xn) ,xi ∈{0,1}, 1≤i ≤n,使得∑=n i wixi 1≤C,而且∑=n

xi 1i vi 达到最大。

3.棋盘覆盖问题

当k>0时, 将2k×2k棋盘分割为4个2^k-1×2^k-1 子棋盘(a)所示。特殊方格必位于4个较小子棋盘之一中, 其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘, 能够用一个L型骨牌覆盖这3个较小棋盘的会合处, 如 (b)所示, 从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割, 直至棋盘简化为棋盘1×1。

四、算法设计

1.普通背包问题

因为每一个物品都能够分割成单位块, 单位块的利益越大显

然总收益越大, 因此它局部最优满足全局最优, 能够用贪心法解决。

算法设计: 首先计算每种物品单位重量的价值Vi/Wi, 然后按单位重量价值从大到小进行排序, 根据贪心选择策略, 将尽可能多的

单位重量价值最高的物品装入背包。或将这种物品全部装入背包后,

背包内的物品总重量未超过背包容量C, 则选择单位重量价值次高的物品并尽可能多地装入背包, 依此策略一直进行下去, 直到背包装满为止。

2.0/1背包问题

该0-1背包问题采用的是回溯算法, 回溯算法的基本解题步骤是:

( 1) 针对所给问题定义问题的解空间;

( 2) 确定易于搜索的解空间结构;

( 3) 以深度优先方式搜索解空间, 并在搜索过程中用剪枝函数避免无效的搜索。

算法设计:

a.物品有n种, 背包容量为C, 分别用p[i]和w[i]存储第i 种物品的价值和重量, 用

x[i]标记第i种物品是否装入背包, 用bestx[i]存储第i种物品的最优装载方案;

b. 用递归函数Backtrack (i,cp,cw)来实现回溯法搜索子集树( 形式参数i表示递归深

度, n用来控制递归深度, 形式参数cp和cw表示当前总价值和总重量, bestp表示当前

最优总价值) :

①若i >n, 则算法搜索到一个叶结点, 判断当前总价值是否最优:

相关文档
最新文档