运筹学学习笔记2 python-or tools 使用

本文介绍了优化问题的基本概念,如何用Python特别是ortools库解决线性规划问题,包括目标函数定义、约束条件设置和实际案例演示。涵盖了线性规划、约束规划、整数规划等优化问题类型及其在Python中的应用。
摘要由CSDN通过智能技术生成

在本节,可以通过如何开始用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 针对不同的问题提供了不同的解。(边界问题,如何将一个问题定义成该问题,而不是另外的一种呢?有明确的边界吗?在学习的过程中,我们应该寻找这种边界)

  1. 线性规划
  2. 约束规划
  3. 整数规划
  4. 打包
  5. 网络流
  6. 分配
  7. 调度
  8. 路由

线性规划

线性规划最重要的是,目标函数 & 约束条件都是线性的关系。即我们目标可以用输入线性表达,约束条件也是ax+b的线性关系式。

约束规划

约束规划是在可枚举的解空间里找到可行解,对比目标函数后决策使用。目的是在一定约束下的可行解,而不是目标函数。不要求最终的结果是最优的。

整数规划

是要求输入的变量部分或者全部是整数。

打包

① 容器有N种,不同的体积

② 物品有M种,不同的体积

目标就是再现有容器中尽可能装更多的货物。

网络流问题

许多优化问题可以用由节点和节点之间的有向图表示。 例如,货物通过铁路网络运输的运输问题可以用曲线表示,其中弧线是铁路线,节点是配送中心。 在最大流问题中,每条弧都有一个可以通过它运输的最大容量。 问题是分配每个弧上要运输的货物数量,以便运输的总量尽可能大。

分配问题

分配问题涉及将一组代理(例如,工人或机器)分配给一组任务,其中将每个代理分配给特定任务的成本是固定的。 问题是找到总成本最低的分配。 分配问题实际上是网络流问题的一个特例。

调度问题

调度问题涉及分配资源以在特定时间执行一组任务。 一个重要的例子是作业车间问题,其中在多台机器上处理多个作业。 每个作业都由一系列任务组成,这些任务必须按给定的顺序执行,并且每个任务都必须在特定的机器上进行处理。 问题是分配一个时间表,以便在尽可能短的时间间隔内完成所有作业。

路由问题

路由问题涉及为车队寻找最佳路线以穿越由有向图定义的网络。 比如 旅行商问题。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值