201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告

项目 内容
课程班级博客链接 班级博客
这个作业要求链接 作业要求
我的课程学习目标 1.学习编写PSP
2.完成个人项目实验要求
3.在Github建仓
这个作业在哪些方面帮助我实现学习目标 1.首次编写PSP,更好的分割利用时间
2.对项目进行模块化处理,简单化复杂问题
3.Github建仓对项目进行托管
项目Github的仓库链接地址 https://github.com/krypton052/lsp_mode

实验二

任务1——点评班级博客中至少3份作业

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

个人开发流程(PSP)

PSP2.1 任务内容
planing 计划
· Estimate · 估计这个任务需要多少时间,并规划大致工作步骤
Development 开发
· Analysis 需求分析 (包括学习新技术)
· Design Spec · 生成设计文档
· Design Review · 设计复审 (和同事审核设计文档)
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)
· Design · 具体设计
· Coding · 具体编码
· Code Review · 代码复审
· Test · 测试(自我测试,修改代码,提交修改)
Reporting 报告
· Test Report · 测试报告
· Size Measurement · 计算工作量
· Postmortem & Process Improvement Plan · 事后总结 ,并提出过程改进计划

PSP特点

  • 不局限于某一种软件技术,而是着眼于软件开发的流程。
  • 不依赖于考试,而是依赖工程师自己收集数据,然后分析,提高。
  • 在小型、初创的团队中,很难找到高质量的项目需求,这意味着给程序员的输入质量不高,在这种情况下,程序员的输入(程序/软件)往往质量也不高,然而这并不能全由程序员负责。
  • PSP依赖于数据。
    • 需要工程师输入数据,记录工程师的各项活动,这本身就需要不小的时间代价。
    • 如果数据不准确或有遗失,怎么办?
    • 如何保证工程师如实记录数据?
  • PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。工程师如果开发一款不受顾客喜欢的软件,那么这位工程师是否优秀?

任务3——项目开发

需求分析

  • 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文件;

项目背景

  • 题目描述

    给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi,应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?

  • 总体思路

    • 动态规划法

      在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。应用动态规划法有如下递推关系式:

      • j<w(i) V(i,j)=V(i-1,j)
      • j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
    • 回溯法

      通过上面的方法可以求出背包问题的最优解,但还不知道这个最优解由哪些商品组成,故要根据最优解回溯找出解的组成,根据填表的原理可以有如下的寻解方式:

      • V(i,j)=V(i-1,j)时,说明没有选择第i 个商品,则回到V(i-1,j)
      • V(i,j)=V(i-1,j-w(i))+v(i)时,说明装了第i个商品,该商品是最优解组成的一部分,随后我们得回到装该商品之前,即回到V(i-1,j-w(i))
      • 一直遍历到i=0结束为止,所有解的组成都会找到

设计实现

动态规划法部分

public void solve() {
        for(int i=1;i<numOfItems+1;i++) {
            for(int w=1;w<capacityOfKnapsack+1;w++) {
                int notTakingItem = knapsackTable[i-1][w];		
                int takingItem = 0;
                if(weights[i]<=w) {
                    takingItem = values[i]+knapsackTable[i-1][w-weights[i]];
                }

                knapsackTable[i][w] = Math.max(notTakingItem, takingItem);
            }
        }
        totalBenefit = knapsackTable[numOfItems][capacityOfKnapsack];
    }

散点图部分

public void showAttr(LinkedList ac_cnlList,ArrayList all) {  
        
        DefaultXYDataset xydataset = new DefaultXYDataset(); 
        
          
        StandardChartTheme mChartTheme = new StandardChartTheme("CN");  
        
        mChartTheme.setExtraLargeFont(new Font("黑体", Font.BOLD, 20));  
          
        mChartTheme.setLargeFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
      
        mChartTheme.setRegularFont(new Font("宋体", Font.CENTER_BASELINE, 15));  
          
        ChartFactory.setChartTheme(mChartTheme);  
        
        
    	for(int l = 0; l < all.size(); l++){
		
			int size = ((Set) all.get(l)).size();
			double [][]datas = new double[2][size];
			int m =0;
			for(Iterator it = ((Set) all.get(l)).iterator();it.hasNext();m++){
				HashMap line = ((HashMap)ac_cnlList.get((Integer) it.next()));
				double AC = (Double) line.get("AC");
				double CNL =  (Double) line.get("CNL");
				datas[0][m] = AC;    
				datas[1][m] = CNL;   
			
			}
			xydataset.addSeries(l, datas);  
			
		}
 
        JFreeChart chart = ChartFactory.createScatterPlot("k2 =10,k3=20,kernel=2", "GR", "CNL", xydataset, PlotOrientation.VERTICAL, true, false, false);  
        ChartFrame frame = new ChartFrame("散点图", chart, true);  
        chart.setBackgroundPaint(Color.white);    
        chart.setBorderPaint(Color.GREEN);    
        chart.setBorderStroke(new BasicStroke(1.5f));    
        XYPlot xyplot = (XYPlot) chart.getPlot();    
    
        xyplot.setBackgroundPaint(new Color(255, 253, 246));    
        ValueAxis vaaxis = xyplot.getDomainAxis();    
        vaaxis.setAxisLineStroke(new BasicStroke(1.5f));    
    
        ValueAxis va = xyplot.getDomainAxis(0);    
        va.setAxisLineStroke(new BasicStroke(1.5f));    
    
        va.setAxisLineStroke(new BasicStroke(1.5f)); 	       
        va.setAxisLinePaint(new Color(215, 215, 215));      
        xyplot.setOutlineStroke(new BasicStroke(1.5f));      
        va.setLabelPaint(new Color(10, 10, 10));            
        va.setTickLabelPaint(new Color(102, 102, 102));      
        ValueAxis axis = xyplot.getRangeAxis();    
        axis.setAxisLineStroke(new BasicStroke(1.5f));    
    
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot    
                .getRenderer();    
        xylineandshaperenderer.setSeriesOutlinePaint(0, Color.WHITE);    
        xylineandshaperenderer.setUseOutlinePaint(true);    
        NumberAxis numberaxis = (NumberAxis) xyplot.getDomainAxis();    
        numberaxis.setAutoRangeIncludesZero(false);    
        numberaxis.setTickMarkInsideLength(2.0F);    
        numberaxis.setTickMarkOutsideLength(0.0F);    
        numberaxis.setAxisLineStroke(new BasicStroke(1.5f));    
          
        frame.pack();  
        frame.setVisible(true);  
    } 

PSP

PSP2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
planing 计划 10 15
· Estimate · 估计这个任务需要多少时间,并规划大致工作步骤 10 15
Development 开发 600 725
· Analysis 需求分析 (包括学习新技术) 10 10
· Design Spec · 生成设计文档 10 10
· Design Review · 设计复审 (和同事审核设计文档) 10 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
· Design · 具体设计 30 30
· Coding · 具体编码 250 350
· Code Review · 代码复审 60 70
· Test · 测试(自我测试,修改代码,提交修改) 200 215
Reporting 报告 50 80
· Test Report · 测试报告 10 15
· Size Measurement · 计算工作量 10 15
· Postmortem & Process Improvement Plan · 事后总结 ,并提出过程改进计划 30 50

任务4——完成任务3的程序开发,将项目源码的完整工程文件提交到你注册Github账号的项目仓库中

posted @ 2021-03-31 15:32  201871030131-谢林江  阅读(146)  评论(1编辑  收藏  举报