运筹系列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); 这是一个函数指针,其…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...