回溯法

问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。
只要是解可以描述成向量方式的,就可以使用回溯法,不断的扩张部分向量,向下深入的过程就是,从部分解到可行解的过程。
解必须满足多米诺性质:
可行解满足约束–>部分解满足约束
逆否为:部分解不满足约束–>可行解不满足约束

这样可以用来pruning。

最简单的回溯,解空间为二叉树,又叫子集树

递归方式实现的框架如下:

void backtrack(int t){   if(t > n) output(x);   else{   for(int i = f(n,t); i <= g(n,t);i++){   x[t] = h(i);   if(constraint(t) && bound(t)) backtrack(t+1);   }   }
}

实现代码如下:

def pack_01_back(N,V,C,W):BestResult = [0]*Nx = [0]*NBestValue = [0]CurCost = [0]CurValue = [0]def pack_01_back_tracking(depth):# 递归出口if depth > N-1:if CurValue[0] > BestValue[0]:BestValue[0] = CurValue[0]# x为可行解,在叶子处把可行解记录下来BestResult[:] = x[:]print BestResultprint BestValue# 注意else的含义else:for i in range(2):x[depth] = iif i == 0:pack_01_back_tracking(depth+1)else:if CurCost[0] + C[depth] <= V:CurCost[0] += C[depth]CurValue[0]  += W[depth]pack_01_back_tracking(depth+1)# 回溯时的处理,就是往上回溯时,要把吃进去的吐出来CurCost[0] -= C[depth]CurValue[0]  -= W[depth]pack_01_back_tracking(0)return BestResult,BestValue

迭代方式实现

顺序执行流程图如下

代码如下

注意不剪枝,回溯是在最底部,回溯到最后放入的那个物品

#%%
def pack_01_back_iteration2(N,V,C,W):depth = 0 BestResult = [False]*NSelected = [False]*(N)BestValue = 0CurCost = 0CurValue = 0    while True:if depth < N:if CurCost + C[depth] <= V:Selected[depth] = TrueCurCost += C[depth]CurValue  += W[depth]# 回溯是处于底部    else:if CurValue > BestValue:BestValue = CurValue                BestResult[:] = Selected[:]# 到底部时,已经超了一个depth -=1while depth >= 0 and not Selected[depth]:depth -=1# 回溯到root退出if depth < 0:break# undoelse:Selected[depth] =FalseCurCost -= C[depth]CurValue  -= W[depth]depth +=1return BestResult,BestValue#%%
def pack_01_back_iteration(N,V,C,W):depth = 0BestResult = [False]*NSelected = [False]*(N)BestValue = 0CurCost = 0CurValue = 0while depth >= 0:while depth < N: if CurCost + C[depth] <= V:Selected[depth] = TrueCurCost += C[depth]CurValue  += W[depth]depth +=1else:Selected[depth] = Falsedepth +=1if CurValue > BestValue:BestValue = CurValue                BestResult[:] = Selected[:N]depth -=1while depth > 0 and Selected[depth] == 0:depth -=1if Selected[depth] ==1:Selected[depth] =FalseCurCost -= C[depth]CurValue  -= W[depth]depth +=1if depth == 0:breakreturn BestResult,BestValue

运行结果:

#%%
N = 8
V = 30
C = [11,2,3,9,13,6,15,7,19]
W = [5,2,5,7,5,11,6,14]print pack_01_back(N,V,C,W)
print pack_01_back_iteration(N,V,C,W)
print pack_01_back_iteration2(N,V,C,W)runfile('/root/test/back_tracking.py', wdir='/root/test')
([False, True, True, True, False, True, False, True], [39])
([False, True, True, True, False, True, False, True], 39)
([False, True, True, True, False, True, False, True], 39)

回溯法解决01背包问题相关推荐

  1. 回溯法解决0-1背包问题

    回溯法解决0-1背包问题 参考文章: (1)回溯法解决0-1背包问题 (2)https://www.cnblogs.com/womendouyiyang/p/10957527.html (3)http ...

  2. c语言 用回溯算法解决01背包问题,回溯法解决01背包问题

    <回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...

  3. python 回溯法 01背包问题_回溯法解决01背包问题

    回溯法是一个既带有系统性又带有跳跃性的搜索算法. 它在包含问题的所有解的解空间树中按照 深度优先的策略, 从根节点出发搜索解空间树. 算法搜索至解空间树的任一节点时, 总是先判断 该节点是否肯定不包含 ...

  4. 定义输入回溯法解决0-1背包问题

    本文是一篇关于定义输入的帖子 对于每一个物品i,对于该物品只有选与不选2个决策,总共有n个物品,可以次序顺次斟酌每个物品,这样就形成了一棵解空间树:基本思想就是遍历这棵树,以枚举全部情况,最后停止判断 ...

  5. python 回溯法 01背包问题_Python回溯法解决01背包问题

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. C++~回溯+贪心法解决01背包问题

    C++~回溯+贪心法解决01背包问题 参考文章: (1)C++~回溯+贪心法解决01背包问题 (2)https://www.cnblogs.com/rimochiko/p/8168638.html 备 ...

  7. 回溯法求解0-1背包问题

    回溯法求解0-1背包问题时比较随机序列和按 v/w 降序排列的算法 问题描述: 针对0-1背包问题,尝试用回溯法. 物品总数N=10,背包容量 C=26, 物品的重量数组为w={7,3,10,12,1 ...

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

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

  9. 回溯法求解0-1背包问题(细节分析)

    回溯法求解0-1背包问题(细节分析) 论temp数组的必要性和判断cv>bestv的不必要性 回溯法 应用回溯法求解问题时,首先应明确定义问题的解空间,该解空间应至少包含问题的一个最优解.例如, ...

最新文章

  1. apache用户认证
  2. 多播泡妞宝典---IGMP
  3. 移动应用程序框架Kendo UI Mobile发布R2 2016 SP2
  4. Yii --Command 任务处理
  5. python学习笔记(二十七)多线程与多进程
  6. 死磕Android_App 启动过程(含 Activity 启动过程)
  7. 直流电机驱动电路设计
  8. 线性方程组matlab解法,线性方程组解法及其MATLAB实践
  9. 论文笔记:Deep Object Co-Segmentation(ACCV2018)
  10. 马斯克让位?特斯拉中国一把手被曝将接任全球CEO,内部回应:您觉得是真的吗?...
  11. 7.3 数字化的资产管理
  12. 游记_秦皇岛-北戴河两日游
  13. WebP 文件及其编码解码工具(WebPconv)
  14. WebLogic启动服务卡住报错 :Server started in RUNNING mode
  15. DDD微服务架构设计第四课 DDD指导微服拆分和落地实现
  16. Mycat2分库分表
  17. 一摞烙饼的排序问题--读书笔记(2)
  18. linux系统新硬盘格式化,linux系统如何格式化一块硬盘?
  19. day42--哈希表
  20. vue中如何引入指定字体并且使用

热门文章

  1. main java game,playgame 一个JAVA编写的飞行小游戏,有基本完整的 框架,适合初学者参照学习 Other s 其他 238万源代码下载- www.pudn.com...
  2. 计算机组成原理实验七,计算机组成原理实验七.doc
  3. mac java sh_怎么在Mac上下载java?
  4. redis value多大会影响性能_redis面试总结
  5. python绘制蝴蝶曲线_如何编程实现蝴蝶函数曲线
  6. html js不触发_图文详解鼠标事件CSS:hover和JS:mouseover的区别
  7. 抖音计算机音乐你要我,抖音上很火的我要你快乐我要你快乐是什么歌?
  8. 两根硬铜线并线接插座_高级电工原来都这样接电线,手法还没见过,我也立马学...
  9. java uri_Android中的Uri与Java中的URI类
  10. 【Centos 8】【Centos 7】【Docker】 安装 RabbitMQ