贪心算法实现背包问题算法设计与分析实验报告

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

算法设计与分析实验报告

实验名称贪心算法实现背包问题评分

实验日期年月日指导教师

姓名专业班级学号

一.实验要求

1. 优化问题

有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组成,而把满足约束条件的子集称为该问题的可行解。可行解一般来说是不唯一的。那些使目标函数取极值(极大或极小)的可行解,称为最优解。

2.贪心法求优化问题

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

3.一般方法

1)根据题意,选取一种量度标准。

2)按这种量度标准对这n个输入排序

3)依次选择输入量加入部分解中。如果当前这个输入量的加入,不满足约束条件,则不把此输入加到这部分解中。

procedure GREEDY(A,n) /*贪心法一般控制流程*/

//A(1:n)包含n个输入//

solutions←φ //将解向量solution初始化为空/

for i←1 to n do

x←SELECT(A)

if FEASIBLE(solution,x)

then solutions←UNION(solution,x)

endif

repeat

return(solution)

end GREEDY

4. 实现典型的贪心算法的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容

1. 编程实现背包问题贪心算法。通过具体算法理解如何通过局部最优实现全局最优,

并验证算法的时间复杂性。

2.输入5个的图的邻接矩阵,程序加入统计prim算法访问图的节点数和边数的语句。

3.将统计数与复杂性函数所计算比较次数比较,用表格列出比较结果,给出文字分析。

三.程序算法

1.背包问题的贪心算法

procedure KNAPSACK(P,W,M,X,n)

//P(1:n)和W(1;n)分别含有按

P(i)/W(i)≥P(i+1)/W(i+1)排序的n件物品的效益值

和重量。M是背包的容量大小,而x(1:n)是解向量

real P(1:n),W(1:n),X(1:n),M,cu;

integer i,n;

X←0 //将解向量初始化为零

cu←M //cu是背包剩余容量

for i←1 to n do

if W(i)>cu then exit endif

X(i) ←1

cu←cu-W(i)

repeat

if i≤n then X(i) ←cu/ W(i)

endif

end GREEDY-KNAPSACK

procedure prim(G,)

status←“unseen” // T为空

status[1]←“tree node” // 将1放入T

for each edge(1,w) do

status[w]←“fringe” // 找到T的邻接点

dad[w] ←1; //w通过1与T建立联系

dist[w] ←weight(1,w) //w到T的距离

repeat

while status[t]≠“tree node” do

pick a fringe u with min dist[w] // 选取到T最近的节点

status[u]←“tree node”

for each edge(u,w) do

修改w和T的关系

repeat

repeat

2.Prim算法

PrimMST(G,T,r){

//求图G的以r为根的MST,结果放在T=(U,TE)中

InitCandidateSet(…);//初始化:设置初始的轻边候选集,并置T=({r},¢) for(k=0;k

(u,v)=SelectLiShtEdge(…);//选取轻边(u,v);

T←T∪{(u,v)};//扩充T,即(u,v)涂红加入TE,蓝点v并人红点集U

ModifyCandidateSet(…); //根据新红点v调整候选轻边集

}

四.程序代码

1.背包问题贪心算法

#include

struct goodinfo

{

float p; //物品效益

float w; //物品重量

float X; //物品该放的数量

int flag; //物品编号

};//物品信息结构体

void Insertionsort(goodinfo goods[],int n)

{

int j,i;

for(j=2;j<=n;j++)

{

goods[0]=goods[j];

i=j-1;

while (goods[0].p>goods[i].p)

{

goods[i+1]=goods[i];

i--;

}

goods[i+1]=goods[0];

}

}//按物品效益,重量比值做升序排列

void bag(goodinfo goods[],float M,int n)

{

float cu;

int i,j;

for(i=1;i<=n;i++)

相关文档
最新文档