如何在 PuLP 中设置弹性约束?

2023-12-02

我正在研究生产分配问题,其中销售订单必须分配到三个生产工厂。

我在 Python 中使用 PuLP,这工作得很好,直到我尝试使约束变得“弹性”。当销售订单总数大于总产能时,就需要弹性,我必须增加工厂的产能,尽管会受到“惩罚”。 (因为加班生产会增加成本)。

我陷入了 PuLP 这方面缺乏用户友好文档的困境(很抱歉这么说),并遇到了一些困难。为了应用“makeElasticSubProblem”,我需要为约束命名。但是,a)当我使用传统语法时prob += lpSum([alloc[s][l]for s in so]) <= cap_dict[l], 'Myname',当我在下一行中使用“我的名字”时,Python 返回一条消息“我的名字未定义”。 b) 当我使用以下语法时:Myname = LpConstraintlpSum([alloc[s][l]for s in so]), sense = 1, rhs = cap_dict[l]),名称被接受,但名称后面的弹性定义似乎被脚本“忽略”。

有人可以提示我我做错了什么吗?谢谢!

下面是我的代码的简化版本(使用 Python 3.8.2 64 位):

from pulp import *

# define the locations and their production capacity
#---------------------------------------------------
location = ['locA', 'locB', 'locC']
capacity = [90, 60, 20]
cap_dict = dict(zip(location, capacity))

# define the sales orders (so) and their volumes (demand)
#--------------------------------------------------------
so = ['s1', 's2', 's3', 's4', 's5']
demand = [20,10,15,8,5]
order_dict = dict(zip(so, demand))

# define the problem
#-------------------
prob = LpProblem("Production_planning",LpMaximize)

# define the decision variables
#------------------------------
alloc = LpVariable.dicts("Alloc", (so, location), cat='Integer')

# set the objective function
#---------------------------
prob += lpSum(alloc[s][l] for s in so for l in location)

# define the constraints
#-----------------------
# 1) allocations should be positive
for s in so:
    for l in location:
        prob += (alloc[s][l] >= 0)
        
# 2) allocation limited by the capacity of the location
for l in location: 
    prob += lpSum([alloc[s][l] for s in so]) <= cap_dict[l]
        
# 3) Location A should receive > 50% of all the allocations
prob += (alloc[s]['locA'] >= lpSum(alloc[s][l] for l in location)/2)

# 4) allocation limited by the amount ordered
for s in so:
    prob += lpSum([alloc[s][l] for l in location]) <= order_dict[s]

# solve the optimization problem
#-------------------------------
prob.solve()
print("Status :", LpStatus[prob.status])

for v in prob.variables():
    if "Alloc_" in v.name:
        if v.varValue > 0:
            print(v.name, v.varValue)

在定义了以下容量约束之后,位置 C 的约束的 20% 向上弹性的规范将被忽略(如果我增加销售订单,程序将向位置 C 分配任何大量金额,没有任何限制):

# capacity constraints:
#---------------------
# same definition for locations A and B

for l in ['locA', 'locB']: 
    prob += lpSum([alloc[s][l] for s in so]) <= cap_dict[l]

# different and specific definition for location C, where an elastic capacity increase needs to be introduced:

cap_locC = LpConstraint(lpSum([alloc[s][l]for s in so]), sense = 1, rhs = cap_dict['locC'])
elastic_cap_locC = cap_locC.makeElasticSubProblem(penalty = 100, proportionFreeBoundList = [0,0.2])

我更喜欢明确地这样做。这使得它不再是一个黑匣子。

你的约束看起来像

 sum(s, a[s,l]) <= cap[l]

现在添加一个变量overcap[l]有界限[0,20%*cap[l]]和写:

 sum(s, a[s,l]) <= cap[l] + overcap[l]

并对目标添加惩罚(最大化,因此使用 -):

  .... - sum(l,penalty[l]*overcap[l])     

最后,报告非零值overcap[l]给用户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 PuLP 中设置弹性约束? 的相关文章

  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar

随机推荐

  • 使用 MediaCodec 编辑帧和编码

    我能够解码 mp4 视频 如果我使用配置解码器Surface我可以在屏幕上看到视频 现在 我想编辑帧 添加黄线 甚至更好地重叠小图像 并将视频编码为新视频 没有必要显示视频 我现在不关心性能 如果我在编辑时显示帧 如果编辑功能需要很长时间
  • 如何在R中编写fftshift和ifftshift? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 In numpy 我们有以下功能 import numpy from numpy fft import fft2 ifft2 fftshift ifftshift 我想用 R 重
  • slurm 集群的最少计算机数量是多少

    我想设置一个SLURM集群 我至少需要多少台机器 我可以从两台机器开始 一台仅是客户端 一台既是客户端又是服务器 吗 正如 Carles 所写 如果您愿意 您可以只使用一台计算机 同时运行控制器 slurmctld 和工人 slurmd 守
  • Rails 4 image-path、image-url 和 asset-url 不再在 SCSS 文件中工作

    除了image url以及 Rails 4 中的其他内容 他们返回不同的值 这些值似乎没有意义 如果我有logo png in app assets images logo png我执行以下操作 这就是我得到的 image url logo
  • 无法在 VBA 上使用 .GetBytes 和 .ComputeHash 方法

    我想将 VB 函数转换为 VBA 该函数正在使用 System Text UTF8Encoding and System Security Cryptography HMACSHA256 对象及其 GetBytes and ComputeH
  • 捕获div上的滚动事件

    我试图捕获 Backbone Marionette CompositeView 中的滚动事件 但没有成功 作为练习 我正在重写http www atinux fr backbone books 使用 Backbone Marionette
  • 即使使用 document.getElementById('xyz').playVideo() 也无法控制 Youtube 嵌入 - 不是函数?

    好吧 我被困住了 即使在遵循 Google 文档并阅读 Stackoverflow 上的建议之后 我也不知道出了什么问题 为什么我无法控制网页中的 Youtube 嵌入 如果我创建一个 HTML 文件 其 为
  • 如何通过多线程绘制到 TBitmap

    为了加快在Delphi XE2中绘制位图的速度 我决定采用以下方式 a 创建一个例如 10 x 线程并仅在线程类内绘制位图的一层 b 一旦所有线程完成 使用 bitblt 函数逐层合并位图 我做了以下实验代码 unit Unit Bitma
  • 删除字符串出现后的文本

    我有一个具有以下格式的字符串 string sample A ABC 1 ACS 如您所见 出现了 5 次 特点 我需要删除一切第四次出现后 最终结果将是 string result fx sample 4 A ABC 1 ACS 没有可能
  • 考虑 RAM 的 url 或哈希索引

    我正在开发一个项目 每天需要添加 更新大约 100 万个网址 有些日子主要是更新 有些日子主要是添加 有些日子是混合的 因此 在每个查询中都需要在 url 表中查找 url 的唯一性 如何快速查找 url 因为目前索引设置在 url 列并且
  • intl PHP 扩展不适用于 xampp 服务器

    我正在尝试安装CakePHP 3 0 0版本 我已经从下载了源代码here 但它显示启用错误intl extension 既然我已经改变了 extension php intl dll to extension php intl dll 删
  • 使用 robolectric v3.0 测试 WiFi 连接时,ShadowNetworkInfo 始终为 TYPE_MOBILE

    我正在尝试使用 Robolectric 3 0 RC2 为 Android 应用程序中的 SyncAdapter 实现编写一些离线测试 该应用程序将在工厂中使用 WiFi 连接的无 SIM 卡手机上运行 所以我希望能够针对我的 wifi 连
  • 如何从 Windows Mobile 设备 6.0 连接到 Web 服务

    我想创建一个 Windows Mobile 应用程序 6 5 它通过托管在我家服务器上的 GPRS 连接到网络服务 使用 Windows 应用程序成功测试了 Web 服务 有人可以指导我应该做什么吗 因为我不知道如何继续 一些代码将非常感激
  • htmlTreeParse 处理程序说明

    包装内XML 在里面 htmlParse examples部分 是以下函数getLinks getLinks lt function links lt character list a function node links lt lt c
  • 使用 Paramiko 将具有特定扩展名的本地文件夹中的所有文件上传到 SFTP 服务器

    我正在使用 paramiko 将文件上传到 SFTP 服务器 我想传输文件夹中的所有文件 文件的名称是这样的one txt two txt 我希望文件按顺序发送one txt then two txt then three txt 下面用于
  • 网页的加载和执行顺序?

    我做过一些基于Web的项目 但我并没有过多考虑普通网页的加载和执行顺序 但现在我需要了解细节 很难从 Google 或 SO 中找到答案 所以我创建了这个问题 一个示例页面是这样的
  • C++ 通过网络发送结构

    我正在使用具有预定义结构的 Intel SGX 我需要通过使用操作的网络连接发送这些结构boost asio 需要发送的结构体格式如下 typedef struct ra samp request header t uint8 t type
  • Rails - Elastic Beanstalk nginx/error.log

    尝试将我的 Rails 应用程序上传到 Elastic beanstalk 我已经成功部署了我的应用程序并创建了 postgres 数据库 我的应用程序在开发服务器上的 sqlite3 上运行 我的 eb 状态已就绪 运行状况为绿色 我的
  • 将多个空间合并为单个空间;删除尾随/前导空格

    我想将多个空格合并为单个空格 空格也可以是制表符 并删除尾随 前导空格 例如 string lt Hi buddy what s up Bro to Hi buddy what s up bro 我检查了给出的解决方案正则表达式用单个空格替
  • 如何在 PuLP 中设置弹性约束?

    我正在研究生产分配问题 其中销售订单必须分配到三个生产工厂 我在 Python 中使用 PuLP 这工作得很好 直到我尝试使约束变得 弹性 当销售订单总数大于总产能时 就需要弹性 我必须增加工厂的产能 尽管会受到 惩罚 因为加班生产会增加成