基于python的pulp库使用,从基础模型到复杂模型,从一维变量到二位变量
创始人
2024-02-29 07:25:15

写在前面

学习笔记,仅作参考。
个人觉得配合步骤和建模,直接看代码就能入门pulp,所以没有啥解释,见谅。

参考

https://blog.csdn.net/youcans/article/details/116371416

步骤

1、安装PuLp (pip install pulp)

2、导入PuLp (from pulp import * )或者(import pulp as pl)

3、定义线性规划问题

PB = LpProblem ( problem name , sense )
"""
problem name=问题名称
sense=LpMinimize/LpMaximize
e.g.  MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize)
"""

4、定义决策变量

小tips

当约束条件需要变量大于某个数或小于某个数,用lowBound和upBound,不需要在约束条件中写!!!

DV = pulp.LPVariable ( decision variable name , lowbound , upbound ,category )
"""
DV=decision variable name:变量名,
lowBound和upBound:下界和上界, 默认分别是负无穷到正无穷,
参数 cat 用来设定变量类型,可选参数值:‘Continuous’ 表示连续变量(默认值)、’ Integer ’ 表示离散变量(用于整数规划问题)、’ Binary ’ 表示0/1变量(用于0/1规划问题)  
"""

根据变量类型可以做不一样的变量定义

单个变量

x1 = pulp.LpVariable('x1', lowBound=0, upBound=7, cat='Continuous')

一维变量

就是添加range(数组长度)

x = pl.LpVariable.dict("x",range(4),lowBound=0)

二维变量

y_ij=pl.LpVariable.dict("y_ij",(range(len1),(range(len2))),cat=pl.LpBinary)

5、添加目标函数

添加目标函数使用 “问题名 += 目标函数式” 格式。

PB += linear objective in equantion from objective name
"""
e.g. MyProbLP+= 2*x1 + 3*x2 - 5*x3    # 设置目标函数
"""

6、添加约束条件

添加约束条件使用 “问题名 += (约束条件表达式)” 格式。

PB += linear objective in equantion from constraint name
"""
e.g.MyProbLP+= (2*x1 - 5*x2 + x3 >= 10)  # 不等式约束MyProbLP+= (x1 + 3*x2 + x3 <= 12)  # 不等式约束MyProbLP+= (x1 + x2 + x3 == 7)  # 等式约束
"""

7、写入LP文件PB.writeLP ( filename )

8、模型求解PB.slove ( )

    MyProbLP.solve()print("Status:", pulp.LpStatus[MyProbLP.status]) # 输出求解状态for v in MyProbLP.variables():print(v.name, "=", v.varValue)  # 输出每个变量的最优值print("F(x) = ", pulp.value(MyProbLP.objective))  #输出最优解的目标函数值    

9、结果显示check status : pulp.LpStatus[PB.status]

栗子1 单个变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3b6YruE-1669721947100)(https://secure2.wostatic.cn/static/jjyyyGCHDprcwkgmjZRbjN/image.png?auth_key=1669721877-vvFMhM4pkixDAeijcTk6Hs-0-f8f0ba7e3a193b52d6d4a1b89ffeea5a)]

import pulp as pl
def rumen_1():# 定义问题et = pl.LpProblem("et", sense=pl.LpMinimize)# 定义变量x = pl.LpVariable("x", lowBound=0, cat="Integer ")y = pl.LpVariable("y", lowBound=0, cat="Integer ")z = pl.LpVariable("z", lowBound=0, cat="Integer ")w = pl.LpVariable("w", lowBound=0, cat="Integer ")# 添加目标函数et += 5 * x + 6 * y + 7 * z + 8 * w# 添加约束条件et += (x + y + z + w == 100)et += (5 * x + 4 * y + 5 * z + 6 * w >= 530)et += (2 * x + y + z + 2 * w <= 160)# 求解et.solve()for v in et.variables():print(v.name, "=", v.varValue)print("F(x)=", pl.value(et.objective))

栗子2 一维变量

同样用例1的模型

def rumen_2():# 定义问题et = pl.LpProblem("et", sense=pl.LpMinimize)# 定义变量x = pl.LpVariable.dict("x",range(4),lowBound=0)# 添加目标函数et += 5 * x[0] + 6 * x[1] + 7 * x[2] + 8 * x[3]# 添加约束条件et += (x[0] + x[1] + x[2] + x[3] == 100)et += (5 * x[0] + 4 * x[1] + 5 * x[2] + 6 * x[3] >= 530)et += (2 * x[0] + x[1] + x[2] + 2 * x[3] <= 160)# 求解et.solve()for v in et.variables():print(v.name, "=", v.varValue)print("F(x)=", pl.value(et.objective))

栗子3 二维变量+复杂模型

此处模型感谢Cathy友情提供

在这里插入图片描述

def jinjie_1():n = 200  # residential areas -变量i居民区数量m = 40  # shelters-变量j庇护所数量areas = range(n)shelters = range(m)path = 'Pb2_areas.csv'areas_matrix = np.genfromtxt(path, dtype=float, delimiter=',', encoding='utf-8-sig')path = 'Pb2_shelters.csv'shelters_matrix = np.genfromtxt(path, dtype=float, delimiter=',', encoding='utf-8-sig')R = areas_matrix[:, 2]  # 第三列的居民区居民数量-变量R_iC = shelters_matrix[:, 2]  # 第三列的庇护所能庇护的容量-变量C_j# 计算居民到庇护所的距离D = np.zeros((n, m))  # -变量D_ij距离for i in areas:for j in shelters:D[i, j] = abs(areas_matrix[i, 0] - shelters_matrix[j, 0]) + abs(areas_matrix[i, 1] - shelters_matrix[j, 1])#定义问题m=pl.LpProblem("Cathy_exp",sense=pl.LpMinimize)#定义变量x=pl.LpVariable.dict("x",areas,cat=pl.LpBinary)y_ij=pl.LpVariable.dict("y_ij",(areas,shelters),cat=pl.LpBinary)#目标函数m+=pl.lpSum(pl.lpSum(D[i,j] * y_ij[i,j] for i in areas) for j in shelters)#约束条件m += (pl.lpSum(x[j] for j in shelters) == 10)for i in areas:m+=(pl.lpSum(y_ij[i,j] for j in shelters) == 1)for j in shelters:m+=(pl.lpSum(R[i] * y_ij[i,j] for i in areas) <= C[j] * x[j])m.solve()for v in m.variables():print(v.name, "=", v.varValue)print("F(x)=", pl.value(m.objective))

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...