运筹优化理论
文章平均质量分 71
运筹优化的理论。主要是整数规划、混合整数规划的理论知识。
云湖在成长
1.不怕慢,不怕笨,就怕停。
日拱一卒,天道酬勤,每天一小步。
2.不和别人比,目标是打好手中的牌。
3.目标导向,少玻璃心。
展开
-
逻辑benders分解
benders分解是指把问题分解为主问题和子问题。主问题松弛后得到的信息输入到子问题中,求解中去。加入的割可以提升主问题的下界(主问题提供的解),继续反馈给子问题后,降低了上界(子问题提供的解),直到上下界相等,求解完成。经典的benders分解,指的是子问题是线性规划问题;基于整数的benders分解,指的是子问题是整数规划;而基于逻辑的benders分解,指的是子问题返给主问题的割是根据逻辑得到的割。对于调度问题,通常有以下几种。原创 2024-04-12 21:00:59 · 783 阅读 · 0 评论 -
优化模型的关键:ARR
Principle ARR – Shu-Cherng Fang• Approximation – “accept good-enough” to make problem easy• Reformulation – “change view” to make the problem clear and simple• Relaxation – “drop difficulties” to get a bound of the problem• Decomposition – “reduce dime原创 2023-11-02 11:16:49 · 155 阅读 · 0 评论 -
求解器求解过程中gap没有太大变化怎么办?
探测节点很快,节点所在的支被切掉(整数解,更差的非整数解,或不可行三种情形之一),此时求解会很快,反应在求解器的输出日志上就是,需要备探测的节点在减少。求解器用的是分支定界框架,准确的说用的是分支切割算法,在分支定界的框架中不断自动添加各种割cut,直到“所有”节点探测完毕。从公式上可以看出,当gap下降很快,要么是上界在降低(更好的整数解),要么是下界在提升(更好的下界)。gap下降很快,这种情况要么是找到了更好的上界,更小的整数解(最小化问题),要么是更好的下界,gap体现了目前求解的状态,直观的说,原创 2023-10-26 10:34:29 · 611 阅读 · 0 评论 -
两个连续变量乘积线性化——McCormick envelope近似
没有完全等价的线性化方法)。要说明的是这是一种近似线性化,并不是完全等价,存在一定的误差。(McCormick envelope的形式),也叫McCormick包络。假如是两个变量z=xy,x和y是连续变量,原创 2023-10-12 09:24:02 · 2111 阅读 · 1 评论 -
设计分支定界算法关键步骤
性质是最优解中会出现的性质,那么没有出现这些性质的,不会是最优解(或者说别的解已经包含这些特征了,这个点是无用的),我们说这个点被支配,会进行砍枝操作。在研究的过程中,需要根据问题属性设计出节点的下界。对于调度问题来说,就是部分调度PS下最好的解是多少,即LB。这两点是我们设计出定制的分支定界算法的核心,是我们的工作量体现,更是影响算法表现效果的关键。推导出下界,最好是比较紧的下界,对于后续分支树有巨大好处。不同于经典分支定界的线性松弛法,即线性松弛解为下界。原创 2023-10-10 16:09:04 · 140 阅读 · 0 评论 -
支配规则的作用及应用——以分支定界和有效不等式为例
支配规则的作用是删去一系列被支配的节点,也就是我们说的剪支。大白话理解就是这个节点的信息太差,有比它更好的,已经包含了相应的信息,所以它没什么作用了,这样一来,剪支后的分支树叶子节点变少,我们探索就容易了。线性松弛的解大于等于UB,该枝不可能产生更好的整数解了,因为该枝的整数解比线性松弛的解还大,得到的整数解不会更新UB。对更新UB无用,所以剪支。支配规则需要我们来进行推导,也是体现我们工作量创新点,以及体现我们对问题的理解,定制化算法的关键。πx≤π0,证明左边的π更大,或者是右边的π0更小。原创 2023-10-10 11:27:21 · 128 阅读 · 0 评论 -
分支定界、分支切割、分支定价的区别
(1)分支定界:是(本质上(2)分支切割:是。比如VRP问题中的k-paths割,即若干顾客的需求量至少需要的车辆数。(3)分支定价:将原问题重写,如VRP问题中将x_{ijk}的3-index模型改写为路径y_{r}的1-index模型(RMP);然后根据子问题的检验数不断添加新的路径,再次求解RMP,若是非整数解则分支。需要改写模型;而且需要求解子问题(设计出有效的算法,比如标签算法,支配规则等)。别的与前两者区别不大。原创 2023-10-03 16:48:20 · 1423 阅读 · 0 评论 -
MIP精确算法的关键——确定界
MIP精确算法包含,分支定界、分支切割、分支定价还有benders分解等等。前者是以分支定界为框架的一类算法;后者是以分解为框架的一类算法。甚至还包括拉格朗日松弛等等,我觉得除了算法细则需要搞清楚外,更关键的是弄懂界。因为拉格朗日算法目前不熟,所以下面我具体总结分支定界的一类算法和benders分解算法界的确定原则。本篇以min问题为例。原创 2023-10-03 11:46:43 · 338 阅读 · 2 评论 -
gurobi属性:构造目标函数,构造列
但如果是x=m.addVar(lb=0, float(’inf’), obj=2, vtype=GRB.CONTINUOUS),那么目标函数中会出现z=2x一项。我们常见的目标函数写法通常是定义好式子z=f(x,y,...),然后用m.setObjective(z, GRB。如果obj=0,即该变量不出现在目标函数中,也是默认的形式,我们见得最多。添加的时候用addTerm(),删除的时候用remove()。(2)但还有一种写法,是在定义变量的时候来构造目标函数。此处的obj是变量在目标函数中的系数。原创 2023-10-01 17:50:01 · 376 阅读 · 0 评论 -
拉格朗日松弛与拉格朗日分解 lagrangian relaxation
拉格朗日松弛 lagrangian relaxation首先介绍下拉格朗日松弛的出发点,以及该方法所属的门类;再介绍下拉格朗日松弛法需要处理的难点和注意事项。原创 2023-05-27 20:59:39 · 3435 阅读 · 0 评论 -
benders分解算法 逻辑思路整理(加星)
一般我们经常可以看到的是经典的benders,此处我也结合经典的benders梳理下思路。原创 2023-05-25 12:40:11 · 3219 阅读 · 2 评论 -
Gurobi 不可行问题的冲突溯源
如果是无界的,那么可以检查变量和约束的上下界设置,是否有可能出现无界情况。feasRelaxS() 和 feasRelax() 函数的功能,是在用户原有模型基础上,为变量和约束添加松弛变量,让松弛模型变得可行,然后通过最小化松弛量来获得一个最小违反变量和约束限制的模型。这种情况下,用户可以将原模型中的变量边界和约束的 Force 属性设定为1,然后运行ComputeIIS(),那么Gurobi 只会专注在新增加的约束和变量边界上,不但溯源的时间会更短,而且提供的信息可以更容易让用户发现问题。转载 2023-04-06 16:39:50 · 1492 阅读 · 0 评论 -
gurobi松弛模型求解
如原来的MIP模型为model,则松弛后的求解方式可以为下述:原创 2023-03-19 16:07:32 · 477 阅读 · 2 评论 -
有效不等式valid inequality和割平面cuts的区别,以及与强有效不等式的区别
一般来讲,valid inequality在模型未求解之前,就可以全部列举出来;而cuts,一般是模型求解过程中,随着迭代,才可以生成的。(我自己使用的感觉是,添加了有效不等式,与不加有效不等式相比,一开始的效果会非常明显。但是之后进程提升的效果并不明显。有效不等式valid inequality和割平面cuts是不同的两个东西。但是cuts会在之后的进程中起到作用,一点点切割可行域。个人感觉是两者都需要,关键在于对问题本身的了解和研究。但是其实,这两者的概念,也没有说分得那么清楚。原创 2023-04-06 16:50:43 · 1277 阅读 · 0 评论 -
gurobi中callback函数的使用整理
但其实不是的。model.optimize()的完整形式是model.optimize(callback=none),既我们没有赋予括号中任何信息。但其实callback功能十分强大,在后期实现分支定价,分支切割算法的时候经常用。callback可以实现监视,干预,也就是部分程度和gurobi求解器实现交流交互,管理gurobi的优化进程。更多callback的分析可以看gurobi自带的参考资料,即refman.pdf文件。原创 2023-01-08 11:01:44 · 2838 阅读 · 0 评论 -
VRP和调度问题的主流精确算法和启发式算法
也就是说解决大规模问题,现在的主流的精确算法是BCP,与之比较的是ALNS,自适应大邻域搜索(别的什么遗传算法,粒子群等等,根本不能与之比)。BCP和ALNS的特点是用局部搜索来逼近全局搜索最优点。换句话说,开发大规模的精确算法,可以与之一比的是ALNS,别的启发式算法不要比原创 2022-11-26 17:10:47 · 2254 阅读 · 0 评论 -
列生成算法column generation求解思路总结篇2——CW分解
CW分解是类似的思路,也是让子问题不断生成新列添加到松弛主问题中,让松弛的主问题不断逼近一开始的原问题,直到不能改进时,可以认为松弛的主问题等价于原始问题了。原创 2022-07-23 16:05:46 · 1201 阅读 · 0 评论 -
线性规划和对偶规划学习总结
在学习列生成和分解算法的时候,会频繁用到线性规划和对偶的知识,可以说LP和DP是基础。因此理解线性规划和对偶的本质是很重要的。单纯形法是纯代数运算,从一个顶点跳到另一个顶点;且我们知道最优解一定在顶点取得,可是为什么在顶点一定会取得最优解?为什么从一个顶点跳到另一顶点,通过进基出基就可以实现,它俩为什么是一一对应的?除此以外,在分解算法中的极点和极射线和LP的解是什么样的对应关系?这些问题,应该说必须了解了线性规划和对偶的本质才能够深刻理解,而不至于陷入机械无脑的计算。大概看了慕课的课程,感觉山东大原创 2022-05-31 09:41:33 · 3601 阅读 · 6 评论 -
Benders decompositon学习笔记记录
Benders分解作为3大分解算法之一,听过很久了。好像目前最新的是Benders逻辑分解,比着Benders分解又升级进步了。UTD24中有一些相关的文章,我也在慢慢拜读中。经典的3大分解算法分别是:(1)Benders decomposition (主要思想是行生成+割平面方法);(2)Dantzig-Wolfe decomposition (主要思想其实就是列生成);(3)Lagrangian decomposition (主要思想是 Lagrangian relaxation)。分解原创 2022-05-24 21:22:14 · 1689 阅读 · 0 评论 -
gurobi求解日志log篇
相信大家在求解的时候,总会看到这个,这就是gurobi的求解日志(log file)。默认是直接开启的,可以通过:python m.setParam("OutputFlag", 0)进行关闭。为0就是关闭,默认为1打开。(Gurobi版本9默认不输出日志文件(log file),版本9相比之前版本,创建日志文件的默认设置有所更改;默认日志文件仅适用于gurobi_cl和带有v9.0的交互式shell。如果想输出log file,需要修改LogFile参数:self.m.setParam(GRB....原创 2022-04-19 10:54:11 · 5362 阅读 · 3 评论 -
算法评价尺度
本篇以离散/组合最优化为基准面,讨论算法评价尺度。最优化问题是从一系列选择中选出最符合要求的那个结果,用数学语言来说就是在一系列定义域内找寻符合约束的最好解。所以三个要点要明晰:变量,约束,目标函数。最优化问题可以分为离散问题和连续问题。离散问题在生活实践中最为常见,而组合优化问题是从一系列组合中找到最好的一个组合,在实际中和离散问题区别不大,所以我们也把离散优化叫做组合最优化,方法是通用的。最优化是从一系列方案(也叫可行域)中找到最好的方案。而算法就是寻找组合问题方案(可行解)的方法。假如得到原创 2022-02-23 11:05:08 · 472 阅读 · 0 评论 -
P,NP,NPC(NP完备),NP-hard(NP难),时间复杂度
P是在多项式时间可以“解决”的一类问题。NP(Non-deterministic Polynomial)是多项式时间可以“验证”解是否正确。可以解决,必然可以验证解是否正确。因此P是NP。但NP不一定是P。因此P=NP尚不确定。NP完备(NP complete,NPC)有两个条件:第一是NP,第二必须所有NP都可以规约到它。NP难(NP-hard)满足NPC第二条条件,所有NP都可以规约到它,但是它本身并不一定是NP。NP-Hard问题要比 NPC问题的范围广。如TSP问题。(也就是即使有一天发现原创 2022-01-06 19:22:53 · 2199 阅读 · 6 评论 -
整数规划之分支切割算法
目录1. 分支切割算法简介2.分支切割原理,及需要考虑的方面3.分支切割算法的关键4.总结1. 分支切割算法简介分支切割算法,即branch and cut,是branch and bound分支定界+cutting plane割平面。同理我们类比分支定价branch and price,是branch and bound分支定界+column generation列生成。两者都是精确算法。解决的是整数规划问题。我们通过松弛IP得到LP,最好松弛得到的LP就是整数解。但是实.原创 2021-11-14 20:31:26 · 6629 阅读 · 3 评论 -
运筹优化实用网站
1.智能算法-运筹优化里头有整理得非常系统全面的资料可供学习,十分推荐。2.菜鸟的算法之路 写得中肯实在。不打广告不炫技,分享python代码。也很推荐。原创 2021-11-14 18:31:51 · 657 阅读 · 2 评论 -
分支定界方法(branch and cut,branch and price的基础)
运筹我们最先接触分支定界算法,也就是由Land Doig和Dakin在20实世纪60年代初提出的branch and bound算法,用在整数规划(全部决策变量是整数)中。其实用在混合整数规划(部分决策变量是整数)中也是可以的(本身混合整数规划就能够转化为整数规划)。目前很多求解器,如cplex和gurobi就是基于分支定界算法框架设计的。1.基础版的分支定界算法(假设是min问题)首先介绍几个定理:(1)若上界和下界相等,且上界是整数可行解,那么上界对应的可行解就是最优解。备注:假如上原创 2021-10-18 10:35:48 · 14212 阅读 · 2 评论 -
线性规划LP和混合整数规划MIP基础知识
如果你刚刚入门线性规划,对于线性规划的基本原理、概念、术语,以及 Gurobi 内部的核心算法不了解的话,请花费 10分钟时间,阅读以下二个科普文章。如果对于英文不熟练的话,可以采用谷歌浏览器,然后选择翻译为中文。LP 基础:https://www.gurobi.com/resource/linear-programming-basics/MIP 基础: https://www.gurobi.com/resource/mip-basics/一.优化基础优化中非常重要的3个要素,分别是:决策变量、翻译 2021-10-11 11:20:39 · 12389 阅读 · 1 评论 -
gurobi与python应用之模型编写,注意点,及调试技巧
gurobi与python应用2指南见refman,或者google进gurobi官网借助翻译软件为中文1.定义变量2.约束部分指南见refman,或者google进gurobi官网借助翻译软件为中文1.定义变量常见的定义变量是:m.addvars()// An highlighted blockaddVars ( *indices, lb=0.0, ub=float(’inf’), obj=0.0, vtype=GRB.CONTINUOUS,name="" );默认下界为0。当下界比0原创 2021-08-30 16:10:40 · 10741 阅读 · 4 评论 -
gurobi+python/matlab使用体验
观感上来说,gurobi+python更友好。因为和我们见到的数学模型差不多,编译与识别都比较友好。而matlab+gurobi,因为循环的原因,可能看起来比较臃肿。MATLAB基于Yalmip调用solver(Gurobi、Cplex)是非常容易上手的一门语言,直接点setup接口就可用,很简单,但感觉有点慢,电话吭哧吭哧的风扇声特别大,不知道是不是自己系统的原因。而python+gurobi就快了很多,而且现在很多例子给的都是python搭建的,应该后者比较好。以用导学。后续暂时用pytho原创 2021-07-10 16:41:48 · 1241 阅读 · 0 评论 -
优化思考一
以下内容是自己的小思考,可能有不对的地方。1.优化是一项系统工程,是决策中的一环,需要前后很多环节互相配合协作。简而言之,数据(输入)>>优化模型(处理)>>结果方案(输出)。优化是其中最重要的一环。我们做优化之前,很多时候假设数据信息已知;即使不知道,也假设服从一定的概率分布等,或是需要通过各种预测手段预测数据。这里要需要预测人员的配合和帮助。如果涉及到多个目标,往往得到的是一系列满意解。管理者需要根据偏好,通盘考量,给出最终的方案。也就是优化的最终解释权归决策者所有。优化原创 2021-07-08 20:55:21 · 157 阅读 · 0 评论 -
整数规划学习指南
整数规划入门1.引言几乎每个接触运筹学的人都是从线性规划开始。以清华大学出版的,或是胡运权老师出版的《运筹学》为教材,线性规划;对偶规划和灵敏度分析;运输问题;目标规划;整数规划,指派问题;分支定界割平面;图论里的生成树;最短路,最大流,最大割;以及动态规划;网络评审技术等等。可以说几乎囊括了运筹学的整个分支,其实每个章节拿出来都是可以大书特书的。整数规划是其中的一个小章节,同时也是一类生活中非常常见的问题。生活中的二元决策太多了,yes or no是与非的二元选择;或是物品属性无法分割的整数决策。原创 2021-06-14 21:27:52 · 1221 阅读 · 0 评论 -
Gurobi搭建模型系列1——基础
Gurobi搭建模型思路基本思路一、准备工作:anaconda+gurobi搭建二、重点:建模建模顺序工具建模部分基本思路anaconda、python、pycharm选择。1.pycharm适用于群体开发项目时用,是个大型的集中平台。数据库、代码、项目、环境等等资源。2.python适合深入研究python的人使用,对使用者要求较高。3.anaconda比较适合一般人,也是个开发平台,可视化效果比较好。一、准备工作:anaconda+gurobi搭建anaconda 3.* 自带spyder原创 2020-09-14 15:54:59 · 2385 阅读 · 3 评论 -
列生成算法column generation求解思路总结篇1
列生成column generation算法,是求解大规模线性规划问题的一种常用算法,在运筹优化领域有着非常广泛的应用。本篇介绍它的最初形式,原理及应用。1.最初是为了解决下料问题即cut-stock problem。这个问题在cplex和gurobi的代码例子中都有。思路:P1——P2——(1)常规建模P1即min{消耗的大卷数}但当大卷数特别多时,求解不易。(2)转化为P2...原创 2020-10-22 18:15:55 · 6970 阅读 · 8 评论 -
灵敏度分析的意义
灵敏度分析的意义(LP<——>LP的反问题即灵敏度分析)决策,特别是运筹建模。最终求得的是在一定约束下得到的最优解。但是支撑这个模型的资源以及利润值并非是现实实际,而是根据以往经验得到的(也就是说未来可能发生变化),那么依赖于此所建立的模型最优解是否还能用?因此就需要灵敏度分析了,就是在什么样的变化范围内最优解或者说决策不会发生变化?还有:在什么样的区间变化时,对最终的决策有什么样的影响?这样的分析结果比给出最优解,对于现实实际才有指导意义。...原创 2020-11-05 16:54:59 · 4791 阅读 · 0 评论