运筹优化
文章平均质量分 64
规划及优化算法
明湖底的炼丹炉
这个作者很懒,什么都没留下…
展开
-
Q-learning实战
Q-learningQ-learning是强化学习中一种入门级的经典算法。基本思想是对所有状态下的对应动作进行打分,依据最高的分值选择动作。打分的依据是Q表,其中存储了所有状态下动作的分值,Q表通过数据训练而来。Q-learning的优势在于融合了动态规划和蒙特卡洛,构造了时间差分的Q值更新公式,其更新公式如下:找房间问题问题代码#-----------------------------------调用模块-----------------------------------import原创 2022-05-10 20:48:13 · 1523 阅读 · 0 评论 -
基于Gurobi的列生成算法
前言列生成算法是求解大规模线性规划的有效手段之一,对于难以直接求解的大规模线性规划问题,列生成在某些场景能够缩小问题规模,降低问题求解难度,在可接受的时间内精确求解问题。列生成的基本思路是将一个原问题从一个小的模型开始,即一开始只考虑模型的少量列(变量),然后通过建立子问题,寻找满足进基条件的列,将这些列添加到主模型,直到找不到能够进基的列,那么这个时候我们求解主模型得到的解将等同于包含所有变量的大规模线性问题的解。试想一下,对于某些生产实际问题,其决策变量可能达到百万甚至千万级,使用求解器直接求解的难度原创 2021-12-10 20:52:54 · 4153 阅读 · 7 评论 -
Python+Gurobi求解SWTA问题
前言静态武器目标分配(static weapon-target assignment,WTA)问题是军事领域的著名问题,也是分配问题中的研究热点之一。SWTA问题易于描述但是难以求解,自1958年提出以来,大量学者对其进行了研究,但是对于大规模的SWTA问题求解仍然难以克服,本文将借助Gurobi精确求解小规模的SWTA问题。SWTA问题假设我方有m个武器,敌方有n个目标来袭,对我方资产进行打击,来袭目标j具有不同的威胁程度v_j,我方武器i对于目标j的毁伤概率p_i_j已知,SWTA问题旨在寻找一种原创 2021-12-09 01:22:47 · 2971 阅读 · 0 评论 -
Python调用Gurobi求解简单线性规划问题
前言Gurobi是一款功能强大的商用求解器,支持Python、C、C++、Java等多种语言调用,相比于Cplex,Gurobi封装更高,更加方便,但是对于初学者而言会更难一些。Gurobi与Cplex存在兼容,Gurobi生成的mps或者lp文件可以在CPlex中运行。另外,在校学生和教师可以免费使用Gurobi的学术版,求解规模和求解速度不受限制。本文将简单记录python调用Gurobi求解的过程。安装用户可以通过gurobi官网下载并安装软件:gurobi官网,下载软件后学生可通过学生认证获取原创 2021-12-08 15:59:17 · 14051 阅读 · 7 评论 -
cplex求解线性规划(python)
前言代码import cplex# 数据my_obj = [1.0, 2.0, 3.0]my_ub = [40.0, cplex.infinity, cplex.infinity]my_col_names = ['x1', 'x2', 'x3']my_rhs = [20.0, 30.0]my_row_names = ['c1', 'c2']my_sense = 'LL'# 模型prob = cplex.Cplex()# 目标函数prob.objective.set_sense原创 2021-08-24 13:18:54 · 2399 阅读 · 0 评论 -
or-tools求解最大流问题
前言最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。求最大流的标号算法最早由福特和福克逊于1956年提出,20世纪50年代Ford、(Fulkerson)建立的“网络流理论”,是网络应用的重要组成成分。下图为一个简单的网络流问题示意,共5个节点,编号为0、1、2、3、4,节点相连的边为可以通过的最大流量,箭头所指为流向,现欲求从节点0到节点4的最大流量。代码or-tools中提供了求解网络流问题的标准原创 2021-08-16 12:04:48 · 644 阅读 · 0 评论 -
or-tools求解指派问题
前言指派问题是生产生活中的常见问题,假设我们有m个工人,需要完成n项工作,每个工人最多完成一项任务,且每项任务必须指定一个工人完成,目标是最小化完成所有任务的成本。下图为指派问题的一个简单示意,左侧为工人,右侧为任务,连接标注了对应 工人完成对应任务的成本,表格为工人完成任务的成本的具体数据。代码from ortools.linear_solver import pywraplp# 求解器solver = pywraplp.Solver.CreateSolver('SCIP')# 数据原创 2021-08-15 15:45:43 · 1018 阅读 · 0 评论 -
or-tools求解约束规划
前言约束优化或约束规划(Constraint programming, CP)是指从一组非常大的候选集合中找出可行的解决方案,在这些候选集合中,问题可以用任意约束来建模,许多科学和工程学科中都存在CP问题。CP是基于可行性(寻找一个可行的解决方案)而不是最优化(寻找一个最优的解决方案),它关注的是约束和变量而不是目标函数。实际上,CP问题甚至可能没有目标函数——目标可能只是通过向问题添加约束,将各种可能的解决方案缩小到更易于管理的子集。问题假设有3个变量x、y、z,三个数的取值都是{0,1,2},唯原创 2021-08-14 21:14:13 · 1437 阅读 · 0 评论 -
or-tools求解整数规划
or-tools求解整数规划问题前言OR-Tools是一个用于优化的开源软件套件,用于解决车辆路径、流程、整数和线性规划以及约束编程等世界上最棘手的问题。同时OR-Tools提供了C++,Python,Java,.NET的接口,同时提供统一接口封装来调用商业求解器如Gurobi, CPLEX等,也包括开源求解器如SCIP, GLPK, ortools等。在python中安装ortools使用pip命令即可。问题代码from ortools.linear_solver import pywrap原创 2021-08-14 20:29:58 · 1765 阅读 · 0 评论 -
基于Cplex的分支定价
前言分支定价(branch and bound)和分支定价(branch and price)仅一字之差,这两者之间也有着紧密联系,简单来说分支定价=分支定界+列生成。个人觉得在运筹学领域,分子定价算法也算是比较高级的算法了,要学习分支定价,首先要对分支定界和列生成非常熟悉,分支定界和列生成的基本原理和Cplex实现可参考我的博客分支定界和列生成,到目前为止,我没有在网上找到完整的分支定价代码,因此我觉同自己从头开始写一份,前面的几篇博客都是分支定价的铺垫。分支定价算法话不多说,首先给出分支定价算法原创 2021-01-16 23:01:45 · 4376 阅读 · 5 评论 -
基于Cplex的分支定界
前言分支定界算法是求解整数规划的最常用方法之一,它不仅适用于纯整数规划问题,也适用于混合整数规划问题。分支定界的基本思想是将可行区域分解为越来越小的区域,这一过程为分支过程,对于结果劣于当前界的分支,可以将其舍去,这一过程称之为剪枝,而当我们找到结果好于当前界的整数解,则需要更新当前界,这称之为定界。整数规划整数规划问题特指某些变量或全部变量为整数的规划问题,本文说的整数规划指整数线性规划。下面我们看一个简单整数规划的例子。加入不考虑变量是整数,那么我们直接使用单纯形法求解即可,最终得出答案为:原创 2021-01-16 11:53:01 · 2408 阅读 · 3 评论 -
基于Cplex的列生成技术
前言首先介绍一下什么是列生成,列生成技术是一种求解大型线性规划问题的技术,广泛应用于机组人员调度问题、切割问题、车辆路径规划问题。以上问题有一个共同点,即小规模的问题可以直接使用线性规划进行求解,但是对于大规模的问题,直接求解往往行不通,计算机的内存和运算速度都不能满足要求,实际上,这类问题随着规模的增加,复杂度基本呈指数增长。通过列生成技术,我们可以将模型缩小到我们能够承受的规模,然后进行求解,而且列生成是保证精确解的。顾名思义,列生成就是不断地生成列,直到找不到满足条件的列,在这种情况下,我们可以保证原创 2021-01-15 17:15:36 · 2902 阅读 · 0 评论 -
Cplex求解线性规划
前言本文将介绍使用Cplex进行简单的线性规划求解,本文将介绍Cplex中两种常用的建模方式,即按行建模和按列建模。实际上还有一种按非零元素建模,本文暂时不涉及。编程环境是VS2019+Cplex12100,环境配置可参考博客:https://blog.csdn.net/weixin_38442390/article/details/112545696。按行添加代码#include<ilcplex/ilocplex.h>ILOSTLBEGIN/* 数学模型 Maxim原创 2021-01-12 21:20:40 · 4740 阅读 · 2 评论 -
VS2019配置Cplex12100
前言Cplex是IBM公司的一款高性能求解器,它在线性规划、整数规划等多个领域都具有不俗表现,对于运筹专业的学生来说,Cplex是不得不学的“神器”。从本文开始,博主将在此记录Cplex的学习之旅,目测内容有基于Cplex的简单建模、分支定界、列生成、分支定价。Cplex支持python、java、C++等多种语言,我选择我比较熟悉的C++。本文将详细介绍VS2019配置Cplex的过程,读者也可选择其他版本,但是并非所有的VS版本都支持Cplex的相应版本,总的来说,更新的VS支持更新的Cplex。原创 2021-01-12 20:44:51 · 2064 阅读 · 9 评论 -
凸包问题的GRAHAM-SCAN解法(附C++代码)
前言凸包(convex_hull)是一个计算图形学的概念,在二维空间中凸包可以看成一个点集中所有点的最小凸多边形。凸包问题实际上是一个简单的数学问题,只要熟悉原理我们可以很快地编程实现求解,但是网上很多资料都写得比较混乱,推导过程不完整,因此本文将详细介绍凸包问题的推导过程,并附上相应的C++代码。一、凸包问题使用GRAHAM-SCAN求解凸包问题的算法流程如下:上述算法流程出自权威算法类教材,整个流程是绝对正确的,也就是说只要照着上述流程进行代码实现,是可以正确求解凸包问题的。为了让读者更进一步原创 2020-10-23 10:57:20 · 4550 阅读 · 9 评论 -
基于优先队列的Dijkstra算法
前言最短路径问题,即在给定的连接图中,求解节点之间的最短路径。Dijkstra算法是典型的单源最短路径算法,单源即只能求解某个节点到其他节点的最短路径。另外,此算法不能处理边权重为负的情况。一、最短路径问题最短路径问题是图论的一个经典算法问题,最短路径问题包含多种问题形式,本文着重讲解单源最短路径问题及其优化求解方法。如下图所示,给出由多个节点相互连接构成的图,节点之间连接的好坏用权重来衡量,我们要求解某点到任意点的最短路径,这是典型的单源最短路径问题,我们可以使用Dijkstra算法对其进行求解。原创 2020-10-15 16:39:33 · 6059 阅读 · 3 评论 -
匈牙利算法求解指派问题(C++代码)
前言匈牙利算法能精确求解指派问题,获取最优分配方案。匈牙利算法求解指派问题基于以下原理:在一个成本矩阵中,对某一行或者某一列加上或减去一个数,最优的分配方案不变。基于此原理,我们可以对成本矩阵进行变换,直到使用试指派能够找到最优解(对一个n*n的成本矩阵而言,找到n个独立0元素)。一、指派问题实际中,我们会经常碰到此类问题:有n项任务需要均分给n个工人完成,工人i完成任务j的成本为cij,我们要找到一种分配方案,使得总成本最小。如下图是一个4员工4任务的指派问题:二、匈牙利算法对于一个规模为n原创 2020-10-13 21:54:24 · 16903 阅读 · 36 评论