目录

  • 实验内容
  • 实验目的
  • 实验结果
    • 步骤1:描述与分析
    • 步骤2:策略以及数据结构
    • 步骤3
    • 步骤4
    • 步骤5
    • 步骤6
  • 实验总结

实验内容

本实验要求基于算法设计与分析的一般过程(即待求解问题的描述、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和思想以及求解步骤。求解的问题为0-1背包。

作为挑战:可以考虑回溯法在其他问题(如最大团问题、旅行商、图的m着色问题)。

实验目的

  • 理解回溯法的核心思想以及求解过程(确定解的形式及解空间组织,分析出搜索过程中的剪枝函数即约束函数与限界函数)。
  • 掌握对几种解空间树(子集树、排列数、满m叉树)的回溯方法。
  • 从算法分析与设计的角度,对0-1背包问题的基于回溯法求解有更进一步的理解。

实验结果

步骤1:描述与分析

给定n种物品和一个背包。物品\(i\)的重量是\(w_i\) ,其价值为\(v_i\),背包的容量为W。一种物品要不全部装入背包,要不不装入背包,不允许部分物品装入的情况。装入背包的物品的总重量不能超过背包的容量,在这种情况下,问如何选择转入背包的物品,使得装入背包的物品的总价值最大?需要采用回溯的方法进行问题的求解。

分析:

(1)问题的解空间:

将物品装入背包,有且仅有两个状态。第\(i\)种物品对应\((x_1,x_2,...,x_n)\),其中\(x_i\)可以取0或1,分别代表不放入背包和放入背包。解空间有\(2^n\)种可能解,也就是\(n\)个元素组成的集合的所有子集的个数。采用一颗满二叉树来讲解空间组织起来,解空间树的深度为问题的规模\(n\)。

(2)约束条件:
\[ \sum_{i=1}^nw_ix_i \le W \]
(3)限界条件:

0-1背包问题的可行解不止一个,而目标是找到总价值最大的可行解。因此需要设置限界条件来加速找出最优解的速度。如果当前是第t个物体,那么1-t物体的状态都已经被确定下来,剩下就是t+1~n物体的状态,采用贪心算法计算当前剩余物品所能产生的最大价值是否大于最优解,如果小于最优解,那么被剪枝掉。

步骤2:策略以及数据结构

采用回溯法进行问题的求解,也就是具有约束函数/限界条件的深度优先搜索算法。

采用回溯法特有框架:

回溯算法()如果到达边界:记录当前的结果,进行处理如果没有到达边界:如果满足限界条件:(左子树)进行处理进行下一层的递归求解将处理回退到处理之前如果不满足限界条件:(右子树)进行下一层递归处理

步骤3

描述算法。希望采用源代码以外的形式,如伪代码或流程图等;

伪代码:

递归式回溯算法:

BACKTRACK-REC(t)     //t为扩展结点在树中所处的层次if t > n                                    //已到叶子结点,输出结果OUTPUT(x) //检查扩展结点的每个分支。s(n,t)与e(n,t)分别为当前扩展结点处未搜索过//的子树的起始编号和终止编号else for i from s(n,t) to e(n,t)x[t] = h(i)          //  h[i]: 在当前扩展结点处 x[t]的第i个可选值if CONSTRAINT(t) && BOUND(t) //约束函数与限界函数BACKTRACK-REC(t+1) //进入t+1层搜索

迭代式回溯算法:

BACKTRACK-ITE()t = 1            //t为扩展结点在树中所处的层次while t > 0:if s(n,t) <= e(n,t) for i from s(n,t) to e(n,t) do x[t] = h(i)   //h[i]: 在当前扩展结点处x[t]的第i个可选值if CONSTRINT(t) && BOUND(t)  //满足约束限界条件if t > n      //已到叶子结点,输出结果OUTPUT(x);else t ++        //前进到更深层搜索elset --               //回溯到上一层的活结点

步骤4

算法的正确性证明。需要这个环节,在理解的基础上对算法的正确性给予证明

回溯算法适用条件:多米诺性质

假设解向量是n维的,则下面的k满足:\(0<k<n ,P(x_1,x_2,x_3,…,x_{k+1})\)为解的部分向量可以推得\(P(x_1,x_2,x_3,…,x_k)\)也为解的部分向量

在0-1背包问题中,解空间为:\((x_1,x_2,...,x_n)\), 如果当前结果\(P_1 = (x_1,x_2,...,x_n)\)是最优解,那么\(P_2=(x_1,x_2,...,x_{n-1})\)的时候,也就是减少一个物品但不改变背包容量的时候,可以想到\(P_2\)依然是该问题的最优解。从子集树角度来看,也就是最后一层结点全部去掉后的结果,那么当前结果也是最优的。

步骤5

算法复杂性分析,包括时间复杂性和空间复杂性;

算法的复杂性分析:

时间复杂度:\[ T(n)=O(2^n)+O(n2^n)+O(nlog(n)) = O(n2^n)\]

空间复杂度:\[O(nlog(n))\]

步骤6

算法实现与测试。附上代码或以附件的形式提交,同时贴上算法运行结果截图;

# -*- coding: utf-8 -*-
"""
Created on Mon Oct 22 08:49:13 2018
@author: pprp
"""
BV=0  # best value
CW=0  # current weight
CV=0  # current value
BX=None # best x resultdef output(x):for i in x:print(" ",i,end="")print()class node(object):def __init__(self,v,w):self.v = vself.w = wself.per = float(v)/float(w)def Bound(t):print("bound:",t)LC = c-CW # left CB = BV # best value#sortnodes = []for i in range(n):nodes.append(node(v[i],w[i]))nodes.sort(key=lambda x:x.per,reverse=True)# 装入背包while t < n and w[t] <= LC:LC -= w[t]B += v[t]t += 1if t < n:B += float(v[t])/float(w[t]) * LCreturn Bdef backtrack(t,n):"""当前在第t层"""print("current:",t)global BV,CV,CW,x,BXif t >= n:if BV < CV:BV=CVBX=x[:]else:if CW+w[t] <= c: # 搜索左子树,约束条件x[t]=TrueCW += w[t]CV += v[t]backtrack(t+1,n)CW -= w[t]CV -= v[t]if Bound(t) > BV: # 搜索右子树x[t]=False      backtrack(t+1,n)if __name__ == "__main__":n=10c=10x=[False for i in range(n)]w=[2,2,6,5,4,4,3,4,6,3]v=[6,3,5,4,6,2,8,3,1,7]backtrack(0,n)print("Best Value :",BV)print("Best Choice:",BX)

运行结果:

验证:6+3+8+7=24

实验总结

回溯法的思想:

能进则进,不进则换,不换则退.

回溯算法的框架:

以DFS的方式进行搜索,在搜索的过程中用剪枝条件(限界函数)避免无效搜索。约束函数,在扩展结点处剪去得不到可行解的子树;限界函数:在扩展结点处剪去得不到最优解的子树。

回溯算法求解问题的一般步骤:

1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。

2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。

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

常用剪枝函数:
    用约束函数在扩展结点处剪去不满足约束的子树;
    用限界函数剪去得不到最优解的子树。

子集树、满m叉树、排列树区别:

子集树:从n个元素的集合S中找到满足某种性质的子集时,相应的解空间树就成为了子集树(典型问题:01背包问题)

满m叉树:所给问题中每一个元素均有m中选择,要求确定其中的一种选择,使得对这n个元素的选择结果组成的向量满足某种性质(经典问题:图的m着色问题)

排列树:从n个元素的排列树中找出满足某种性质的一个排列的时候,相应的解空间树称为排列树(经典问题:TSP问题,n皇后问题)

转载于:https://www.cnblogs.com/pprp/p/9880073.html

【算法分析】实验 4. 回溯法求解0-1背包等问题相关推荐

  1. 回溯法求解0 1背包的优化

    优化方法:  剪枝一:可以进行剪枝,因为很多情况是没有意义的,当重量大于背包容量的时候,没有必要对剩下的物品再来决策了. 剪枝二:将剩下的所有物品都选取其总价值也没有目前已经求得的方案的价值还大的话, ...

  2. java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题

    [TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...

  3. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  4. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  5. 算法分析五:回溯法与分⽀限界法

    一.回溯法 1. 基本思想与解题步骤 基本思想: 把问题的解空间转化成了图或者树的结构表⽰,然后使⽤深度优先搜索策略进⾏遍历,遍历的过程中记录和寻找所有可⾏解或者最优解. 解题步骤: 针对所给问题,定 ...

  6. 回溯法求解消消乐实验

    回溯法求解消消乐问题 实验概述 掌握回溯法设计思想. 掌握消消乐问题的回溯法解法. <开心消消乐>是一款乐元素研发的三消类休闲游戏.游戏中消除的对象为小动物的头像,包括小浣熊.小狐狸.小青 ...

  7. 回溯法解决tsp问题 matlab,回溯法求解tsp问题

    回溯法以这种工作方式递归地在解空间中搜索, 直至找到所 要求的解或解 空间中已无活结点时为止. 回溯法求解 TSP 问题,首先把所有的顶点的访问标志初始化为 0,...... 回溯法求解 TSP 问题 ...

  8. 回溯法求解N皇后问题及其时间复杂度分析

    回溯法求解N皇后问题及其时间复杂度分析 一.回溯法简介 1. 什么是回溯法? 2. 回溯法的时间复杂度分析 蒙特卡罗方法 蒙特卡罗方法在回溯法求解时间复杂度中的应用 二.回溯法求解N皇后问题 1. 回 ...

  9. 回溯法 | 求解装载问题

    问题描述: 有 n 个集装箱要装上一艘载重量为 W 的轮船,其中集装箱 i (1<=i<=n) 的重量,为wi.子啊装在体积不受限制的情况下,将尽可能重的集装箱装上轮船,当重量相同时要求选 ...

最新文章

  1. MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
  2. 虚拟机CENTOS7下 安装8.0版本MySQL MySQL主从配置详细~
  3. Activiti Explorer 源码浅析
  4. 如何查看,当运行一个hibernate 方法后到底执行了哪些SQL语句
  5. dpkg安装deb缺少依赖包的解决方法
  6. Modify批量处理优化
  7. 绝命沙虫 精度,double,模拟 牛客白月赛44
  8. com 组件调用不起来_一文读懂Eureka,Feign,Ribbon,Hystrix,Zuul核心组件间的关系...
  9. ip 地址 192.168.1.255 代表( )。_判定IP地址合法性的三种方法
  10. .net core实践系列之SSO-同域实现
  11. 蜂窝注册表和永久存储
  12. mysql的增_MySQL之增_insert-replace
  13. 傲游浏览器新浪微博插件v2发布
  14. houdini_通过卡通了解CSS Houdini的指南
  15. OpenGL基础3:渲染管线
  16. Android权威编程指南读书笔记(1-2章)
  17. 管理感悟:计划是给谁看的
  18. 【day4】【洛谷算法题】-P5708三角形面积-刷题反思集[入门1顺序结构]
  19. Java基础教程-01-Java简介与变量介绍
  20. SiT3373:220 -725MHz 低抖动压控差分振荡器VCXO

热门文章

  1. 使用jMeter构造逻辑上有依赖关系的一系列并发请求
  2. 在ubuntun虚拟机里安装goLang语言编程环境
  3. mysql数据库的事物日志在哪里_mysql数据库中事务日志的作用
  4. java array 元素的位置_java中的两种排序工具Arrays和Collections的使用
  5. tomcat怎么平滑更新项目_tomcat_deploy 平滑启动脚本
  6. 锁相环PLL/MMCM的使用
  7. java 输出编码_从代码看java输入输出中的编码和解码
  8. linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...
  9. 计算机技术的应用 课件,计算机技术及应用基础――第二章ppt课件
  10. onpagefinished等了很久才执行_其实,无所事事的日子才过得最累