楼主: 我的素质低
5866 3

[Python] 〖探索python〗使用 Pyomo 解决复杂的问题(九) [推广有奖]

已卖:2774份资源

学术权威

83%

还不是VIP/贵宾

-

TA的文库  其他...

〖素质文库〗

结构方程模型

考研资料库

威望
8
论坛币
23391 个
通用积分
28308.6707
学术水平
2705 点
热心指数
2881 点
信用等级
2398 点
经验
228456 点
帖子
2968
精华
52
在线时间
2175 小时
注册时间
2012-11-24
最后登录
2024-1-13

一级伯乐勋章 初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章 中级信用勋章 高级学术勋章 高级热心勋章 高级信用勋章 特级学术勋章

楼主
我的素质低 学生认证  发表于 2015-4-7 19:08:15 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
来自IBM DEVELOPERWORKS

探索在 Python 中使用 Python Optimization Modeling Objects(Pyomo,一个开源工具)建模优化应用程序的方法。您可以使用 Pyomo 定义象征性的问题,创建具体的问题实例,并使用标准解算器解决这些实例。本系列文章将展示如何利用 Pyomo 的能力集成 Python 来建模优化应用程序。本系列的第一篇文章将介绍基础知识。第 2 部分将介绍如何添加更多工具和构建一种可伸缩的架构。第 3 部分将提供一些使用 IPython 和 pandas 进行投资分析和统计分析的实用示例。



简介




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



  • 解释现象
  • 进行预测
  • 评估关键因素
  • 识别极限
  • 分析折衷方法

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





入门





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

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

  1. noahs-MacBook-Air% python coopr_install
复制代码


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

  1. noahs-MacBook-Air% source coopr/bin/activate
复制代码


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

  1. (coopr)noahs-MacBook-Air% pyomo --help
复制代码


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



  • 使用 Pyomo 命令行工具:
    1. (coopr)noahs-MacBook-Air% pyomo my_problem.py --solver=glpk
    复制代码

  • 或者,将初始化代码嵌入您的脚本中,通过 Python 解释器运行它:清单 1. 在一个脚本中调用 Pyomo
    1. #This is an optional code path that allows the script to be run outside of
    2. #pyomo command-line.  For example:  python wyndor.py
    3. if __name__ == '__main__':
    4.    
    5.     #This replicates what the pyomo command-line tools does
    6.     from coopr.opt import SolverFactory
    7.     opt = SolverFactory("glpk")
    8.     instance = model.create()
    9.     results = opt.solve(instance)
    10.     #sends results to stdout
    11.     results.write()
    复制代码

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 优化问题的脚本:


清单 2. Wyndor Pyomo 基本示例
  1. """Wyndor model from Hillier and Hillier *Introduction to Management Science*

  2. One way to do it...
  3. Original Author dlw
  4. Modified ndg

  5. To run this you need pyomo and the glpk solver installed, and need to be
  6. inside of the virtual environment.
  7. When these dependencies are installed you can solve this way (glpk is default):
  8.    
  9.     pyomo wyndor.py

  10. """

  11. #Explicit importing makes it more clear what a user needs to define
  12. #versus what is included within the pyomo library
  13. from coopr.pyomo import (ConcreteModel, Objective, Var, NonNegativeReals,
  14.                               maximize, Constraint)

  15. Products = ['Doors', 'Windows']
  16. ProfitRate = {'Doors':300, 'Windows':500}
  17. Plants = ['Door Fab', 'Window Fab', 'Assembly']
  18. HoursAvailable = {'Door Fab':4, 'Window Fab':12, 'Assembly':18}
  19. HoursPerUnit = {('Doors','Door Fab'):1, ('Windows', 'Window Fab'):2,
  20.                 ('Doors','Assembly'):3, ('Windows', 'Assembly'):2,
  21.                 ('Windows', 'Door Fab'):0, ('Doors', 'Window Fab'):0}

  22. #Concrete Model
  23. model = ConcreteModel()
  24. #Decision Variables
  25. model.WeeklyProd = Var(Products, within=NonNegativeReals)

  26. #Objective
  27. model.obj = Objective(expr=
  28.             sum(ProfitRate[i] * model.WeeklyProd[i] for i in Products),
  29.             sense = maximize)

  30. def CapacityRule(model, p):
  31.     """User Defined Capacity Rule
  32.    
  33.     Accepts a pyomo Concrete Model as the first positional argument,
  34.     and and a plant index as a second positional argument
  35.     """
  36.    
  37.     return sum(HoursPerUnit[i,p] * model.WeeklyProd[i] for i in Products)
  38.           <= HoursAvailable[p]

  39. This statement is what Pyomo needs to generate one constraint for each plant
  40. model.Capacity = Constraint(Plants, rule = CapacityRule)

  41. #This is an optional code path that allows the script to be run outside of
  42. #pyomo command-line.  For example:  python wyndor.py
  43. if __name__ == '__main__':
  44.    
  45.     #This replicates what the pyomo command-line tools does
  46.     from coopr.opt import SolverFactory
  47.     opt = SolverFactory("glpk")
  48.     instance = model.create()
  49.     results = opt.solve(instance)
  50.     #sends results to stdout
  51.     results.write()
复制代码


让我们运行以下脚本:

  1. (coopr)noahs-MacBook-Air% pyomo wyndor.py
复制代码


Pyomo 返回以下输出,该输出显示了一个可行的解决方案(可实现 3,600 美元的利润):



清单 3. 一个可实现 3,600 美元的利润的可行解决方案
  1.     (coopr)noahs-MacBook-Air% pyomo wyndor.py  
  2. [    0.00] Setting up Pyomo environment
  3. [    0.00] Applying Pyomo preprocessing actions
  4. [    0.00] Creating model
  5. [    0.00] Applying solver
  6. [    0.01] Processing results
  7.     Number of solutions: 1
  8.     Solution Information
  9.       Gap: 0.0
  10.       Status: feasible
  11.       Function Value: 3600.0
  12.     Solver results file: results.json
  13. [    0.02] Applying Pyomo postprocessing actions
  14. [    0.02] Pyomo Finished
复制代码


我们看看您应生产的产品的比率。为此,对输出文件 results.json 运行 cat。结果如下:

  1. "Variable": {
  2.                 "WeeklyProd[Doors]": {
  3.                     "Id": 0,
  4.                     "Value": 2.0
  5.                 },
  6.                 "WeeklyProd[Windows]": {
  7.                     "Id": 1,
  8.                     "Value": 6.0
复制代码


在输出中,可以看到生产 6 个窗子和 2 个门会得到 3,600 美元的最大利润。

解决该脚本的另一种方法是使用 Python,这得益于所添加的条件语句。这会在脚本内调用 Pyomo,而不是使用 Pyomo 调用脚本。





启发式优化:贪婪的随机流动推销员




Bill Cook 编写的图书 In Pursuit of the Traveling Salesman: Mathematics at the Limits of Computation 中包含一个优秀的问题示例,该问题并不总是像线性程序一样得到良好扩展。这个问题就是流动推销员问题或 TSP:在给定一个城市列表的情况下,找出仅访问每个城市一次并且最后回到最初的城市的最短路线。随着城市数量的增多,在最坏情况下,解决流动推销员问题的时间会呈指数级增长。

图 2 中的图表模拟了解决每种可能的路线所需的时间,假设只需几秒即可解决几个城市的问题。如您所见,在您的有生之年解决这个问题很快就会变得行不通。

图 2. 流动推销员问题的解决时间呈指数级增长

您需要另一种方法来查找良好的 结果。通常,通过运行模拟,然后获取这些模拟的最佳结果,可以实现良好 但不一定最佳的解决方案。此方法的一个示例如下面的 Python 代码所示。随机选择一个开始城市,然后贪婪地 选择下一个具有最短距离的城市。这种模拟然后可运行多次,然后将得到这些模拟中的最短路径。



清单 4. 贪婪最短距离选择
  1. noahs-MacBook-Air% python tsp_greedy_random_start.py 20
  2. Running simulation 20 times
  3. Shortest Distance: 128
  4. Optimal Route: [
  5. ('PCG', 'GPS', 1),
  6. ('GPS', 'URS', 1),
  7. ('URS', 'WFC', 0),
  8. ('WFC', 'MCK', 2),
  9. ('MCK', 'SFO', 16),
  10. ('SFO', 'ORCL', 20),
  11. ('ORCL', 'HPQ', 12),
  12. ('HPQ', 'GOOG', 6),
  13. ('GOOG', 'AAPL', 11),
  14. ('AAPL', 'INTC', 8),
  15. ('INTC', 'CSCO', 6),
  16. ('CSCO', 'EBAY', 0),
  17. ('EBAY', 'SWY', 32),
  18. ('SWY', 'CVX', 13)
  19. ]
复制代码








二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python Pyomo OMO Optimization introduction python

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 100 + 100 + 5 + 5 + 5 精彩帖子
xddlovejiao1314 + 30 + 10 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 130  论坛币 + 110  学术水平 + 6  热心指数 + 6  信用等级 + 6   查看全部评分

本帖被以下文库推荐

心晴的时候,雨也是晴;心雨的时候,晴也是雨!
扣扣:407117636,欢迎一块儿吐槽!!

沙发
我的素质低 学生认证  发表于 2015-4-7 19:09:08
清单 5. TSP 贪婪随机起点
  1. #!/usr/bin/env python
  2. """
  3. Traveling salesman solution with random start and greedy path selection
  4. You can select how many iterations to run by doing the following:

  5. python tsp_greedy_random_start.py 20 #runs 20 times


  6. """

  7. import sys
  8. from random import choice
  9. import numpy as np
  10. from routes import values

  11. dt = np.dtype([('city_start', 'S10'), ('city_end', 'S10'), ('distance', int)])
  12. data_set = np.array(values,dtype=dt)

  13. def all_cities(mdarray):
  14.     """Takes a multi-dimensional array in this format and finds unique cities
  15.    
  16.     array([["A", "A"],
  17.     ["A", "B"]])
  18.    
  19.     """
  20.     cities = {}
  21.     city_set = set(data_set['city_end'])
  22.     for city in city_set:
  23.         cities[city] = ""
  24.     return cities
  25.    
  26. def randomize_city_start(all_cities):
  27.     """Returns a randomized city to start trip"""
  28.    
  29.     return choice(all_cities)

  30. def get_shortest_route(routes):
  31.     """Sort the list by distance and return shortest distance route"""

  32.     route = sorted(routes, key=lambda dist: dist[2]).pop(0)
  33.     return route

  34. def greedy_path():
  35.     """Select the next path to travel based on the shortest, nearest path"""

  36.     itinerary = []
  37.     cities = all_cities(data_set)
  38.     starting_city = randomize_city_start(cities.keys())
  39.     #print "starting_city: %s" % starting_city
  40.     cities_visited = {}
  41.     #we want to iterate through all cities once
  42.     count = 1
  43.     while True:
  44.         possible_routes = []
  45.         distance = []
  46.         #print "starting city: %s" % starting_city
  47.         for path in data_set:
  48.             if starting_city in path['city_start']:
  49.                 #we can't go to cities we have already visited
  50.                 if path['city_end'] in cities_visited:
  51.                     continue
  52.                 else:
  53.                     #print "path: ", path
  54.                     possible_routes.append(path)
  55.         
  56.         if not possible_routes:
  57.             break
  58.         #append this to itinerary
  59.         route = get_shortest_route(possible_routes)
  60.         #print "Route(%s): %s " % (count, route)
  61.         count += 1
  62.         itinerary.append(route)
  63.         #add this city to the visited city list
  64.         cities_visited[route[0]] = count
  65.         #print "cities_visited: %s " % cities_visited
  66.         #reset the starting_city to the next city
  67.         starting_city = route[1]
  68.         #print "itinerary: %s" % itinerary
  69.    
  70.     return itinerary

  71. def get_total_distance(complete_itinerary):
  72.    
  73.     distance = sum(z for x,y,z in complete_itinerary)
  74.     return distance

  75. def lowest_simulation(num):
  76.    
  77.     routes = {}
  78.     for i in range(num):
  79.         itinerary = greedy_path()
  80.         distance = get_total_distance(itinerary)
  81.         routes[distance] = itinerary
  82.     shortest_distance = min(routes.keys())
  83.     route = routes[shortest_distance]
  84.     return shortest_distance, route

  85. def main():
  86.     """runs everything"""
  87.    
  88.     if len(sys.argv) == 2:
  89.         iterations = int(sys.argv[1])
  90.         print "Running simulation %s times" % iterations
  91.         distance, route = lowest_simulation(iterations)
  92.         print "Shortest Distance: %s" % distance
  93.         print "Optimal Route: %s" % route
  94.     else:
  95.         #print "All Routes: %s" % data_set
  96.         itinerary = greedy_path()
  97.         print "itinerary: %s" % itinerary
  98.         print "Distance: %s" % get_total_distance(itinerary)
  99.    

  100. if __name__ == '__main__':
  101.    main()
复制代码


上述 TSP 脚本使用了一个 NumPy 多维数组作为数据来源。如果希望运行此示例,则需要安装 NumPy(参阅 参考资料)。该数组是在一个名为 routes.py 的文件中定义的。以下是可能的路线。

清单 6. 包含城市间路线的 NumPy 多维数组
  1. values = [
  2. ("AAPL", "CSCO", 14),
  3. ("AAPL", "CVX", 44),
  4. ("AAPL", "EBAY", 14),
  5. ("AAPL", "GOOG", 14),
  6. ("AAPL", "GPS", 59),
  7. ("AAPL", "HPQ", 14),
  8. ("AAPL", "INTC", 8),
  9. ("AAPL", "MCK", 60),
  10. ("AAPL", "ORCL", 26),
  11. ("AAPL", "PCG", 59),
  12. ("AAPL", "SFO", 46),
  13. ("AAPL", "SWY", 37),
  14. ("AAPL", "URS", 60),
  15. ("AAPL", "WFC", 60),

  16. ("CSCO","AAPL" ,14),
  17. ("CSCO", "CVX", 43),
  18. ("CSCO", "EBAY",0),
  19. ("CSCO", "GOOG",21),
  20. ("CSCO", "GPS",67),
  21. ("CSCO", "HPQ",26),
  22. ("CSCO", "INTC",6),
  23. ("CSCO", "MCK",68),
  24. ("CSCO", "ORCL",37),
  25. ("CSCO", "PCG",68),
  26. ("CSCO", "SFO",57),
  27. ("CSCO", "SWY",32),
  28. ("CSCO", "URS",68),
  29. ("CSCO", "WFC",68),

  30. ("CVX","AAPL" ,44),
  31. ("CVX", "CSCO",43),
  32. ("CVX", "EBAY",43),
  33. ("CVX", "GOOG",36),
  34. ("CVX", "GPS",43),
  35. ("CVX", "HPQ",40),
  36. ("CVX", "INTC",41),
  37. ("CVX", "MCK",46),
  38. ("CVX", "ORCL",39),
  39. ("CVX", "PCG",44),
  40. ("CVX", "SFO",45),
  41. ("CVX", "SWY",13),
  42. ("CVX", "URS",44),
  43. ("CVX", "WFC",44),

  44. ("EBAY","AAPL" ,14),
  45. ("EBAY", "CSCO",0),
  46. ("EBAY", "CVX",43),
  47. ("EBAY", "GOOG",21),
  48. ("EBAY", "GPS",67),
  49. ("EBAY", "HPQ",26),
  50. ("EBAY", "INTC",6),
  51. ("EBAY", "MCK",68),
  52. ("EBAY", "ORCL",37),
  53. ("EBAY", "PCG",68),
  54. ("EBAY", "SFO",57),
  55. ("EBAY", "SWY",32),
  56. ("EBAY", "URS",68),
  57. ("EBAY", "WFC",68),

  58. ("GOOG","AAPL",11),
  59. ("GOOG", "CSCO",21),
  60. ("GOOG", "CVX",36),
  61. ("GOOG", "EBAY",21),
  62. ("GOOG", "GPS",48),
  63. ("GOOG", "HPQ",6),
  64. ("GOOG", "INTC",15),
  65. ("GOOG", "MCK",49),
  66. ("GOOG", "ORCL",16),
  67. ("GOOG", "PCG",48),
  68. ("GOOG", "SFO",36),
  69. ("GOOG", "SWY",32),
  70. ("GOOG", "URS",49),
  71. ("GOOG", "WFC",49),

  72. ("GPS","AAPL" ,59),
  73. ("GPS", "CSCO",67),
  74. ("GPS", "CVX",43),
  75. ("GPS", "EBAY",67),
  76. ("GPS", "GOOG",48),
  77. ("GPS", "HPQ",45),
  78. ("GPS", "INTC",62),
  79. ("GPS", "MCK",03),
  80. ("GPS", "ORCL",34),
  81. ("GPS", "PCG",01),
  82. ("GPS", "SFO",18),
  83. ("GPS", "SWY",53),
  84. ("GPS", "URS",01),
  85. ("GPS", "WFC",01),

  86. ("HPQ","AAPL" ,14),
  87. ("HPQ", "CSCO",26),
  88. ("HPQ", "CVX",40),
  89. ("HPQ", "EBAY",26),
  90. ("HPQ", "GOOG",6),
  91. ("HPQ", "GPS",45),
  92. ("HPQ", "INTC",20),
  93. ("HPQ", "MCK",46),
  94. ("HPQ", "ORCL",12),
  95. ("HPQ", "PCG",46),
  96. ("HPQ", "SFO",32),
  97. ("HPQ", "SWY",37),
  98. ("HPQ", "URS",46),
  99. ("HPQ", "WFC",46),

  100. ("INTC","AAPL",8),
  101. ("INTC","CSCO",6),
  102. ("INTC", "CVX",41),
  103. ("INTC", "EBAY",6),
  104. ("INTC", "GOOG",15),
  105. ("INTC", "GPS",62),
  106. ("INTC", "HPQ",20),
  107. ("INTC", "MCK",63),
  108. ("INTC", "ORCL",31),
  109. ("INTC", "PCG",62),
  110. ("INTC", "SFO",51),
  111. ("INTC", "SWY",32),
  112. ("INTC", "URS",63),
  113. ("INTC", "WFC",63),

  114. ("MCK", "AAPL",60),
  115. ("MCK", "CSCO",68),
  116. ("MCK", "CVX",46),
  117. ("MCK", "EBAY",68),
  118. ("MCK", "GOOG",49),
  119. ("MCK", "GPS",03),
  120. ("MCK", "HPQ",46),
  121. ("MCK", "INTC",63),
  122. ("MCK", "ORCL",34),
  123. ("MCK", "PCG",3),
  124. ("MCK", "SFO",16),
  125. ("MCK", "SWY",56),
  126. ("MCK", "URS",3),
  127. ("MCK", "WFC",2),

  128. ("ORCL", "AAPL",22),
  129. ("ORCL", "CSCO",37),
  130. ("ORCL", "CVX",39),
  131. ("ORCL", "EBAY",37),
  132. ("ORCL", "GOOG",16),
  133. ("ORCL", "GPS",34),
  134. ("ORCL", "HPQ",12),
  135. ("ORCL", "INTC",31),
  136. ("ORCL", "MCK",34),
  137. ("ORCL", "PCG",35),
  138. ("ORCL", "SFO",20),
  139. ("ORCL", "SWY",40),
  140. ("ORCL", "URS",35),
  141. ("ORCL", "WFC",35),

  142. ("PCG", "AAPL",59),
  143. ("PCG", "CSCO",68),
  144. ("PCG", "CVX",44),
  145. ("PCG", "EBAY",68),
  146. ("PCG", "GOOG",48),
  147. ("PCG", "GPS",01),
  148. ("PCG", "HPQ",46),
  149. ("PCG", "INTC",62),
  150. ("PCG", "MCK",03),
  151. ("PCG", "ORCL",35),
  152. ("PCG", "SFO",18),
  153. ("PCG", "SWY",54),
  154. ("PCG", "URS",01),
  155. ("PCG", "WFC",01),

  156. ("SFO", "AAPL",46),
  157. ("SFO", "CSCO",57),
  158. ("SFO", "CVX",45),
  159. ("SFO", "EBAY",57),
  160. ("SFO", "GOOG",36),
  161. ("SFO", "GPS",18),
  162. ("SFO", "HPQ",32),
  163. ("SFO", "INTC",51),
  164. ("SFO", "MCK",16),
  165. ("SFO", "ORCL",20),
  166. ("SFO", "PCG",18),
  167. ("SFO", "SWY",52),
  168. ("SFO", "URS",18),
  169. ("SFO", "WFC",18),

  170. ("SWY", "AAPL",37),
  171. ("SWY", "CSCO",32),
  172. ("SWY", "CVX",13),
  173. ("SWY", "EBAY",32),
  174. ("SWY", "GOOG",32),
  175. ("SWY", "GPS",53),
  176. ("SWY", "HPQ",37),
  177. ("SWY", "INTC",32),
  178. ("SWY", "MCK",56),
  179. ("SWY", "ORCL",40),
  180. ("SWY", "PCG",54),
  181. ("SWY", "SFO",52),
  182. ("SWY", "URS",54),
  183. ("SWY", "WFC",54),

  184. ("URS", "AAPL",60),
  185. ("URS", "CSCO",68),
  186. ("URS", "CVX",44),
  187. ("URS", "EBAY",68),
  188. ("URS", "GOOG",49),
  189. ("URS", "GPS",01),
  190. ("URS", "HPQ",46),
  191. ("URS", "INTC",63),
  192. ("URS", "MCK",03),
  193. ("URS", "ORCL",35),
  194. ("URS", "PCG",01),
  195. ("URS", "SFO",18),
  196. ("URS", "SWY",54),
  197. ("URS", "WFC",0),

  198. ("WFC", "AAPL",60),
  199. ("WFC", "CSCO",68),
  200. ("WFC", "CVX",44),
  201. ("WFC", "EBAY",68),
  202. ("WFC", "GOOG",49),
  203. ("WFC", "GPS",01),
  204. ("WFC", "HPQ",46),
  205. ("WFC", "INTC",63),
  206. ("WFC", "MCK",02),
  207. ("WFC", "ORCL",35),
  208. ("WFC", "PCG",01),
  209. ("WFC", "SFO",18),
  210. ("WFC", "SWY",54),
  211. ("WFC", "URS",0),

  212. ]
复制代码


已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
xddlovejiao1314 + 100 + 100 + 5 + 5 + 5 精彩帖子
niuniuyiwan + 100 + 100 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 200  论坛币 + 200  学术水平 + 10  热心指数 + 10  信用等级 + 10   查看全部评分

心晴的时候,雨也是晴;心雨的时候,晴也是雨!
扣扣:407117636,欢迎一块儿吐槽!!

藤椅
wujianjack2 发表于 2015-12-30 23:55:52
   pyomo不错,和我喜欢的AMPL接合得紧密,就是model生成慢多了,倒是方便,功能也很强大。
   对称TSP求解这个例子倒不宜做pyomo使用的例子,这种问题用concorde, lkh解决就方便多了,而且milp这种模型构建大多数工具都能做啦。
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
xddlovejiao1314 + 50 + 20 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 50  论坛币 + 20  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
xddlovejiao1314 学生认证  发表于 2016-1-3 10:07:09
感谢分享。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-23 00:55