在本节,可以通过如何开始用Python调用or tools:
* 什么是优化问题
* 怎么用Python解决优化问题
* 更多Python 案例
* 定义优化问题的类型
什么是优化问题?
优化问题目标是在一个问题的解空间里找到一个最优解。
典型的案例就是车辆运输问题,解决打包及路径成本最小的问题。
对于优化问题是通用的两个部分如下,
* 目标。目标包含两个部分,① 目标的名称 ② 目标函数。
目标名称
名称必须是可量化,会以量词结尾。在日常工作通常是节省了 xx pd,工时,¥ 等。
目标函数
目标函数就是对目标的结构公式表达。公式化表达前需要对目标的构成进行合理的拆解。
约束条件
约束条件是在解决问题时,必须在特定限制条件下完成。(约束条件是在什么实例上的,是优化的目标还是输入?暂时没有定论,具体问题具体分析,是不是可列举的?)比如简单线性规划中,我们对x,y 有一定的约束,但是如果最终的obj必须也要在合理范围内?我们带着这些开始继续学习。
在解决优化问题时,我们必须先定义出优化的目标函数和约束条件。
案例
① 目标名称:成本。车辆运输问题,优化的目标量词是成本,结项报告中应当体现出节省了 xx ¥。
② 目标函数:组成部分包含了 打包、路线成本。两部分成本。第一级拆解就会分为打包+路线。
③ 约束条件:比如,卡车的装载量必须是< m 的。
通过python 来接优化问题。
接下来通过一个案例来学习如何使用Python + ortools 解决优化问题。
线性规划。
简单的表达式如下,最大化目标函数 3x+y,约束条件如下,
# 导入包
from ortools.linear_solver import pywraplp
# 创建GLOP计算后端
* 声明 solver
solver = pywraplp.Solver.CreateSolver('GLOP')#固定的写法吗?
# 创建变量
x = solver.NumVar(0,1,'x')
y = solver.NumVar(0,2,'y')
print('Number of variables = ' ,solver.NumVariables())
# 声明约束条件
创建线性约束
ct = solver.Constraint(0,2,'ct')
# 0<= x+y<=2
ct.SetCoefficient(x,1)
ct.SetCoefficient(y,1)
print('Number of variables = ' ,solver.NumConstraints())
# 创建目标函数
obj = solver.Objective()
obj.SetCoefficient(x,3)
obj.SetCoefficient(y,1)
obj.SetMaximization()
solver.Solve()
print('Soluton: ')
print('Obj val = ',obj.Value())
print('x=',x.solution_value())
print('y=',y.solution_value())
优化问题的类型
优化问题有很多种,不同类型有不同的算法来求最优解,在解决问题之前,首先必须明确问题的类型,选择解问题的算法。
or-tools 针对不同的问题提供了不同的解。(边界问题,如何将一个问题定义成该问题,而不是另外的一种呢?有明确的边界吗?在学习的过程中,我们应该寻找这种边界)
- 线性规划
- 约束规划
- 整数规划
- 打包
- 网络流
- 分配
- 调度
- 路由
线性规划
线性规划最重要的是,目标函数 & 约束条件都是线性的关系。即我们目标可以用输入线性表达,约束条件也是ax+b的线性关系式。
约束规划
约束规划是在可枚举的解空间里找到可行解,对比目标函数后决策使用。目的是在一定约束下的可行解,而不是目标函数。不要求最终的结果是最优的。
整数规划
是要求输入的变量部分或者全部是整数。
打包
① 容器有N种,不同的体积
② 物品有M种,不同的体积
目标就是再现有容器中尽可能装更多的货物。
网络流问题
许多优化问题可以用由节点和节点之间的有向图表示。 例如,货物通过铁路网络运输的运输问题可以用曲线表示,其中弧线是铁路线,节点是配送中心。 在最大流问题中,每条弧都有一个可以通过它运输的最大容量。 问题是分配每个弧上要运输的货物数量,以便运输的总量尽可能大。
分配问题
分配问题涉及将一组代理(例如,工人或机器)分配给一组任务,其中将每个代理分配给特定任务的成本是固定的。 问题是找到总成本最低的分配。 分配问题实际上是网络流问题的一个特例。
调度问题
调度问题涉及分配资源以在特定时间执行一组任务。 一个重要的例子是作业车间问题,其中在多台机器上处理多个作业。 每个作业都由一系列任务组成,这些任务必须按给定的顺序执行,并且每个任务都必须在特定的机器上进行处理。 问题是分配一个时间表,以便在尽可能短的时间间隔内完成所有作业。
路由问题
路由问题涉及为车队寻找最佳路线以穿越由有向图定义的网络。 比如 旅行商问题。