混合贪心算法求解地铁线路调度 车次数据分位上行车次和下行车次,上行车次表示从编号较大的站到编号较小的站,下行车次从编号较小的站到编号较大的站,流入从1到20是下行车次,从20到1是上行车次。每天的上、下行车次数各为244。
遗传算法求解时间窗车辆路径规划问题(附python代码) 本研究提出了一种基于遗传算法的车辆路径规划(VRP)问题求解框架,它能够有效地处理一系列复杂约束,包括软时间窗硬时间窗行驶距离限制车辆最大载重量多个配送中心的协调特定的配送顺序以及多种车型的选择。该框架的一个关键特点在于其与其他算法的结合潜力,特别是可以快速与模拟退火、领域搜索等算法快速结合,以便开发出混合优化算法,这一能力将进一步加强搜索效率和解的质量。本文主要介绍算法框架的编码、解码以及交叉变异等内容,并以一个简单实例论证框架的可行性。车辆路径问题(VRP)涉及服务一组客户,每个客户都有某些货物的需求。
基于python的三维装箱可视化 本文主要介绍两种基于python的三维装箱可视化能力,第一种是基于mpl_toolkits的静态三维可视化代码,另外一种是基于matplotlib的动态可视化代码。mpl_toolkits 是 matplotlib 库的一个模块集合,它包含了多个为 matplotlib 增加额外功能的工具包。这些工具包提供了扩展 matplotlib 标准功能的方法,允许用户绘制高级图表,以及为图表添加特别的特征和样式。Axes3D 是 mpl_toolkits.mplot3d 模块中的一个类,用于创建和处理三维坐标轴。
遗传算法求解车间调度问题(附python代码) 车间调度问题(Job Shop Scheduling Problem, JSSP)是一类经典的组合优化问题,它在制造业和生产管理中有着广泛的应用。JSSP 的目标是对车间中的一系列作业进行排程,以使得作业在不同机器上的加工顺序是最优的,达到某种特定的优化目标,比如最小化总的作业完成时间(即使得总完工时间尽可能短),或者最小化延迟时间、最大化产量等。车间调度问题通常被描述为一系列作业集合 J 和一系列机器集合 M,每个作业由一系列操作组成,每个操作需要在特定的机器上加工一定时间。
基于块生成&最大剩余空间的三维装箱算法 三维装箱问题(3D Bin Packing Problem,3D BPP)是一类组合优化问题。它涉及到将一定数量的三维物品放入一个或多个三维容器(称为“箱子”)中,同时遵循一定的约束,通常目标是最大化空间的利用率,这意味着希望尽可能的填满容器,减少浪费空间。三维装箱问题有很多变体,但大多数都包含以下几个基本特点和约束条件:(1)尺寸限制:每个物品和箱子都有明确的长、宽、高三个维度。(2)不重叠:箱内的物品间不能重叠,即每个物品都需要在箱子内有明确的位置,并且物品之间不能相互穿透。
Q-learning实战 Q-learningQ-learning是强化学习中一种入门级的经典算法。基本思想是对所有状态下的对应动作进行打分,依据最高的分值选择动作。打分的依据是Q表,其中存储了所有状态下动作的分值,Q表通过数据训练而来。Q-learning的优势在于融合了动态规划和蒙特卡洛,构造了时间差分的Q值更新公式,其更新公式如下:找房间问题问题代码#-----------------------------------调用模块-----------------------------------import
基于Gurobi的列生成算法 前言列生成算法是求解大规模线性规划的有效手段之一,对于难以直接求解的大规模线性规划问题,列生成在某些场景能够缩小问题规模,降低问题求解难度,在可接受的时间内精确求解问题。列生成的基本思路是将一个原问题从一个小的模型开始,即一开始只考虑模型的少量列(变量),然后通过建立子问题,寻找满足进基条件的列,将这些列添加到主模型,直到找不到能够进基的列,那么这个时候我们求解主模型得到的解将等同于包含所有变量的大规模线性问题的解。试想一下,对于某些生产实际问题,其决策变量可能达到百万甚至千万级,使用求解器直接求解的难度
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问题旨在寻找一种
Python调用Gurobi求解简单线性规划问题 前言Gurobi是一款功能强大的商用求解器,支持Python、C、C++、Java等多种语言调用,相比于Cplex,Gurobi封装更高,更加方便,但是对于初学者而言会更难一些。Gurobi与Cplex存在兼容,Gurobi生成的mps或者lp文件可以在CPlex中运行。另外,在校学生和教师可以免费使用Gurobi的学术版,求解规模和求解速度不受限制。本文将简单记录python调用Gurobi求解的过程。安装用户可以通过gurobi官网下载并安装软件:gurobi官网,下载软件后学生可通过学生认证获取
folium地图可视化 前言在python中使用folium包可以进行地图可视化操作,非常方便。folium官方地址为folium基本操作1 显示北京地图,北京的经纬度为[39.5427, 116.2317]。2 鼠标点击显示经纬度。3 添加标记4 以米为单位添加圆形标记5 以像素为单位添加圆形标记5 点击地图手动添加标记...
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
遗传算法(GA) 前言遗传算法是典型的智能算法,其本质也是通过不断搜索从而得到最好的解决方案,但是与随机搜索不同,遗传算法的搜索具有一定的智能性,在搜索时它更倾向于选择适应度更优的解决方案,以下是遗传算法的一个基本流程图:在上述基本遗传算法的基础上,可以在初始种群、个体选择、交叉方式、变异方式以及局部优化等方面作进一步调整,从而达到更好的效果。搜索类算法改进的本质基本都是让搜索具有全局性或者使得每次搜索的解更优质。构造使用遗传算法求解旅行商问题最主要的问题是编码和交叉,要保证交叉过程中尽量不产生坏解且交叉能够带来足
改进贪心算法 前言贪心算法很容易陷入局部最优,基本无法找到全局最优解,为了得到更好的解,可以考虑在贪心算法求得解的基础上,对解进行进一步改进,接下来将使用爬山法对贪心算法的解进行改进。爬山法爬山法是一种局部搜索方法,在有一个解决方案的基础上,我们可以对解决方案进行适当地改变,这种操作也称之为领域操作,如果改变后的解决方案优于改变前的解决方案,则保持这种改变,否则做还原操作。爬山法是典型的局部搜索算法,它只接受好的改变,拒绝坏的改变,这有很大的局限性。与之相对应的是模拟退火算法,他以一定的概率接受坏的改变,可以看作一
贪心算法(greedy algorithm) 前言贪心算法是最基础的启发算法之一,原理简单,操作方便,其基本思想是每一步都作出当前的最优决策,它基本能够保证解的质量不会太差,但是对于解空间足够大的组合优化问题,要找到最优解基本不可能。在TSP问题中,贪婪的定义是每次都从当前城市选择一个距离最近的城市。求解使用ortools求解TSP问题,与之前整数规划使用的为同一数据。import pandas as pdfrom ortools.linear_solver import pywraplp# 数据distance = pd.read_t
TSP问题 前言TSP问题是广为人知的组合优化问题,它易于描述,但是难以求解。基于TSP问题的特性,决定使用通过TSP问题来学习各类启发算法,比较不同启发算法在旅行商问题上的表现。问题TSP问题可以描述为:现有一些节点,节点和节点之间均可相连形成边,节点之间的边存在距离,需要找到一个遍历方案先后访问所有的点,使的遍历的总距离最短。模型旅行商问题可以建模为一个纯整数规划模型:目标函数最小化总距离,约束1-2保证每个节点都能进出一次,约束3保证不会出现多个圈,约束4-5保证便利顺序属于0~n-1,约束6-
or-tools求解最大流问题 前言最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。求最大流的标号算法最早由福特和福克逊于1956年提出,20世纪50年代Ford、(Fulkerson)建立的“网络流理论”,是网络应用的重要组成成分。下图为一个简单的网络流问题示意,共5个节点,编号为0、1、2、3、4,节点相连的边为可以通过的最大流量,箭头所指为流向,现欲求从节点0到节点4的最大流量。代码or-tools中提供了求解网络流问题的标准
or-tools求解指派问题 前言指派问题是生产生活中的常见问题,假设我们有m个工人,需要完成n项工作,每个工人最多完成一项任务,且每项任务必须指定一个工人完成,目标是最小化完成所有任务的成本。下图为指派问题的一个简单示意,左侧为工人,右侧为任务,连接标注了对应 工人完成对应任务的成本,表格为工人完成任务的成本的具体数据。代码from ortools.linear_solver import pywraplp# 求解器solver = pywraplp.Solver.CreateSolver('SCIP')# 数据