运筹优化库PyMathProg使用介绍

科技   2024-10-20 20:02   德国  

PyMathProg是Python里的一个优化求解工具。它具备建模、求解、分析等功能,在Python中使用非常方便。

安装

pip install pymprog

基础案例

pymprog建模非常简洁明了,现在给一个基础案例。

from pymprog import *
begin('模型1')
x, y = var('x, y'# 变量设定
maximize(15 * x + 10 * y, '目标函数')
x <= 3 # 约束1
y <= 4 # 约束2
x+ y <= 5 # 约束3
solve()
print("目标: %g"%vobj())
print("x: %g,y:%g"%(x.primal,y.primal))

输出结果:

目标: 65
x: 3,y:2

求解器调用

pymprog里自带了几个求解器,可以根据问题类型不同,切换不同的求解器。 可供使用的四个求解器simplex、exact、interior、intopt。前三个适用于求解线性规划,而 intopt适用于求解整数程序。 可以使用代码选定求解器。

经典问题求解:旅行商问题

旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。

from __future__ import print_function

n = 16 #number of nodes
V = range(1,n+1) #set of notes
#cost or each arc, format: (start, end):cost
c = {(1,2):509, (1,3):501, (1,4):312, (1,5):1019, (1,6):736, (1,7):656, 
     (1,8): 60, (1,9):1039, (1,10):726, (1,11):2314, (1,12):479, 
     (1,13):448, (1,14):479, (1,15):619, (1,16):150, 
(2,1):509, (2,3):126, (2,4):474, (2,5):1526, (2,6):1226, (2,7):1133, 
     (2,8):532, (2,9):1449, (2,10):1122, (2,11):2789, (2,12):958, 
     (2,13):941, (2,14):978, (2,15):1127, (2,16):542, 
(3,1):501, (3,2):126, (3,4):541, (3,5):1516, (3,6):1184, (3,7):1084, 
     (3,8):536, (3,9):1371, (3,10):1045, (3,11):2728, (3,12):913, 
     (3,13):904, (3,14):946, (3,15):1115, (3,16):499, 
(4,1):312, (4,2):474, (4,3):541, (4,5):1157, (4,6):980, (4,7):919, 
     (4,8):271, (4,9):1333, (4,10):1029, (4,11):2553, (4,12):751, 
     (4,13):704, (4,14):720, (4,15):783, (4,16):455, 
(5,1):1019, (5,2):1526, (5,3):1516, (5,4):1157, (5,6):478, (5,7):583, 
     (5,8):996, (5,9):858, (5,10):855, (5,11):1504, (5,12):677, 
     (5,13):651, (5,14):600, (5,15):401, (5,16):1033, 
(6,1):736, (6,2):1226, (6,3):1184, (6,4):980, (6,5):478, (6,7):115, 
     (6,8):740, (6,9):470, (6,10):379, (6,11):1581, (6,12):271, 
     (6,13):289, (6,14):261, (6,15):308, (6,16):687, 
(7,1):656, (7,2):1133, (7,3):1084, (7,4):919, (7,5):583, (7,6):115, 
     (7,8):667, (7,9):455, (7,10):288, (7,11):1661, (7,12):177, 
     (7,13):216, (7,14):207, (7,15):343, (7,16):592, 
(8,1): 60, (8,2):532, (8,3):536, (8,4):271, (8,5):996, (8,6):740, 
     (8,7):667, (8,9):1066, (8,10):759, (8,11):2320, (8,12):493, 
     (8,13):454, (8,14):479, (8,15):598, (8,16):206, 
(9,1):1039, (9,2):1449, (9,3):1371, (9,4):1333, (9,5):858, (9,6):470, 
     (9,7):455, (9,8):1066, (9,10):328, (9,11):1387, (9,12):591, 
     (9,13):650, (9,14):656, (9,15):776, (9,16):933, 
(10,1):726, (10,2):1122, (10,3):1045, (10,4):1029, (10,5):855, 
     (10,6):379, (10,7):288, (10,8):759, (10,9):328, (10,11):1697, 
     (10,12):333, (10,13):400, (10,14):427, (10,15):622, (10,16):610, 
(11,1):2314, (11,2):2789, (11,3):2728, (11,4):2553, (11,5):1504, 
     (11,6):1581, (11,7):1661, (11,8):2320, (11,9):1387, (11,10):1697, 
     (11,12):1838, (11,13):1868, (11,14):1841, (11,15):1789, (11,16):2248, 
(12,1):479, (12,2):958, (12,3):913, (12,4):751, (12,5):677, (12,6):271, 
     (12,7):177, (12,8):493, (12,9):591, (12,10):333, (12,11):1838, 
     (12,13): 68, (12,14):105, (12,15):336, (12,16):417, 
(13,1):448, (13,2):941, (13,3):904, (13,4):704, (13,5):651, (13,6):289, 
     (13,7):216, (13,8):454, (13,9):650, (13,10):400, (13,11):1868, 
     (13,12): 68, (13,14): 52, (13,15):287, (13,16):406, 
(14,1):479, (14,2):978, (14,3):946, (14,4):720, (14,5):600, (14,6):261, 
     (14,7):207, (14,8):479, (14,9):656, (14,10):427, (14,11):1841, 
     (14,12):105, (14,13): 52, (14,15):237, (14,16):449, 
(15,1):619, (15,2):1127, (15,3):1115, (15,4):783, (15,5):401, (15,6):308, 
     (15,7):343, (15,8):598, (15,9):776, (15,10):622, (15,11):1789, 
     (15,12):336, (15,13):287, (15,14):237, (15,16):636, 
(16,1):150, (16,2):542, (16,3):499, (16,4):455, (16,5):1033, (16,6):687, 
     (16,7):592, (16,8):206, (16,9):933, (16,10):610, (16,11):2248, 
     (16,12):417, (16,13):406, (16,14):449, (16,15):636}
#set of arcs: (i,j) repr an arc from i to j
E = c.keys()

from pymprog import model
p = model("tsp")
x = p.var('x', E, bool) # created over E.
#minize the total travel distance
p.min(sum(c[t]*x[t] for t in E), 'totaldist')
#subject to: leave each city exactly once
for k in V: sum(x[k,j] for j in V if (k,j) in E)==1 
#subject to: enter each city exactly once
for k in V: sum(x[i,k] for i in V if (i,k) in E)==1 
y=p.var('y', E) 
for t in E: (n-1)*x[t] >= y[t] 
for k in V: (
  sum(y[k,j] for j in V if (k,j) in E) # cars out
  - sum(y[i,k] for i in V if (i,k) in E) # cars in
  ==  (n if k==1 else 0) - 1 )
p.solve() #solve the IP problem
print(p.vobj())
tour = [t for t in E if x[t].primal>.5]
cat, car = 1, n
for k in V: 
   print(cat, end='')
   for i,j in tour: 
      if i==cat: 
         print("[%g]"%y[i,j].primal, end='')
         cat=j
         break
print(cat)
p.end()

输出结果

6859.0
1[15]14[14]13[13]12[12]7[11]6[10]15[9]5[8]11[7]9[6]10[5]16[4]3[3]2[2]4[1]8[0]1

在官网上还有许多案例可供大家研究,感兴趣的可以去看看。

微信公众号后台回复

加群:加入全球华人OR|AI|DS社区硕博微信学术群

资料:免费获得大量运筹学相关学习资料

人才库:加入运筹精英人才库,获得独家职位推荐

电子书:免费获取平台小编独家创作的优化理论、运筹实践和数据科学电子书,持续更新中ing...

加入我们:加入「运筹OR帷幄」,参与内容创作平台运营

知识星球:加入「运筹OR帷幄」数据算法社区,免费参与每周「领读计划」、「行业inTalk」、「OR会客厅」等直播活动,与数百位签约大V进行在线交流



                    


        




文章须知

文章作者:用户007

微信编辑:疑疑

文章转载自『Python学习杂记』公众号,原文链接:一款小型求解器使用介绍





关注我们 

       FOLLOW US

































运筹OR帷幄
致力于成为全球最大的运筹学中文线上社区
 最新文章