c语言分支限界法01背包问题_分支限界

67482eefefc6e6c8f27910eb23136684.png

介绍

前面我们学习了回溯法,它的主要思想是不停地探索状态空间,如果遇到不满足条件的解就停止探索,然后回溯到上一个状态,再探索其他的状态,直到探索到问题的解。

回溯的方法的确是一种可行的办法,但是它只能求解像

equation?tex=n -皇后,集合问题这样的
非优化问题,一旦涉及到优化问题它就束手无策了。 因为回溯的过程只会发生在探索过程中不满足限制条件时发生,所以用回溯法求解的问题一般都有多个解,但对于最优问题( 分配问题背包问题等)来讲,满足限制条件的解有很多,我们要做的是从所有满足条件的解中找到最好的那一个,所以我们就有了 分支限界branch and bound)这种方式来帮助我们解决这一类问题。

如何解决

在解决最优问题的时候,我们还是需要构建一棵状态空间树,只是和回溯不同的是,回溯是基于广度优先的方式来扩展空间树中的节点的,而分支限界法是基于深度优先的方式来扩展节点的,也就是说,分支界定法是每次构建出解空间树中一层的全部节点。那么具体该怎么做呢?我们要明白的是,任何一个最优问题都存在一个上界或下界,也就是说,对于求解像最低开销,最短路径这类问题时,一定存在一个下界使得最后问题的解不会低于这个值。相反,如果问题是求解最大收益,那么一定会有一个上界来约束最终的解。

在具体求解的过程中,每探索出一个新的节点(进入新的状态),我们就要计算当前情况下的上界或下界,然后在状态转移(探索下一层节点)的时候选择上界最大或下界最小的节点,这样我们才会更逼近最大或最小值。这样听起来太挺抽象了,我们还是来看一个具体的例子吧。

分配问题

回顾一下我们前面所学过的内容,分配问题的问题描述为

equation?tex=n 件任务分配给
equation?tex=n 名员工,一名员工只能完成一件任务,每名员工做每个任务都有对应的时间开销,我们要优化的问题是怎样使总开销最小。

拿一个具体的实例来看,假设有

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值