201871010128-杨丽霞 实验二 个人项目—《背包问题》项目报告

项目 内容
课程班级博客链接 班级博客链接
这个作业要求链接 作业要求链接
我的课程学习目标 (1)详细阅读《构建之法》学习并掌握PSP的具体流程
(2)掌握背包问题,通过查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序
(3)掌握Github发布软件项目的操作方法
这个作业在哪些方面帮助我实现学习目标 (1)熟悉了软件项目个人开发流程
(2)了解了Github发布软件项目的操作方法
(3)学习了背包问题和PSP流程, 以及采用动态规划算法、回溯算法求解D{0-1}背包问题
项目Github的仓库链接地址
任务1: 阅读教师博客“常用源代码管理工具与开发工具”内容要求,点评班级博客中已提交相关至少3份作业。
作业点评链接:
   **https://www.cnblogs.com/mayan0821/p/14547899.html**
   **https://www.cnblogs.com/chms/p/14550446.html**
   **https://www.cnblogs.com/yzh8626/p/14549646.html**

任务2: 详细阅读《构建之法》第1章、第2章,掌握PSP流程

通过阅读邹欣老师的《构建之法》,我了解到PSP流程是一种可用于控制、管理和改进个人工作方式的自我持续改进过程,是一个包括软件开发表格、指南和规程的结构化框架。PSP与具体 的技术(程序设计语言、工具或者设计方法)相对独立,其原则能够应用到几乎任何的软件工程任务之中。PSP能够说明个体软件过程的原则; 帮助软件工程师作出准确的计划;确定软件工程师为改善产品质量要采取的步骤;建立度量个体软件过程改善的基准;确定过程的改变对软件工程师能力的影响。

PSP流程

PSP 各个阶段 自己预估的时间(小时) 实际的记录(小时)
计划: 明确需求和其他因素,估计以下的各个任务需要多少时间 1 2
开发 4 6
需求分析 2 3
生成设计文档 1 2
设计复审 2 4
代码规范 5 6
具体设计 4 4
具体编码 8 15
代码复审 2 5
测试 1 2
报告 2 2
测试报告(发现了多少bug,修复了多少) 1 3
计算工作量 (多少行代码,多少次签入,多少测试用例,其他工作量) 2 2
事后总结, 并提出改进计划 (包括写文档、博客的时间) 1 3
任务3: 项目开发背景:背包问题(Knapsack Problem,KP)是NP Complete问题,也是一个经典的组合优化问题,有着广泛而重要的应用背景。{0-1}背包问题({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP问题形式,它的一般描述为:从若干具有价值系数与重量系数的物品(或项)中,选择若干个装入一个具有载重限制的背包,如何选择才能使装入物品的重量系数之和在不超过背包载重前提下价值系数之和达到最大?

D{0-1} KP 是经典{ 0-1}背包问题的一个拓展形式,用以对实际商业活动中折扣销售、捆绑销售等现象进行最优化求解,达到获利最大化。D{0-1}KP数据集由一组项集组成,每个项集有3项物品可供背包装入选择,其中第三项价值是前两项之和,第三项的重量小于其他两项之和,算法求解过程中,如果选择了某个项集,则需要确定选择项集的哪个物品,每个项集的三个项中至多有一个可以被选择装入背包,D{0-1} KP问题要求计算在不超过背包载重量 的条件下,从给定的一组项集中选择满足要求装入背包的项,使得装入背包所有项的价值系数之和达到最大;D{0-1}KP instances数据集是研究D{0-1}背包问题时,用于评测和观察设计算法性能的标准数据集;动态规划算法、回溯算法是求解D{0-1}背包问题的经典算法。查阅相关资料,设计一个采用动态规划算法、回溯算法求解D{0-1}背包问题的程序。

动态规划就是通过采用递推(或者分而治之)的策略,通过解决大问题的子问题从而解决整体的做法。动态规划的核心思想是巧妙的将问题拆分成多个子问题,通过计算子问题而得到整体问题的解。而子问题又可以拆分成更多的子问题,从而用类似递推迭代的方法解决要求的问题。基本思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次(将结果存储起来),从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。 这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

功能设计:
1.可正确读入实验数据文件的有效D{0-1}KP数据;

2.能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图;

3.能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;

4.用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);

5.任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件;

动态规划算法:

int c[10][100];/*对应每种情况的最大价值*/
int knapsack(int m,int n)
{
 int i,j,w[10],p[10];
 for(i=1;i<n+1;i++)
        scanf("/n%d,%d",&w[i],&p[i]);
 for(i=0;i<10;i++)
      for(j=0;j<100;j++)
           c[i][j]=0;/*初始化数组*/
 for(i=1;i<n+1;i++)
      for(j=1;j<m+1;j++)
           {
            if(w[i]<=j) /*如果当前物品的容量小于背包容量*/
                     {
                      if(p[i]+c[i-1][j-w[i]]>c[i-1][j])
                           /*如果本物品的价值加上背包剩下的空间能放的物品的价值*/
                         /*大于上一次选择的最佳方案则更新c[i][j]*/
                            c[i][j]=p[i]+c[i-1][j-w[i]];
                            else
                            c[i][j]=c[i-1][j];
                     }
              else c[i][j]=c[i-1][j];
            }
 return(c[n][m]);   
}
int main()
{
    int m,n;int i,j;
    scanf("%d,%d",&m,&n);
    printf("Input each one:/n");
    printf("%d",knapsack(m,n));
    printf("/n");/
    return 0;
}```
回溯算法:
```#include <stdio.h>
#define N 3
int bestp;
int cp;
int x[N];
void knap(int c[N],int v[N],int t,int m)
{
	if(t>N-1)
	{
		if(bestp<cp) bestp=cp;
	}
	else
	{
		knap(c,v,t+1,m);//不取
		if(c[t]<=m)//取
		{
			cp+=v[t];
			m-=c[t];
			knap(c,v,t+1,m);
			m+=c[t];//将状态还原!
			cp-=v[t];
		}
	}
}
int main()
{
	int c[]={4,3,5},v[]={5,4,6};
	int m=10;
	knap(c,v,0,m);
	printf("%d/n",bestp);
	return 0;
}```

**任务4:** 完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中。(50分)
posted on 2021-03-31 09:53  杨丽霞  阅读(100)  评论(2编辑  收藏  举报