基于python的pulp库使用,从基础模型到复杂模型,从一维变量到二位变量

news2024/12/28 21:46:29

写在前面

学习笔记,仅作参考。
个人觉得配合步骤和建模,直接看代码就能入门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_i
    C = 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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于python的scip库使用,从基础模型到复杂模型,从一维变量到二位变量

基础知识 创建模型&#xff1a;modelModel(name)#name是模型名字 创建变量&#xff1a;model.addVar(vtype,name,lb0,ub1)#vtype是变量类型&#xff0c;有I&#xff08;Integer&#xff09;表示离散变量&#xff0c;B&#xff08;Binary &#xff09;表示0/1变量 创建目标函数&…

pytorch安装

打开命令提示符 创建虚拟环境 conda create -n pytorch pip python3.6Collecting package metadata (current_repodata.json): done Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source. Collecting package meta…

华为机试真题 Java 实现【最长连续方波信号】

目录 题目 思路 考点 Code 题目 输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,如果有相同长度的交替方波信号,输出任一即可, 方波信号高位用1标识,低位用0标识,如图: 说明: 1) 一个完整的信号一定以0开始然后以0结尾,即010是一个完整信号,但…

Protobuf应用层协议设计

目录 1 协议概述 2 判断消息的完整性 3 协议设计 3.1 协议设计范例 3.1.1 范例1-IM即时通讯 3.1.2 范例2-云平台节点服务器 3.1.3 范例3-nginx 3.1.4 范例4-HTTP协议 3.2 序列化⽅法 3.2.1 常⻅序列化⽅法 3.2.2序列化结果数据对⽐ 3.2.3 序列化、反序列化速度对…

STC 51单片机44——实现0.5秒间隔的单向流水灯

// 12MHz晶振 #include "reg52.h" #include "intrins.h" #define time (65536-50000) // 单次定时50ms unsigned char cn; unsigned char temp; void main(void) { cn10; //10*50ms0.5s temp0x7f; TMOD 0x10; //set tim…

[附源码]SSM计算机毕业设计星期八酒店管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计springboot基于Java的失物招领平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

游戏开发30课 cocoscreator骨骼贴图布局设置

骨骼贴图布局设置 要确保 骨骼动画 也能够完全正确地参与 动态 Instancing&#xff0c;需要用户手动指定每张骨骼贴图的数据分配方式。 比如一个场景中要绘制大量相同的人物角色&#xff0c;每个角色可能在走/跳/攻击。如果希望一个 Drawcall 就能够正确完成所有角色的绘制&a…

【金万维】使用天联高级版登录用友U8+,进行凭证打印操作。

【操作步骤】 通过“天联高级版客户端”登录 U8&#xff0c;打印凭证步骤&#xff1a; 第一步&#xff1a;首先查看一下天联高级版客户端的打印参数是否如下图所示。 &#xff08;一般软件初次安装后&#xff0c;默认即可。&#xff09; 第二步&#xff1a;进入U8后&#xff0…

闭坑1:Django “TemplateDoesNotExist at /index/“解决/Django加载HTML出错

网上很多方法说是settings.py 的配置TEMPLATES中 DIRS: [], 未填写&#xff0c;事实上好多教程会改为路径 DIRS: [ os.path.join(BASE_DIR,"templates/") ], 看下BASE_DIR的定义&#xff1a; import os BASE_DIR os.path.dirname(os.path.dir…

见证云力量|飞马网技术沙龙“云计算专场”圆满结束

2022年11月26日下午&#xff0c;光环国际联合元宇宙教育实验室以在线直播的形式举办了“第322期FMI飞马网技术沙龙活动”。 光环国际成立于2001年&#xff0c;是新三板“科创人才培养第一股”。FMI飞马网技术沙龙作为光环国际旗下重要的沙龙品牌活动&#xff0c;如今已经成为了…

【站内题解】十六道csdn每日一练Python题解

文章目录题目一&#xff1a; 游乐园的门票1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案5.1 解法一5.2 解法二题目二&#xff1a;小桥流水人家1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案题目三&#xff1a;小艺读书1. 问题描述2. 输…

前端开发,自定义本地域名解析,更改host,模拟线上环境

最近的一个需求搞得我心力交瘁&#xff0c;需求如下 希望网站 xxx.com 和网站 xxx.cn 统一登录状态&#xff0c;也就是说一个 com 站点登录&#xff0c;需要同步更新 cn 站点的用户&#xff0c;退出登录同理 实现原理是使用 iframe postMessage localstorage&#xff0c;具体…

【数据结构与算法】LinkedList与链表

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;数据结构 ✨每日一语&#xff1a;假如困境有解&#xff0c;何须心烦意乱&#xff1b;倘若困境无解&#xff0c;又何须郁郁寡欢。每个人都有两次生命&#xff0c;当你意识到你只有一次生命的时候&#xff0c;你的第二次生命…

艾美捷MTT细胞增殖检测试剂盒测定方案

细胞增殖的测量和监测是任何实验室中必不可少的技术专注于基于细胞的研究。该技能还允许优化细胞培养条件作为细胞因子&#xff0c;生长因子或激素活性的测定。更重要的是&#xff0c;细胞抑制毒理学测试中抗癌化合物的性质&#xff0c;治疗化学品在药物中的功效筛选和细胞介导…

设计模式之迭代器模式(十三)

目录 1. 背景 1.1 学院展示问题 1.2 迭代器模式概述 2. 迭代器模式 2.1 迭代器解决院校展示 2.2 迭代器模式在JDK ArrayList中的应用 1. 背景 1.1 学院展示问题 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在一个页面中展示出学校的院系 组成&…

驱动——platform驱动总线三种匹配方式

三种platform驱动匹配方式代码案例以及现象 方式一&#xff1a;通过设置名字进行匹配 相关API简介&#xff1a; 1、platform_device的API ①分配对象 struct platform_device { const char *name;//用于进行匹配的名字 int id;//总线号 PLATFORM_DEVID_AUTO&#xff08;自…

Java基于springboot+vue的共享电动车管理系统 nodejs

随着在我国国民水平的提高&#xff0c;低碳环保的概念也深入人心&#xff0c;越来越多的人选择了绿色环保的出现方式&#xff0c;共享电动车更是为绿色出行提供了一个有利的保障。通过本人的调查研究发现&#xff0c;很多大学的共享电动车的管理还是用手工传统的方式在进行&…

谷歌翻译用不了的解决方案

1.上 https://ping.chinaz.com/ ping一下translate.google.cn 2.往下拉&#xff0c;根据自己所在地&#xff0c;例如广东深圳&#xff0c;则看看按照响应时间排序&#xff0c;找广东省内的。 3.把响应ip复制&#xff0c;并且本地ping一下看看响应时间 响应时间40ms还能接受 …