Python 实现整数线性规划:分枝定界法(Branch and Bound)
今天做作业,要实现整数线性规划的分枝定界法算法。找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚、规范,所以在此记录。如有错误,请指正。
from scipy.optimize import linprog
import numpy as np
import math
import sys
from queue import Queueclass ILP():def __init__(self, c, A_ub, b_ub, A_eq, b_eq, bounds):# 全局参数self.LOWER_BOUND = -sys.maxsizeself.UPPER_BOUND = sys.maxsizeself.opt_val = Noneself.opt_x = Noneself.Q = Queue()# 这些参数在每轮计算中都不会改变self.c = -cself.A_eq = A_eqself.b_eq = b_eqself.bounds = bounds# 首先计算一下初始问题r = linprog(-c, A_ub, b_ub, A_eq, b_eq, bounds)# 若最初问题线性不可解if not r.success:raise ValueError('Not a feasible problem!')# 将解和约束参数放入队列self.Q.put((r, A_ub, b_ub))def solve(self):while not self.Q.empty():# 取出当前问题res, A_ub, b_ub = self.Q.get(block=False)# 当前最优值小于总下界,则排除此区域if -res.fun < self.LOWER_BOUND:continue# 若结果 x 中全为整数,则尝试更新全局下界、全局最优值和最优解if all(list(map(lambda f: f.is_integer(), res.x))):if self.LOWER_BOUND < -res.fun:self.LOWER_BOUND = -res.funif self.opt_val is None or self.opt_val < -res.fun:self.opt_val = -res.funself.opt_x = res.xcontinue# 进行分枝else:# 寻找 x 中第一个不是整数的,取其下标 idxidx = 0for i, x in enumerate(res.x):if not x.is_integer():breakidx += 1# 构建新的约束条件(分割new_con1 = np.zeros(A_ub.shape[1])new_con1[idx] = -1new_con2 = np.zeros(A_ub.shape[1])new_con2[idx] = 1new_A_ub1 = np.insert(A_ub, A_ub.shape[0], new_con1, axis=0)new_A_ub2 = np.insert(A_ub, A_ub.shape[0], new_con2, axis=0)new_b_ub1 = np.insert(b_ub, b_ub.shape[0], -math.ceil(res.x[idx]), axis=0)new_b_ub2 = np.insert(b_ub, b_ub.shape[0], math.floor(res.x[idx]), axis=0)# 将新约束条件加入队列,先加最优值大的那一支r1 = linprog(self.c, new_A_ub1, new_b_ub1, self.A_eq,self.b_eq, self.bounds)r2 = linprog(self.c, new_A_ub2, new_b_ub2, self.A_eq,self.b_eq, self.bounds)if not r1.success and r2.success:self.Q.put((r2, new_A_ub2, new_b_ub2))elif not r2.success and r1.success:self.Q.put((r1, new_A_ub1, new_b_ub1))elif r1.success and r2.success:if -r1.fun > -r2.fun:self.Q.put((r1, new_A_ub1, new_b_ub1))self.Q.put((r2, new_A_ub2, new_b_ub2))else:self.Q.put((r2, new_A_ub2, new_b_ub2))self.Q.put((r1, new_A_ub1, new_b_ub1))def test1():""" 此测试的真实最优解为 [4, 2] """c = np.array([40, 90])A = np.array([[9, 7], [7, 20]])b = np.array([56, 70])Aeq = Nonebeq = Nonebounds = [(0, None), (0, None)]solver = ILP(c, A, b, Aeq, beq, bounds)solver.solve()print("Test 1's result:", solver.opt_val, solver.opt_x)print("Test 1's true optimal x: [4, 2]\n")def test2():""" 此测试的真实最优解为 [2, 4] """c = np.array([3, 13])A = np.array([[2, 9], [11, -8]])b = np.array([40, 82])Aeq = Nonebeq = Nonebounds = [(0, None), (0, None)]solver = ILP(c, A, b, Aeq, beq, bounds)solver.solve()print("Test 2's result:", solver.opt_val, solver.opt_x)print("Test 2's true optimal x: [2, 4]\n")if __name__ == '__main__':test1()test2()
运行结果截图:
转载于:https://www.cnblogs.com/gscnblog/p/10520008.html
Python 实现整数线性规划:分枝定界法(Branch and Bound)相关推荐
- python混合整数线性规划_Python 实现整数线性规划:分枝定界法(Branch and Bound)...
今天做作业,要实现整数线性规划的分枝定界法算法.找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚.规范,所以在此记录.如有错误,请指正. from scipy.optimize import ...
- Python整数规划—分枝定界法
分枝定界法可用于解纯整数或混合的整数规划问题.在本世纪六十年代初由 Land Doig 和 Dakin 等人提出的.由于这方法灵活且便于用计算机求解,所以现在它已是解 整数规划的重要方法.目前已成功地 ...
- 分枝定界法的一般步骤
分枝定界法的一般步骤 设有最大化的整数规划问题A ,与它相对应的松弛问题为 B. (1)先不考虑原问题的整数约束,求解相应的松弛问题.用图解法或单纯形法求得最优解,记为 . (2)若求得的最优解 刚好 ...
- 分枝定界法解0/1背包问题
分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...
- 分枝定界法求哈密尔登回路问题的由表及里
刻苦努力的奋斗,终于有了学习成果,虽然写出的仅仅是非常拙略,功能单一的,简单的小程序代码,但不失为在代码学习的进步.总算是有了含有自己智慧在其中的结晶.其实这段代码能够顺利完成,虽然是独立完成,但终究 ...
- 【数学建模入门】整数规划求最优解|分枝定界法求最优解
文章目录 整数规划 分枝定届法 `intprog` `branchbound` 整数规划 intprog() function [x,fval,status] = intprog(f,A,B,I,Ae ...
- 分支定界 matlab,使用MATLAB实现分枝定界法求解整数规划的详细资料说明
分支定界法是一种求解离散最优化问题的计算分析方法.它是由Land Doig和Dakin等人在20世纪60年代初提出的.分支定界法可求纯整数或混合整数线性规划问题,求解方法由分支和定界组成." ...
- 整数规划之分枝定界法
整数规划之分枝界定法 引子: 题目分析: 这个整数规划问题相当于是在简单的线性规划问题上增加了决策变量为整数的限制条件.如果没有这个限制条件,那我们用linprog函数很容易解决如下 >> ...
- 算法分支定界法C语言程序,常用算法大全-分枝定界
任何美好的事情都有结束的时候.现在我们学习的是本书的最后一章.幸运的是,本章用到的大部分概念在前面各章中已作了介绍.类似于回溯法,分枝定界法在搜索解空间时,也经常使用树形结构来组织解空间(常用的树结构 ...
最新文章
- php ajax session失效,PHP中解决ajax请求session过期退出登录问题
- 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )
- ppp lcp协商报文有哪些_PPP协议
- 网联能否一统天下,取决于三个问题
- 不属于前后端分离的Vue+Django的例子
- servlet过滤器 实例_Java Servlet过滤器示例教程
- python实现一个json文件任意路径形式的接口项目
- c语言串口控制单片机,利用USART实现单片机与串口通信[C语言]
- react在部分安卓手机浏览器无法加载页面或页面空白
- 形式语言与自动机第二课
- promise终止方案
- 阿里云《云中谁送锦书来》活动 知识问答 答案
- QQ抢车位游戏PhysicalDataModel
- 关于Android Bluetooth(安卓蓝牙)在车载产品中的使用变化
- 【Unity实战100例】Unity幸运大转盘之概率可控
- OPPO R7Plusm(全网通)root、刷入twrp recovery、卡刷刷入CM系统教程合集_ recovery.img文件下载 联想A7600-m线刷刷机教程 手机卡在双4G双百兆无法开
- 贾扬清谈云原生 - 让数据湖加速迈入3.0时代
- Mbps、Kbps、bps、MB、KB、B、b的区别
- 联想电脑中的数据丢失怎么办?分享实用有效的技巧
- 钻展店铺推广,单品计划和超级推荐的区别