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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 运筹优化问题有时候极其复杂,我们可以使用运筹优化工具库帮助数学建模,解决复杂的最优化问题,本文介绍几个常见的运筹优化工具库。

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

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可以用于通过部分最优运输来估计无标签样本中正样本和负样本的比例,并且可以利用最优运输距离来定义损失函数和正则化项。

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

相关文章
|
7月前
|
算法 Java Apache
|
4月前
|
数据可视化 数据挖掘 Java
提升代码质量与效率的利器——SonarQube静态代码分析工具从数据到洞察:探索Python数据分析与科学计算库
在现代软件开发中,保证代码质量是至关重要的。本文将介绍SonarQube静态代码分析工具的概念及其实践应用。通过使用SonarQube,开发团队可以及时发现和修复代码中的问题,提高代码质量,从而加速开发过程并减少后期维护成本。 在当今信息爆炸的时代,数据分析和科学计算成为了决策和创新的核心。本文将介绍Python中强大的数据分析与科学计算库,包括NumPy、Pandas和Matplotlib,帮助读者快速掌握这些工具的基本用法和应用场景。无论是数据处理、可视化还是统计分析,Python提供了丰富的功能和灵活性,使得数据分析变得更加简便高效。
|
8月前
|
运维 监控 算法
优化电脑屏幕监控软件:关联规则挖掘算法的引入
在如今的职场中,电脑屏幕监控软件已经成为了许多企业的标配,用于监测员工的工作行为以提高生产力和安全性。然而,为了让监控软件发挥最大的效用,关联规则挖掘算法正在崭露头角。接下来就让我们通过以下方面来看看如何通过关联规则挖掘算法提高电脑屏幕监控软件的监视效率——
160 0
|
2月前
|
存储 缓存 安全
【C/C++ 项目优化实战】 分享几种基础且高效的策略优化和提升代码性能
【C/C++ 项目优化实战】 分享几种基础且高效的策略优化和提升代码性能
65 0
|
8月前
|
编解码 监控 算法
文档管理软件中的精度优化:蝶行算法的崭露头角
蝶行算法是一种基于蝴蝶飞行的优化算法,其主要思想是模拟蝴蝶在寻找食物时的飞行路径,通过不断调整飞行方向和速度,最终找到最优解。
209 1
|
8月前
|
监控 数据可视化 算法
可视化分析算法:文档管理软件性能提升的关键
在文档管理软件中,可视化分析算法可以用于性能分析与优化,可以帮助提高用户体验、减少资源浪费和提高系统的效率。以下是一些步骤和方法,可以帮助你进行这方面的工作——
118 1
|
9月前
|
监控 算法 安全
转:文档管理系统中如何利用巴伐利亚算法实现高效使用
巴伐利亚算法(Bavarian Sketching)是一种基于哈希表的数据结构,可以高效地实现近似计数和查询。
52 0
|
9月前
|
监控 算法
转:如何使用模糊算法提高监控软件的性能
如何才能提高监控软件的性能呢?其实,咱们可以通过模糊算法从各个角度着手,让监控系统变得更聪明更高效。模糊逻辑就是那种对付那些有点儿模糊不太确定信息的法宝,它在解决一些莫名其妙的情况时可是大显身手。在监控软件的世界里,模糊逻辑也是个大明星,可以帮助我们做出更明智的决策和更敏捷的响应,然后整个系统就会变得特别厉害!
47 0
|
12月前
|
数据采集 缓存 Python
如何多方面的优化python爬虫程序速度
如何多方面的优化python爬虫程序速度