分支定界法(branch and bound)是一种求解整数规划问题的最常用算法。这种方法不但可以求解纯整数规划,还可以求解混合整数规划问题。分支定界法是一种搜索与迭代的方法,选择不同的分支变量和子问题进行分支。

通常,把全部可行解空间反复地分割为越来越小的子集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称为定界。在每次分枝后,凡是界限超出已知可行解集目标值的那些子集不再进一步分枝,这样,许多子集可不予考虑,这称剪枝。这就是分枝定界法的主要思路。

分支定界法求解整数规划的一般步骤:

设有最大化的整数规划问题A ,与它相对应的松弛问题为 B。

(1)先不考虑原问题的整数约束,求解相应的松弛问题。用图解法或单纯形法求得最优解,记为 。

(2)若求得的最优解 刚好就是整数解,则该整数解就是原整数规划问题的最优解;否则,对原问题进行分枝寻求整数最优解。

(3)分枝。根据对变量重要性的了解,在最优解中选择一个不符合整数约束条件的xj ,其值为bj ,以[bj]表示小于bj 的最大整数。构造两个约束条件: x≤ [bj]和 x≥[bj]+1分别加入原LP问题形成两个子问题,因为[bj] 与[bj]+1之间无整数,故这两个子集内的整数解必定与原可行解集合整数解一致,这一步称为分枝。

(4)定界。首先判断各个子问题是否存在整数解。若存在,找出目标函数值最大对应的整数解,设为Z*,则A问题的整数解目标函数Z≥Z*,这就是定界。而且分枝过程中,一旦有某个子问题Z≥Z*,则令Z*=Z。

(5)若存在大于Z*的子问题则需分枝。第(4)步中若不存在整数解,也需继续分枝寻找整数解,并从目标函数值最大对应的子问题先分枝。

(6)若所有子问题的目标值都小于等于Z*,则不需继续分枝,Z*所对应的整数解即为最优解。

分支定界法求背包问题:

问题:一个容量为10的集装箱,有重量分别为4,8,5的货物,如何才能装最多:

FIFO算法:

1.首先定义best=0

2. 第一层,4被选择,此时的best修改成4,加入到队列中;0<best 计算0节点的最大期望,13>best,加入到队列中。

3.第二层,8被选择,12>10,截枝;4=best,加入到队列中;8>best, 加入到队列,修改best=8,0节点的最大期望小<best,截枝;

4.第三层,修改best即可。

paython代码:

import numpy as np

capacity = 10  # 背包的容量是10
goods = [4, 8, 5] # 货物重量
best = 0 # 最优重量
expect = sum(goods) # 期望值 queue = [0] # 记录每层的节点
layer = 0 # 记录层数 while layer < np.size(goods)-1:
# 取出该层的所有节点,作为下层的父节点
expect = expect - goods[layer] # 修改期望值
parents = np.array(queue)
nowParents = parents + goods[layer]
temp_best = np.max(np.where(nowParents > capacity, 0, nowParents)) # 更新best
if best < temp_best:
best = temp_best # 选择候选集, 截枝操作
nowParents = np.hstack((nowParents, parents))
temp_queue = []
for i in nowParents:
if i + expect > best:
temp_queue.append(i)
queue = temp_queue layer = layer + 1 # 最后一层,计算最优值
parents = np.array(queue)
nowParents = parents + goods[layer] nowParents = np.hstack((nowParents, parents))
best = np.max(np.where(nowParents > capacity, 0, nowParents)) print(best)

参考:https://www.cnblogs.com/shixisheng/p/6034779.html

https://www.cnblogs.com/sage-blog/p/3917836.html

https://blog.csdn.net/zack_liu/article/details/78370537

分支界定( BRANCH-AND-BOUND)的更多相关文章

  1. 干货 | 10分钟搞懂branch and bound(分支定界)算法的代码实现附带java代码

    Outline 前言 Example-1 Example-2 运行说明 00 前言 前面一篇文章我们讲了branch and bound算法的相关概念.可能大家对精确算法实现的印象大概只有一个,调用求 ...

  2. 干货 | 10分钟带你全面掌握branch and bound(分支定界)算法-概念篇

    00 前言 之前一直做启发式算法,最近突然对精确算法感兴趣了.但是这玩意儿说实话是真的难,刚好boss又叫我学学column generation求解VRP相关的内容.一看里面有好多知识需要重新把握, ...

  3. Branch and Bound:分支限界算法

    http://blog.sciencenet.cn/blog-509534-728984.html 分支定界 (branch and bound) 算法是一种在问题的解空间树上搜索问题的解的方法.但与 ...

  4. git 查看远程分支 $ git branch -a

    查看远程分支 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): 1 2 3 4 5 6 7 8 9 10 $ git branch -a master remote ...

  5. Python 实现整数线性规划:分枝定界法(Branch and Bound)

    今天做作业,要实现整数线性规划的分枝定界法算法.找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚.规范,所以在此记录.如有错误,请指正. from scipy.optimize import ...

  6. svn创建分支(branch/tag)出现“path”already exists

    不用在visual svn中创建相应的目录,svn会自己创建目录,但是自己必须指定该目录名称. 比如:

  7. 干货 | 10分钟掌握branch and cut(分支剪界)算法原理附带C++求解TSP问题代码

    00 前言 branch and cut其实还是和branch and bound脱离不了干系的.所以,在开始本节的学习之前,请大家还是要务必掌握branch and bound算法的原理. 01 应 ...

  8. 干货 | 10分钟带你掌握branch and price(分支定价)算法超详细原理解析

    00 前言 相信大家对branch and price的神秘之处也非常好奇了.今天我们一起来揭秘该算法原理过程.不过,在此之前,请大家确保自己的branch and bound和column gene ...

  9. git之remote branch controller(远程分支控制)

    1.创建本地分支 git branch  //查看远程分支 git checkout -b branch_name //创建远程分支 在查看分支git branch 2.将分支提交到远程仓库 此时远程 ...

随机推荐

  1. python模拟蒙特·卡罗法计算圆周率

    蒙特·卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中就包括圆周率近似值的计问题. 假设有一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x, ...

  2. 【Sublime Text】sublime text 安装插件方法总结

    #使用Package Control组件安装插件 1.安装Package Control组件 按 Ctrl+` 调出console(注:避免热键冲突,可以在界面上操作  View-show conso ...

  3. pthread mutex 进程间互斥锁实例

    共享标志 定义 名称 描述 0 PTHREAD_PROCESS_PRIVATE 进程内互斥锁 仅可当前进程内共享 1 PTHREAD_PROCESS_SHARED 进程间互斥锁 多个进程间共享 第一个 ...

  4. 细说java系列之HashMap原理

    目录 类图 源码解读 总结 类图 在正式分析HashMap实现原理之前,先来看看其类图. 源码解读 下面集合HashMap的put(K key, V value)方法探究其实现原理. // 在Hash ...

  5. [算法竞赛入门经典]Ancient Cipher, NEERC 2004,UVa1339

    Description Ancient Roman empire had a strong government system with various departments, including ...

  6. QT背景颜色,菜单颜色更改

    1.进入QT上置菜单栏 工具->选项 2.进入选项中 环境->interface (1)颜色:点击重置是默认颜色,想修改其他颜色,点击重置旁边的颜色自行选择. (2)Theme:这个里面提 ...

  7. C#解压文件,Excel操作

    /// <summary> /// 获取目录下文件路径 /// </summary> /// <param name="path"></p ...

  8. Python:匿名函数lambda的函数用法和排序用法

    一.介绍: Lambda函数,是一个匿名函数,创建语法: lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数. exp ...

  9. sql注入--双查询报错注入

    sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...

  10. pandas基础用法

    首先生成一维数组 data = pd.Series([1,2,3,4,5,6,7,8,9])data运行结果 data.head()#默认取前五条,当然也可以加参数 data.tail()#默认取前五 ...