用python的pulp库解决线性规划问题

本文会介绍怎么用python解决线性规划问题,为什么要用python而不是matlab和lingo呢?因为matlab的函数写法不太符合正常的思维方式,编起来很复杂。而lingo虽然编写容易,但报错不详细,一旦有错很难查出来。而python就没有这些问题。

关于python的语法就不再介绍了,主要介绍pulp库的用法。

以此题为例:计算6个生产点8个销售点的最小费用运输问题。产销单位运价如下表。

先建模,很容易得到以下模型:

现在开始编程:

引入头文件是必须的:

#-*- coding: UTF-8 -*-

importnumpyasnp

frompulpimport*

step1先新建一个问题,随便取名为prob:

prob = LpProblem("test1", LpMinimize)

step2然后定义变量为x,每个x代表了对应的A点卖到B点的数量:

foriinrange(1, 49, 1):

exec('x%s= LpVariable("x%s", 0, None, LpInteger,[])'%(i,i))

x = [[x1,x2,x3,x4,x5,x6,x7,x8],[x9,x10,x11,x12,x13,x14,x15,x16],

[x17,x18,x19,x20,x21,x22,x23,x24],[x25,x26,x27,x28,x29,x30,x31,x32],

[x33,x34,x35,x36,x37,x38,x39,x40],[x41,x42,x43,x44,x45,x46,x47,x48]]

对于LpVariable函数包含的参数,一次为 变量名,变量值的最小值,变量值的最大值,变量类型。

这里LpInteger表示变量的类型是int型,根据题目的需要还可以改成LpContinuous(实数型)和LpBinary(二值型,即0或1)。

step3开始写入数据:

cost = np.array([[6,2,6,7,4,2,9,5],[4,9,5,3,8,5,8,2],[5,2,1,9,7,4,3,3],

[7,6,7,3,9,2,7,1],[2,3,9,5,7,2,6,5],[5,5,2,2,8,1,4,3]])

capacity = np.array([60,55,51,43,41,52])

demand = np.array([35,37,22,32,41,32,43,38])

产地的产量为capacity,销地的销量为demand,单位运价为cost

step4设定目标函数:

result = 0

foriinrange(0, 6):

forjinrange(0, 8):

result += x[i][j]*cost[i][j]

prob += result, "obj"

是以result最小为目标的,如果要求结果最大为目标的题目可在result前面加上负号。

step5还要设置约束:

产量的约束:

foriinrange(1,7,1):#设置产量的约束

exec('prob += sum(x[%s]) <= capacity[%s]' % (i - 1, i - 1))

销量的约束:

foriinrange( 1 , 9 , 1):#设置销量的约束

z=0

forjinrange( 1 , 7 , 1):

z+=x[j-1][i-1]

exec('prob += z >= demand[%s]'%(i-1))

step6需要编写的部分就已经完成了,只需要输出结果就行了

# Solve the problem using the default solver

prob.solve()

# Print the status of the solved LP

print ( "Status:", LpStatus[prob.status] )

# Print the value of the variables at the optimum

forvinprob.variables():

print (v.name, "=", v.varValue)

# Print the value of the objective

print ( "objective=", value(prob.objective) )

输出的内容分别是计算状态(optimal时就说明结果正常),变量值,和目标函数值。

这题就做完啦~

最后把代码汇总一下:

#-*- coding: UTF-8 -*-

import numpy as np

from pulp import *

# A new LP problem

prob = LpProblem("test1", LpMinimize)

cost = np.array([[6,2,6,7,4,2,9,5],[4,9,5,3,8,5,8,2],[5,2,1,9,7,4,3,3],

[7,6,7,3,9,2,7,1],[2,3,9,5,7,2,6,5],[5,5,2,2,8,1,4,3]])

capacity = np.array([60,55,51,43,41,52])

demand = np.array([35,37,22,32,41,32,43,38])

# Variables

for i in range(1, 49, 1):

exec('x%s= LpVariable("x%s", 0, None, LpInteger,[])'%(i,i))

x = [[x1,x2,x3,x4,x5,x6,x7,x8],[x9,x10,x11,x12,x13,x14,x15,x16],

[x17,x18,x19,x20,x21,x22,x23,x24],[x25,x26,x27,x28,x29,x30,x31,x32],

[x33,x34,x35,x36,x37,x38,x39,x40],[x41,x42,x43,x44,x45,x46,x47,x48]]

# Objective

result = 0

for i in range(0, 6):

for j in range(0, 8):

result += x[i][j]*cost[i][j]

prob += result, "obj"

# (the name at the end is facultative)

# Constraints

# for i in range(1,7,1):#先对y赋值

for i in range(1,7,1):#设置产量的约束

exec('prob += sum(x[%s]) <= capacity[%s]' % (i - 1, i - 1))

for i in range( 1 , 9 , 1):#设置销量的约束

z=0

for j in range( 1 , 7 , 1):

z+=x[j-1][i-1]

exec('prob += z >= demand[%s]'%(i-1))

# Solve the problem using the default solver

prob.solve()

# Print the status of the solved LP

print  ( "Status:", LpStatus[prob.status] )

# Print the value of the variables at the optimum

for v in prob.variables():

print (v.name, "=", v.varValue)

# Print the value of the objective

print  ( "objective=", value(prob.objective)  )

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容