限界分支法:队列实现方式

前面已经介绍过限界分支法大部分是基于广度优先搜索,广度优先搜索一般借助于队列实现,剪枝的情况可以借助于优先级队列。

实现如下:

#%%
class FIFO_01_Pack:def __init__(self,N,V,C,W):self.num =Nself.Volume = Vself.Cost = Cself.Value = Wself.BestValue = 0#用于存放活结点,便于理解,把根结点,以及第0层结束标志-1放进去# 结点包括2个属性:当前空间大小,当前的价值大小self.queue = [[0,0],[-1,-1],]  # 实现时叶子结点不加入到活结点列表,当属于叶子结点时,增加对结果的处理def enQueen(self,pair,depth):if depth == self.num -1:CurValue = pair[1]if CurValue > self.BestValue:self.BestValue = CurValueelse:self.queue.append(pair)def pack_01(self):
#        selected = [0]*self.num      # 首先取出根结点depth = 0pair = self.queue.pop(0)CurCost = pair[0]CurValue = pair[1]while True:# 判断左结点能否加入到队列,能的话,把当前空间和当前价值放入队列if CurCost + self.Cost[depth] < self.Volume:self.enQueen([CurCost + self.Cost[depth],CurValue + self.Value[depth]],depth)# 右结点总是可以加入队列的,因为没有约束条件的限制self.enQueen([CurCost,CurValue],depth)# 然后弹出下一个结点pair = self.queue.pop(0)CurCost = pair[0]CurValue = pair[1]# 当同一层处理完毕时,先判断是否能够输出结果,判断的标准是队列是否为空,# 这时下一层的所有结点已经加入了队列,这时需要把下一层# 增加一个结尾-1便于判断,然后进入下一层,弹出下一个结点if CurCost == -1:if not self.queue:return self.BestValueself.enQueen([-1,-1],depth)depth += 1pair = self.queue.pop(0)CurCost = pair[0]CurValue = pair[1]def print_Result(self):print(self.pack_01())

Baseline对比及结果输出:

class pack_01_back_test:        def __init__(self,N,V,C,W):self.num =Nself.V = Vself.C = Cself.W = Wself.BestResult = [False]*Nself.Selected = [False]*Nself.BestValue = 0self.CurCost = 0self.CurValue = 0def pack_01_back_tracking(self,depth):if depth > self.num-1:if self.CurValue > self.BestValue:self.BestValue = self.CurValue               self.BestResult[:] = self.Selected[:]else:if self.CurCost + self.C[depth] <= self.V:self.Selected[depth] = Trueself.CurCost += self.C[depth]self.CurValue  += self.W[depth]# nextself.pack_01_back_tracking(depth+1)# undoself.CurCost -= self.C[depth]self.CurValue  -= self.W[depth]self.Selected[depth] = Falseself.pack_01_back_tracking(depth+1)def print_Result(self):self.pack_01_back_tracking(0)print(self.BestResult)print(self.BestValue)#%%
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]pack_01_back_test(N,V,C,W).print_Result()
FIFO_01_Pack(N,V,C,W).print_Result()[False, True, True, True, False, True, False, True]
39.0
39.0

追踪解

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

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

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

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

  2. 限界分支法(队列方式)追踪解:01背包问题

    追踪解 追踪解,上述实现的情况下,解都在最后一层,根本不知道之前的路径是怎样的,广度优先搜索,同一个纬度,假如不加指标判断的话,根本不知道最优解是选择的哪一个,所以需要同一个纬度的每一个结点,记住他之 ...

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

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

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

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

  5. 分枝限界法/普通队列 01背包问题

    问题 三个物品他们的编号,重量和价值如下.1个背包能够称重30公斤,求装入的物品的最大价值 编号 重量 价值 1 16 45 2 15 25 3 15 25 总结 广度优先搜索解空间树:结点是状态,分 ...

  6. 分支界限算法【0-1背包问题】按照优先队列式(LC)分支限界法求解0-1背包问题, 并给出限界函数,并画出该实例的状态空间树。

    目   录 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 作业题(期末考试必考) 小结 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 解决思路:采用优先队列式分支限界 Ø ...

  7. 01背包问题:回溯法和限界分支、递归和迭代方式

    01背包问题 递归方式模板: void backtrack(int t){ if(t > n) output(x); else{ for(int i = f(n,t); i <= g(n, ...

  8. 从0-1背包问题学习回溯法、分支界限法、动态规划

    一.0-1背包问题的描述 下面将使用回溯法.分支界限法.动态规划法来分析和解决此问题. 二.回溯法 (1)算法步骤 (2)代码如下(没有裁剪函数): 用i和n来判断结束与否,是因为解空间结构是完全二叉 ...

  9. A律十三折线法G711编解码介绍

    A律十三折线法G711编解码介绍 简介 G711国际电信联盟ITU-T定制出来的一套语音压缩标准,主要用于对PCM音频数据编码,将PCM16bit数据压缩为为8Bit,它是主流的波形音频编码器,相当于 ...

最新文章

  1. PHP与MySQL连接菜鸟教程_PHP 连接 MySQL - PHP 教程 - 菜鸟学堂-脚本之家
  2. php 正则表达式验证金额,php 正则表达式验证数字
  3. 卸载全部appx应用(包括应用商店)
  4. 微信小程序打开pdf文件;uni-app下载打开pdf文件;uni-app微信小程序下载打开pdf文件预览;
  5. (王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归
  6. 弱性能穿戴设备App化之Lua For STM32
  7. java类的方法 作用 属性_JAVA:类和对象(秒懂版)
  8. 深度学习与人工智能革命:part IV
  9. 创建data文件_剑指信奥 | C++ 之文件操作
  10. 解决SVN语言包安装后无法出现下拉框选择
  11. 卡尔曼滤波原理学习笔记
  12. 错误排查:packet_write_wait: Connection to XXX XXX XXX XXX port 22: Broken pipe
  13. Android自定义View 实现窗帘控件
  14. 企业微博营销有哪些实战技巧呢?
  15. 水杯如何测试 (测试用例)
  16. 图像处理中像素和毫米的换算
  17. 垃圾清理代码_一招清理电脑垃圾
  18. 上海交通大学计算机科学杨岚青博士,上海交通大学2014年硕士生拟录取名单公示(4)...
  19. BUUCTF MISC刷题笔记(五)
  20. android手机安装ubuntu并创建ubuntu图形界面(1)

热门文章

  1. go 执行sh失败_为容器化的 Go 程序搭建 CI
  2. python正则表达式排除字符_利用正则表达式排除特定字符串
  3. android自定义dialog不显示,Android 自定义的dialog显示不正常呢,怎么回事???
  4. jQuery scroll事件
  5. 【若依(ruoyi)】字典管理
  6. 【oracle】创建DBLink
  7. 诺基亚手机运行linux,Ubuntu携手诺基亚Linux进军手机操作系统将改变市场
  8. 2018一级计算机基础,2018年计算机一级考试计算机基础及Photoshop试题及答案.pdf
  9. php脚本查杀,无敌强大的Shell脚本查杀各种PHP方便之门和Webshell
  10. qt获取图像的每个像素rgb_【可视化-1】认识图像,从图像可视化开始