运筹系列78:cbc使用介绍
1. 上手
1.1 快速使用
首先是简单的调用测试,在mac上首先安装clp的库:brew install coin-or-tools/coinor/cbc
,然后新建项目进行调用,各项配置如下,注意要添加的library和directory比较多:
1.2 命令行方式
安装完cbc后,可以直接输入cbc调出命令行:
或者直接一行调用:
cbc air03.lp solve solu sol.txt
求解的几个配置:
Sec :默认Infinity,最多允许的执行时间
MaxN: 默认Infinity : 最多允许搜索的节点数。防止内存溢出
MaxS : 默认Infinity : 做多允许存储的可行解数量。如果只想要一个可行解,可以把这个数值设置为1.
2. 基本调用方法
标识 | 类名 | 说明 |
---|---|---|
A | CbcBranch… | MIP的非连续类,比如说整数变量、0-1变量 |
B | CbcNode | 接下来进行branch的节点 |
C | CbcTree | CbcNode的集合 |
D | CbcCompare… | 在CbcTree上决定下一步探索那个Node的函数,可以修改 |
E | CglCutGenerators | CGL中的cut generator,很少有人自己写 |
F | CbcHeuristics | 启发式算法 |
2.1 model和solver
需要首先定义一个线性规划的solver,传入model中。
model的方法和solver的方法很多是一致的,比如model.getNumCols() 以及model.solver()->getNumCols(),但是同步性有时会有差别,比如getColSolution() ,CbcModel可能不是最新的结果,这时可以用CbcModel::bestSolution()来获取结果。
当然两者还是有差别的,比如用来减少输出显示的代码:
model.solver()->setHintParam(OsiDoReducePrint,true,OsiHintTry);
在model中就没有。
2.2 获取结果信息
2.3 预处理和cut选项
-
Prep : 预处理,默认sos
sos: creates Special Ordered Sets [CITE] to improve branching
off: turns of pre-processing
equal : turns ≤ clique constraints into equality clique constraints -
PassP : 默认5
-
Cuts : 默认On
-
Clique : 默认IfMove
Off : never try this cut;
Root : cuts applied only at root node;
IfMove : cuts will be used of they succeed on improving the dual bound;
ForceOn : forces the use of the cut generator at every node. -
Lift(liftAndProjectCuts) : 默认Off
-
Mixed(MixedIntegerRounding) : 默认IfMove
-
Two(TwoMirCuts) : 默认Root : Determines the application Two phase Mixed Integer Rounding cuts.
-
Knapsack : 默认IfMove
-
Flow : 默认IfMove
-
Probing(ResidualCapacityCuts) : 默认forceOnStrong
除了上述选项外,还包含:forceOn, forceOnGlobal, forceOnStrong, forceOnButStrong and strongRoot. -
Residual(ResidualCapacityCuts) : 默认Off
-
CutD(CutDepth): 默认-1
当深度为CutD的倍数时进行cut。CutD=-1时,由cbc来自动判断。 -
CutL(CutLength): 默认-1
gomory cuts允许的最大cut数目。默认情况由cbc决定:
0 ≤ CutL < 10, 000, 000 : maximum length of CutL for cuts generated at root node and in the tree;
CutL ≥ 10, 000, 000 : allows cuts with unlimited length at root node, with a limit inside the tree. for example: CutL =10,000,130 indicate that in the tree only cuts with at most 130 variables will be accepted. -
PassC(PassCuts) : 默认-1
根节点cut passes最大数目。如果是 -1, 使用以下策略,其中n是变量数(column number):
n ≤ 500 : 100 passes;
500 < n ≤ 5000 : 100 passes, stopping when bound improvements are small;
n ≥ 5000 : 20 passes for larger problems.
2.4 启发式算法
- Round:在每次搜索时启用rounding heuristic
- Feas : 在根节点启动feasibility pump heuristic。使用一系列LPs,尝试获取integer feasible solution.
- PassF(PassFeasibilityPump): 默认30。Feasibility Pump heuristic的最大允许pass数目。若没有获得初始可行解,可以尝试将数值提升。
- Local(LocalTreeSearch):默认off
- PivotAndC( PivotAndComplement):默认Off
- PivotAndF(PivotAndFix):默认Off
- Combine : 默认On
在多次求解之后,仅尝试对出现过多次的变量进行b&c - Combine2 : 默认Off
比上面的要求更严格,要求出现多次且数值相同。 - Rins : 默认On
控制Relaxation Induced Neighborhood Search heuristic. - Rens : 默认Off
控制Relaxation Enforced Neighborhood Search heuristic. - Vnd(VndVariableNeighborhoodSearch):默认Off
控制Variable Neighborhood Search heuristic. - DivingG(DivingGuided) : 默认Off.
切换为Guided Dives heuristic - DivingP(DivingPseudoCost): 默认Off.
切换为使用pseudo costs的Diving heuristic . - DivingF(DivingFractional): 默认Off.
切换为Diving Fractional heuristic. - DivingS(DivingSome): 默认Off.
切换为random diving heuristic at various times.
此外,cbc只有一个rounding heuristic,可以自定义启发式算法。
3. 选择下一个搜索节点
使用CbcCompare来控制如何选择搜索节点。已经定义好的实现如下
类型 | 描述 |
---|---|
CbcCompareDepth | 一直探索最深的树节点 |
CbcCompareObjective | 一直探索当前目标函数最佳的树节点 |
CbcCompareDefault | 在可行解找到前使用depth-first。当一定数量的nodes被探索过、或者一定数量的解被发现后,改用breadth-first搜索;然后当树到达一定的尺寸后,再改为depth-first |
CbcCompareEstimate | 当pseudo cost启用时,可以用来猜测解 |
要自己实现的话,参考使用下面的函数:
修改CbcCompareUser.hpp和CbcCompareUser.cpp中CbcCompare的bool test(CbcNode* x, CbcNode* y)) 函数:当node y优先于node x,返回true。
CbcCompareUser::test()方法代码如下:
// Returns true if y better than x
bool
CbcCompareUser::test (CbcNode * x, CbcNode * y)
{if (weight_==-1.0) {// before solutionif (x->numberUnsatisfied() > y->numberUnsatisfied())return true;else if (x->numberUnsatisfied() < y->numberUnsatisfied())return false;elsereturn x->depth() < y->depth();} else {// after solution.// note: if weight_=0, comparison is based// solely on objective valuedouble weight = CoinMax(weight_,0.0);return x->objectiveValue()+ weight*x->numberUnsatisfied() >y->objectiveValue() + weight*y->numberUnsatisfied();}
}
tree是无状态的。newSolution()方法在每次新的解发现时调用,另外每1000次探索后调用every1000Nodes(),此时可以修改test()中的变量(e.g., weight_).同时由于CbcNode有model指针,因此同时可以修改诸如最大允许时间等变量 (e.g., CbcModel::setMaximumSeconds(double value))
3. 示例文件说明
相关文章:

运筹系列78:cbc使用介绍
1. 上手 1.1 快速使用 首先是简单的调用测试,在mac上首先安装clp的库:brew install coin-or-tools/coinor/cbc,然后新建项目进行调用,各项配置如下,注意要添加的library和directory比较多: 1.2 命令行方…...

RocketMQ底层源码解析——事务消息的实现
1. 简介 RocketMQ自身实现了事务消息,可以通过这个机制来实现一些对数据一致性有强需求的场景,保证上下游数据的一致性。 以电商交易场景为例,用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统…...

学习802.11之MAC帧格式(一篇就够!)
802.11规范的关键在于MAC(媒介访问控制层),MAC位于各式物理层之上,控制数据传输。负责核心成帧操作以及与有线骨干网络之间的交互。 802.11 MAC采用载波监听多路访问(CSMA)机制来控制对传输媒介的访问&…...

使用阿里云IoT Studio建立物模型可视化界面
使用阿里云IoT Studio建立物模型可视化界面 上一篇文章介绍了如何使用ESP-01S上报数据到物模型:https://blog.csdn.net/weixin_46251230/article/details/128996719 这次使用阿里云IoT Studio建立物模型的Web页面 阿里云IoT Studio: https://studio.i…...
HBase 复习 ---- chapter07
HBase 复习 ---- chapter07部署 HBase(运维) 1:部署 HBase 实际是部署了三个技术(hadoop zookeeper hbase) hadoop hdfs mapreduce common hdfs namenode datanode secondaryNamenode yarn ResourceManager&a…...

跟我一起写Makefile--个人总结
此篇笔记是根据陈皓大佬《跟我一起写Makefile》学习所得 文章目录换行符clean变量make的自动推导另类风格的Makefile清空目标文件的规则cleanMakefile总述显示规则隐晦规则变量的定义注释引用其它的Makefile环境变量MAKEFILESmake的工作方式书写规则规则举例规则的语法在规则中…...
设计模式之为什么要学好设计模式
目录1 回顾软件设计原则2 设计模式总览3 经典框架都在用设计模式解决问题1 回顾软件设计原则 不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的是解耦。设计模式天天都在用,但自己却无感知。我们把设…...

大数据时代的小数据神器 - asqlcell
自从Google发布了经典的MapReduce论文,以及Yahoo开源了Hadoop的实现,大数据这个词就成为了一个行业的热门。在不断提高的机器性能和各种层出不穷的工具框架加持下,数据分析开始从过去的采样抽查变成全量整体,原先被抽样丢弃的隐藏…...

【呕心沥血】整理全栈自动化测试技术(三):如何编写技术方案
前面两篇笔记我介绍了自动化测试前期调研注意事项和前置准备阶段切入点,有同学在后台提问: “做完前期的调研和准备工作,领导要求写一个落地方案并评审,自动化测试的落地方案该怎么写”? 首先这个要求我觉得挺正常&a…...

67. 二进制求和
文章目录题目描述竖式模拟转换为十进制计算题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” …...
1555数列极差(队列 优先队列 )
目录 题目描述 解题思路 代码部分 题目描述 在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a*b1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得…...

代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II
一、参考资料复原IP地址题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/子集题目链接/文章讲解:https://programmercarl.com/0078.…...
jvm类加载器
概念 Bootstarp ClassLoader (引导类加载器) 加载String等核心的类Ext ClassLoader (拓展类加载器)System ClassLoader (系统类加载器) 加载用户自定义的类 关系 BootstrapClassLoader 包含 ExtClassLoaderExtClassLoader 包含 SystemClassLoader彼此是包含关系,不…...

Rust学习入门--【7】Rust 数据类型
类型系统 对于任何一门语言都是重中之重,因为它体现了语言所支持的不同类型的值。 类型系统 也是 IT 初学者最难啃的三座大山之一,而类型系统之所以难以理解,主要是没有合适的现成的参考体系。 我们说类型系统 存在的目的,就是 …...

阅读MySQL必知必会,查缺补漏
MySQL自带数据库 information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。 performance_schema:是MySQL系统自…...

MySQL数据库10——多表连接查询
数据如果在多个表里面,需要进行连接查询。 一般在pandas里面merge合并会用到一个索引,按这个索引的规则进行合并叫做有规则的等值连接。若不按规则连接,遍历两两组合的所有可能性,叫做笛卡尔积。 笛卡尔积连接 通常人们都会设置…...
华为OD机试 - 括号检查(Python)| 真题含思路
括号检查 题目 现有一字符串 仅由 (,),{,},[,] 六种括号组成,若字符串满足以下条件之一,则为无效字符串 任意类型的左右括号数量不相等 存在未按正确顺序(先左后右)闭合的括号, 输出括号的最大嵌套深度 若字符串无效则输出 0 0 <= 字符串长度 <= 100000 输入 一个只…...

安全渗透测试中的一款免费开源的超级关键词URL采集工具
安全渗透测试中的一款免费开源的超级关键词URL采集工具。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使…...
数据资产管理实践白皮书(6.0版)解读
目录 第一章数据资产管理概述 ( 一 ) 数据资产管理和数据要素的关系...

c/c++开发,无可避免的函数指针使用案例
一、函数指针简介 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。例如: char* (*pf1)(char * p1,char *p2); 这是一个函数指针,其…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...