追踪解

追踪解,上述实现的情况下,解都在最后一层,根本不知道之前的路径是怎样的,广度优先搜索,同一个纬度,假如不加指标判断的话,根本不知道最优解是选择的哪一个,所以需要同一个纬度的每一个结点,记住他之前的路径,才能在最优解的时候之前是怎么走过来的,每一个结点用一个数组记录路径,这样实现的感觉消耗有点大啊,通常看见是采用链表方式

限界分支法本质还是空间树,树的话,还是用链表实现比较容易和直观

把之前实现基于数组的形式修改成结点链表方式

实现如下:

#%%
# 修改成结点,为了追踪解,新增两个变量,是否选择物品和前一个物品的结点
class Node:def __init__(self, CurCost=None,CurValue=None,Flag=None,parent=None):# 部分解所占体积self.CurCost = CurCost# 部分解所占价值self.CurValue = CurValue# 当前结点是否选择了物品self.isleft = Flag# 前一个结点是谁self.parent = parentclass FIFO_01_Pack_with_solution_tracking:def __init__(self,N,V,C,W):self.num =Nself.Volume = Vself.Cost = Cself.Value = W# 存放最优解self.BestResult = [False]*N
#       最优解结点,这里是叶子结点self.BestNode = Node(0,0,False,None)#用于存放活结点,便于理解,把根结点,以及第0层结束标志-1放进去# 结点包括2个属性:当前空间大小,当前的价值大小self.queue = [Node(0,0,False,None),Node(-1,-1,False,None),]  # 实现时叶子结点不加入到活结点列表,当属于叶子结点时,增加对结果的处理def enQueen(self,node,depth):if depth == self.num -1:CurValue = node.CurValueif CurValue > self.BestNode.CurValue:self.BestNode.CurValue = CurValueself.BestNode.isleft = node.isleftself.BestNode.parent = node.parent               else:self.queue.append(node)def pack_01(self):
#        selected = [0]*self.num      # 首先取出根结点depth = 0node = self.queue.pop(0)CurCost = node.CurCostCurValue = node.CurValuewhile True:# 判断左结点能否加入到队列,能的话,把当前空间和当前价值放入队列if CurCost + self.Cost[depth] < self.Volume:# 这时的父节点就是nodeself.enQueen(Node(CurCost + self.Cost[depth],CurValue + self.Value[depth],True,node),depth)# 右结点总是可以加入队列的,因为没有约束条件的限制self.enQueen(Node(CurCost,CurValue,False,node),depth)# 然后弹出下一个结点node = self.queue.pop(0)CurCost = node.CurCostCurValue = node.CurValue# 当同一层处理完毕时,先判断是否能够输出结果,判断的标准是队列是否为空,# 这时下一层的所有结点已经加入了队列,这时需要把下一层# 增加一个结尾-1便于判断,然后进入下一层,弹出下一个结点if CurCost == -1:if not self.queue:return self.BestNode.CurValueself.enQueen(Node(-1,-1,False,None),depth)depth += 1node = self.queue.pop(0)CurCost = node.CurCostCurValue = node.CurValuedef solution_Tracking(self):#追踪解从self.BestNode开始追踪for j in range(self.num-1,-1,-1):self.BestResult[j] = self.BestNode.isleftself.BestNode = self.BestNode.parentreturn self.BestResultdef print_Result(self):print(self.pack_01())print(self.solution_Tracking())N = 8
V = 30
C = [11,2,3,9,13,6,15,7,19]
W = [5.0,2.0,5.0,7.0,5.0,11.0,6.0,14.0]FIFO_01_Pack_with_solution_tracking(N,V,C,W).print_Result()39.0
[False, True, True, True, False, True, False, True]

限界分支法(队列方式)追踪解:01背包问题相关推荐

  1. 限界分支法(实际上没有剪枝,介绍的是广度优先搜索):01背包问题,队列实现方式(FIFO)

    限界分支法:队列实现方式 前面已经介绍过限界分支法大部分是基于广度优先搜索,广度优先搜索一般借助于队列实现,剪枝的情况可以借助于优先级队列. 实现如下: #%% class FIFO_01_Pack: ...

  2. 货郎问题:回溯法和限界分支法

    这个问题可以堪称一个全排列,[起点,剩下的全排列] 回溯法 import numpy as npclass backtracking_Traveling_saleman:# 初始化,明确起点def _ ...

  3. 探讨与研究——动态规划算法、回溯法、分支限界法解0-1背包问题

    一个人终归是要成长的,是要不断历练的,没有人可以安安稳稳一辈子.就算是最有地位最有钱的人也要不断追求.不断历练.不断提升自己. 人的学问少时在不断学习,青年时期不断实践.随着时间推移,到了老年终有所成 ...

  4. python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

    本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...

  5. 限界分支法:01背包问题,优先级队列(包含解的追踪)

    前面提到: 不知道大家注意到没有?上述实现方式没有使用单位体积价值的排序,和之前提到01背包回溯法基于单位体积价值实现不一样(先装单位体积价值高的). 我们网上经常看到都是基于以上实现的,到底这个用有 ...

  6. 限界分支法优先级队列方式出口和追踪解的两种方法总结

    在优先级队列分支限界法法中,何时为出接口,也就是while循环何时退出了? 解空间为[0,1,2-,n-1],当depth = n-1时,就可以记录结果了,可以考虑循环体退出了(实际上能不能出,还要看 ...

  7. 回溯法解01背包问题(最通俗易懂,附C++代码)

    问题描述: 01背包问题是算法中的经典问题,问题描述如下: 对于给定的N个物品,第i个物品的重量为Wi,价值为Vi,对于一个最多能装重量C的背包,应该如何选择放入包中的物品,使得包中物品的总价值最大? ...

  8. DFS解01背包问题

    01背包问题的DFS解法 直接dfs未剪枝代码 时间复杂度 O(2n^nn),其原因是对任意的物品,都是选或者不选(两次的情况) dfs三个形参 物品序号index,放进背包的重量sumW,以及放进背 ...

  9. 算法题解:动态规划解0-1背包问题

    概述 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问 ...

最新文章

  1. 好分数a1a5_好分数怎么查看班级排名 七年级学生成绩查询
  2. 并行算法设计与性能优化_CME 323: 分布式算法与优化(1)
  3. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨游戏玩法分析 V【难度困难】
  4. Sublime text 2按Ctrl+`无法调出console的可能问题
  5. Django 实现用户认证set_Cookie
  6. 饥饿的时候我想起的小食
  7. 消息服务器mq集群出现假死,排查tomcat项目假死原因的简单方法
  8. Xcode 快捷键大全 2020 - 持续更新
  9. 怎么测试电脑的机械硬盘或SSD固态硬盘的读写速度?
  10. 计算机WIN7动态硬盘分区,win7电脑硬盘分区的具体操作方法
  11. Atitit 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc
  12. iOS最新面试题(一)
  13. Linux kali系统使用fcrackzip/rarcrack破解zip/rar(或者zip 7z)类型的加密压缩文件
  14. 数据库常用的sql语句名称大全
  15. 数据库系统--码,超码,候选码,主属性,非主属性,主码,全码,外码基本概念
  16. SQL和Python 哪个更容易自学?
  17. Web前端学习6个有效果软件,你值得拥有!
  18. python+selenium实现微博登录和自动评论
  19. ios 按钮下面加下划线_iOS开发UILabel和UIButton添加下划线
  20. CGB2109-Day01

热门文章

  1. PHP中的json_encode和json_decode
  2. 歪歪协议服务器,YY 2015 逆向分析-底层通讯机制
  3. python pip全称_Python pip 安装与使用
  4. swiper用loop不出图片_swiper实现双向控制
  5. Linux多进程拷贝fork,浅析linux中fork函数
  6. centos mysql php tomcat_centos 一键部署安装nginx,mysql,php,apache,tomcat,redis等包合集
  7. c/c++格式化字符串的标识
  8. gzip android,怎么在Android系统中使用gzip进行数据传递
  9. mysql jdbc url设置时区
  10. spring cloud bus AMQP学习笔记