运筹优化工具库介绍(一)

科技   2024-11-14 20:33   德国  

运筹优化问题有时候极其复杂,我们可以使用运筹优化工具库帮助数学建模,解决复杂的最优化问题,本文介绍几个常见的运筹优化工具库。

cplex

CPLEX是IBM公司开发的一款商业版的优化引擎,可以用于求解线性规划、二次规划、带约束的二次规划、二阶锥规划等四类基本问题,以及相应的混合整数规划问题。它有免费的社区版,可以用C++, Python, Java等语言调用。它也提供了一个Excel插件和一个交互式优化器。

CPLEX具有高性能、灵活性和可扩展性,可以实现决策优化,从而提高效率、降低成本并提升盈利能力。它还支持多目标优化和并行优化。
使用CPLEX建立和求解优化模型有多种方法,比如:
  • 使用CPLEX的应用程序编程接口(API):这是一种直接在编程语言中调用CPLEX的方法,可以利用编程语言的功能和灵活性。你可以用C++, Python, Java等语言编写优化模型和算法,并调用CPLEX的函数来求解。你需要先安装CPLEX的库文件,并在代码中引入相应的头文件或模块。 

  • 使用建模语言:这是一种用专门的语法来描述优化模型的方法,可以简化模型的表达和求解。你可以用OPL, AMPL, GAMS等建模语言来定义变量、约束、目标函数等,并调用CPLEX作为求解器。你需要先安装建模语言的软件,并在代码中指定使用CPLEX。 

gurobi

Gurobi是由美国开发的新一代大规模优化器,可以用于求解线性规划、二次规划、混合整数规划、非线性规划等多种优化问题。它有免费的学术版,可以用Python, C++, Java等语言调用。Gurobi具有高效、稳定、可靠的特点,可以实现快速的求解和精确的结果。它还支持分布式计算和云计算。

ortools

OR-Tools是Google开源的运筹优化的工具,旨在从大量可能的解决方案中寻找最佳的解决方案。它可以解决车辆路径、流量、整数和线性规划以及约束编程等问题。
OR-Tools提供了C++, Python, Java, .NET等语言的接口,可以用这些语言来建立和求解优化模型。它也提供了统一接口封装来调用商业求解器如Gurobi, CPLEX等,也包括开源求解器如GLPK, CBC等。

pulp

PuLP是用Python写的一个线性规划(Linear Programming, LP)问题求解库。它的主要作用是将优化问题描述为数学模型,生成MPS或者LP文件,然后调用LP求解器,如CBC、GLPK、CPLEX、Gurobi等来进行求解。
PuLP可以方便地用Python语法来定义变量、约束、目标函数等,并提供了多种方法来创建和修改模型。它也支持多种类型的变量,如连续变量、整数变量、二进制变量等。

geatpy

Geatpy由华南农业大学、暨南大学、华南理工等本硕博学生联合团队开发的。Geatpy是一个高性能实用型进化算法工具箱,提供许多已实现的进化算法中各项重要操作的库函数,并提供一个高度模块化、耦合度低的面向对象的进化算法框架。它可以用Python语言来定义优化问题,利用“定义-优化-分析”三步法来求解复杂优化问题。Geatpy采用自研高性能矩阵库,可以快速地进行矩阵运算和数据处理。它也支持多种类型的编码方式,如二进制编码、格雷编码、排列编码等。使用Geatpy建立和求解进化算法模型的一般步骤如下:
  • 定义优化问题,包括变量的范围、约束条件、目标函数等。
  • 选择合适的编码方式,如二进制编码、排列编码等,以及相应的交叉、变异、选择等算子。
  • 创建一个遗传算法模板类的对象,并设置相关的参数,如种群规模、进化代数、交叉概率等。 
  • 调用遗传算法模板类的run()方法来执行进化过程,并获取最优解和目标函数值。 
  • 分析和展示优化结果,如绘制收敛曲线、评价指标等。

pyomo

Pyomo是一个基于python的开源软件包,它支持一套多样化的优化功能,用于构造、求解和分析最优化模型。Pyomo的核心功能是对结构化的最优化应用进行建模。Pyomo可用于定义一般符号问题(general symbolic problems),创建特定问题实例,并使用商业化的或者开源的求解器来求解这些实例。Pyomo支持多种问题类型,包括:线性规划、非线性规划、混合整数规划、随机规划、微分代数方程约束优化 Pyomo利用了Python语言的灵活性和表达力,可以方便地定义复杂的模型和算法。Pyomo还提供了一些高级工具,如随机规划求解程序、敏感性分析工具等。

scipy

Scipy是一个基于python的开源科学计算库,它提供了一些用于求解最优化问题的函数和方法。Scipy.optimize是Scipy中一个用于解决数学模型中优化类模型的子包,该子包中又包含了多个子功能模块,不同方法不同条件求解最优化模型。Scipy.optimize中的minimize函数是一个通用的最优化函数,它可以接受多种参数和选项,以适应不同类型和规模的问题。
minimize函数的一般形式如下:
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
其中:
  • fun:目标函数
  • x0:初始值 
  • args:传递给目标函数和约束函数的额外参数
  • method:求解方法,如’SLSQP’、'COBYLA’
  • jac:目标函数的梯度或者梯度计算函数
  • hess:目标函数的海森矩阵或者海森矩阵计算函数
  • hessp:目标函数的海森矩阵乘以向量p或者海森矩阵乘以向量p计算函数 
  • bounds:变量的边界约束,元组列表形式 
  • constraints:其他约束条件,字典列表形式 
  • tol:终止条件的容差值 
  • callback:回调函数,在每次迭代后调用 
  • options:其他选项,字典形式 
minimize函数返回一个OptimizeResult对象,包含以下属性: 
  • x:最优解 
  • success:是否成功找到最优解 
  • status:终止状态码 
  • message:终止原因描述信息 
  • fun:最小目标值
  • jac:最小点处梯度值(如果可用) 
  • hess: 最小点处海森矩阵(如果可用) 
  • nfev: 目标值评估次数

cvxpy

CVXPY是一个用于凸优化问题的Python嵌入式建模语言。它可以让你用一种自然的方式来表达你的问题,而不是用求解器要求的限制性的标准形式。例如,下面的代码可以求解一个带有盒约束的最小二乘问题:
import cvxpy as cp
import numpy as np

# Generate data.
m = 20
n = 15
np.random.seed(1)
A = np.random.randn(m, n)
b = np.random.randn(m)
# Define and solve the CVXPY problem.
x = cp.Variable(n)
cost = cp.sum_squares(A @ x - b)
prob = cp.Problem(cp.Minimize(cost), [0 <= x, x <= 1])
prob.solve()
# Print result.
print("\nThe optimal value is", prob.value)
print("The optimal x is")
print(x.value)
print("The norm of the residual is ", cp.norm(A @ x - b, p=2).value)
CVXPY支持多种求解器和算法,可以处理线性、二次、半正定、非线性等类型的凸优化问题。CVXPY还提供了一些高级功能,如分布式优化、参数化问题、原始-对偶方法等。

pyvrp

pyvrp是2023年开发的一个开源的车辆路径规划问题求解器,使用了元启发式算法。它可以处理多种类型的车辆路径规划问题,如有容量限制的VRP、多仓库VRP、带时间窗的VRP、同质或异质车队的VRP、有限或无限车队的VRP、开放或闭合路径的VRP、TSP和mTSP等。你可以使用pip命令来安装pyvrp,也可以从源代码进行安装。pyvrp官网提供了一些文档和示例来帮助你使用它。pyvrp比较新,官网的介绍不够详细。

jsprit

jsprit是一个基于java的开源工具包,用于解决丰富的旅行商问题(TSP)和车辆路径问题(VRP)。它轻量级、灵活、易用,基于一种通用的元启发式算法。它可以解决带有不同约束的车辆路径规划问题。

OptaPlanner

OptaPlanner是一个基于java的开源约束求解器,可以优化各种规划和优化问题,例如员工排班、车辆路径规划、任务分配等。它是一种轻量级、可嵌入的约束满足引擎,可以解决复杂的规划问题。
OptaPlanner可以在Java11或更高版本上运行,并且可以很容易地与其他Java技术集成。它支持多种JVM语言和平台。它也提供了丰富的文档和示例来帮助用户学习和使用。

Scikit-opt

Scikit-opt这个库提供了一些常见的元启发式算法,例如遗传算法、粒子群优化、模拟退火等,可以用于求解非线性规划、整数规划等问题。

pot

POT (Python Optimal Transport)是一个用于求解最优运输问题的Python库。最优运输问题是一种在两个概率分布之间寻找最低成本映射的问题,它有许多应用,例如图像处理、机器学习、计算机视觉等。

  • 领域自适应:这是一种在不同的数据分布之间转移知识的技术。POT可以用于通过最优运输来对齐源域和目标域的特征分布,从而提高分类或回归的性能。

  • 形状匹配:这是一种在计算机视觉中寻找两个形状之间相似性的技术。POT可以用于通过最优运输来建立形状之间的对应关系,并且可以加入拉普拉斯正则化来保持形状的拓扑结构。

  • 测度聚类:这是一种在概率测度空间中进行聚类分析的技术。POT可以用于通过切片或拉东Wasserstein距离来定义测度之间的相似性,并且可以求解测度的Wasserstein重心作为聚类中心。

  • 正负无标签学习:这是一种在只有正样本和无标签样本的情况下进行分类学习的技术。POT可以用于通过部分最优运输来估计无标签样本中正样本和负样本的比例,并且可以利用最优运输距离来定义损失函数和正则化项。

还有许多运筹优化库,后续继续更新介绍。

微信公众号后台回复

加群:加入全球华人OR|AI|DS社区硕博微信学术群

资料:免费获得大量运筹学相关学习资料

人才库:加入运筹精英人才库,获得独家职位推荐

电子书:免费获取平台小编独家创作的优化理论、运筹实践和数据科学电子书,持续更新中ing...

加入我们:加入「运筹OR帷幄」,参与内容创作平台运营

知识星球:加入「运筹OR帷幄」数据算法社区,免费参与每周「领读计划」、「行业inTalk」、「OR会客厅」等直播活动,与数百位签约大V进行在线交流



                    


        




文章须知

文章作者:用户007

微信编辑:疑疑

文章转载自『Python学习杂记』公众号,原文链接: 运筹优化工具库介绍(一)





关注我们 

       FOLLOW US


































运筹OR帷幄
致力于成为全球最大的运筹学中文线上社区
 最新文章