ortools解决tsp_使用 Pyomo 解决复杂的问题

本文介绍了使用 Python 中的 Pyomo 库解决旅行商问题(TSP)的基础知识。通过示例展示了如何建模、设置目标和约束,并提供了 Wyndor 产品组合问题的线性优化解决方案。此外,还探讨了如何通过贪婪的随机流动推销员算法处理不适用于线性程序的复杂问题,如 TSP。
摘要由CSDN通过智能技术生成

简介

建模是一种解决复杂问题的强大方法。依据图书Modeling Languages in Mathematical Optimization(参阅参考资料)的叙述,模型用于:

解释现象

进行预测

评估关键因素

识别极限

分析折衷方法

在业界,Microsoft® Excel 等电子表格软件常常是建模问题的首要选择。现在,电子表格通常非常直观,但它们在解决大型问题上存在着局限性。如果您是开发人员,那么您可能会发现编写脚本来解决建模问题会更有效,因为您可以轻松地将脚本集成到其他系统中。本文将介绍使用 Pyomo 库在 Python 应用中实现线性优化的基础知识。

入门

首先要安装 Pyomo。Pyomo 是 Coopr 的一个中心组件,而 Coopr 是 Python 软件包的集合。您可以下载 coopr_install 脚本,在使用 Python 解释器运行它时,它会创建一个 Python 虚拟环境。

创建一个名为 “coopr” 的相对目录:

noahs-MacBook-Air% python coopr_installShow moreShow more icon

使用下面的命令启动 Pyomo,这会将该相对目录和它的可执行文件放在您的路径中:

noahs-MacBook-Air% source coopr/bin/activateShow moreShow more icon

使用 Pyomo “--help” 命令获取使用 pyomo 的帮助:

(coopr)noahs-MacBook-Air% pyomo --helpShow moreShow more icon

您需要一个编译器来使用虚拟 Python 环境构建器 (virtualenv) 和 Pyomo。在 OS X 上,使用 XCode Developer Tools 命令行工具。在 Linux 上,使用 GNU Compiler Collection (GCC)。初始化这个虚拟环境后,可通过以下两种方式之一使用 Pyomo 解决问题:

使用 Pyomo 命令行工具:

(coopr)noahs-MacBook-Air% pyomo my_problem.py --solver=glpkShow moreShow more icon

或者,将初始化代码嵌入您的脚本中,通过 Python 解释器运行它:

在一个脚本中调用 Pyomo

#This is an optional code path that allows the script to be run outside of

#pyomo command-line. For example: python wyndor.py

if __name__ == '__main__':

#This replicates what the pyomo command-line tools does

from coopr.opt import SolverFactory

opt = SolverFactory("glpk")

instance = model.create()

results = opt.solve(instance)

#sends results to stdout

results.write()Show moreShow more icon

Pyomo 假设您至少安装了一个解算器 (solver)。GNU Linear Programming Kit (glpk) 是默认的解算器。请参阅您希望使用的解算器的安装说明。然后确保 Pyomo 能够在它的路径上找到此解算器。

建模策略

可通过两种方式使用 Pyomo 创建数据模型:抽象方式和具体方式。二者的关键区别在于是否将模型与数据分开。

在抽象模型中,模型与数据是分开的。

在具体模型中,是在模型本身中定义数据的。例如,在使用具体模型的 Pyomo 脚本中,所有内容都是在单个脚本文件中定义的。对于更简单的问题,尤其是教学问题,这可能是一种很高效的方法。但在另一方面,更大的问题通常是拥有更大的数据集,这使得将数据和处理该数据所需的代码嵌入同一个脚本中变得不切实际。

从总体上讲,Pyomo 模型由变量(variables)、目标(objectives)和约束(constraints)组成。

变量是在优化期间计算的值。

目标是获取数据和变量的 Python 函数,它要么是最大值,要么是最小值。

约束是定义表达式来限制变量可使用的值的一种方式。

在创建 Pyomo 模型时,需要了解表示代数表达式的 Python 方法。下面的摘要简单对比了电子表格、代数和 Python 中的表达式:

图 1. 符号对比表

Pyomo 应用程序示例:Wyndor

为了演示使用 Pyomo 时的一个简单的线性优化问题,我们以图书 Introduction to Management Science 中的一个产品组合问题为例(参阅参考资料)。Wyndor 工厂负责生产门窗,它的三个厂房有不同的营业时间,可以生产门或窗。要确定如何最大程度地提高有限生产时间内的可用利润,可以编写以下脚本。该脚本包含三个主要部分:模型、目标和约束。

模型(一个具体模型)实例化问题的数据,比如厂房的营业时间。

目标(可以是最大值或最小值)是最大的利润。

约束使用了一个 CapacityRule 函数,该函数使用一种称为列表推导式的 Python 语言来编写。

以下是 Wyndor 优化问题的脚本:

Wyndor Pyomo 基本示例

"""Wyndor model from Hillier and Hillier *Introduction to Management Science*

One way to do it...

Original Author dlw

Modified ndg

To run this you need pyomo and the glpk solver installed, and need to be

inside of the virtual environment.

When these dependencies are installed you can solve this way (glpk is default):

pyomo wyndor.py

"""

#Explicit importing makes it more clear what a user needs to define

#versus what is included within the pyomo library

from coopr.pyomo import (ConcreteModel, Objective, Var, NonNegativeReals,

maximize, Constraint)

Products = ['Doors', 'Windows']

ProfitRate = {'Doors':300, 'Windows':500}

Plants = ['Door Fab', 'Window Fab', 'Assembly']

HoursAvailable = {'Door Fab':4, 'Window Fab':12, 'Assembly':18}

HoursPerUnit = {('Doors','Door Fab'):1, ('Windows', 'Window Fab'):2,

('Doors','Assembly'):3, ('Windows', 'Assembly'):2,

('Windows', 'Door Fab'):0, ('Doors', 'Window Fab'):0}

#Concret

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值