纸浆 LP 最小化配制“选择一种类型”约束

2023-12-03

下面的代码用于运行 LP 最小化问题,其中我们有某些食物、它们的营养价值和成本。该代码当前在所呈现的状态下工作。我正在尝试添加另一种类型的约束。我将所有食物分为不同的类别(早餐、午餐、晚餐、零食)。我想创建一个约束,其中Only 1早餐、午餐和晚餐项目可以选择。 (零食不限)。 “1”和“0”对应于该项目是否是(早餐、午餐、晚餐或小吃),具体取决于它在数组中的位置。

from pulp import *

Food = ["Bacon", "Eggs", "Pancakes", "Waffles", "Yogurt", "Bagels", "Sausage", "Cheerios",
    "Strawberries", "Milk", "OJ", "Oranges", "Apples", "Carrots", "Broccoli","Ham", "Turkey",
    "Steak", "Salmon", "Pasta","Chicken", "Pizza", "Rice", "Salad", "Potatoes"]

nutrition = ["Calories", "Protein", "Sugars", "Cholesterol", "Vitamin_A", "Vitamin_B", "Vitamin_C",
         "Vitamin_K", "Vitamin_E", "Zinc", "Iron", "Fat", "Sodium", "Carbs", "Fiber",
         "Calcium", "Potassium", "Folic_acid", "Thiamin"]

Category = ["Breakfast", "Lunch", "Dinner", "Snack"]

VarCategory = [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0],
               [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1],
               [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
VarCategory = makeDict([Category, Food], VarCategory)


VarNutrition = [[45, 367, 84.3, 212, 250, 72.3, 150, 103, 49, 100, 134, 85.1, 52.8, 5.3, 30.9, 290, 280, 412, 159, 288, 231, 324, 428, 370, 403],
            [3, 24, 2.3, 5.3, 10.7, 2.8, 6, 3.2, 1, 8, 1, 1.3, 0.3, 1.1, 2.6, 18, 18, 21, 24.9, 12, 43.4, 13.9, 19.2, 20, 13.7],
            [0, 4, 0, 5.2, 46.7, 0, 1, 1.1, 7, 13, 23.3, 16.9, 11.1, 0.7, 1.5, 6, 5, 0, 0, 11, 0, 4.1, 13.8, 1, 0],
            [3, 86, 7, 0, 3, 2, 10, 0, 0, 3, 0, 0, 0, 0, 0, 8, 7, 61, 10, 10, 40, 9, 18, 13, 7],
            [0, 23, 2, 20, 2, 1, 4, 16, 0, 10, 2, 8, 1, 41, 11, 6, 6, 0, 2, 10, 1, 6, 41, 10, 34],
            [0, 20, 1, 19, 12, 1, 0, 27, 2, 0, 31, 2.5, 1, 1, 4, 0, 0, 50, 50, 12, 25, 10, 23, 0, 22],
            [0, 1, 1, 2, 3, 0, 0, 11, 149, 0, 62, 139, 7, 1, 135, 35, 35, 0, 0, 10, 0, 0, 17, 30, 81],
            [0, 11, 0,  0,  0,  0,  0,  1,  4,  0,  0,  0,  1,  2,  116, 0, 0,  4,  0,  10, 1,  8,  16, 0,  0],
            [0, 12, 0,  0,  0,  0,  0,  1,  2,  0,  0,  2,  0,  0,  4,  0, 0,   4,  9,  10, 2,  6,  4,  0,  0],
            [0, 15, 1,  3,  12, 1,  0,  30, 1,  0,  0,  1,  0,  0,  2,  0,  0, 69,  3,  10, 9,  10, 9,  0,  14],
            [0, 15, 4,  20, 1,  6,  4,  49, 3,  0,  2,  1,  0,  1,  4,  20, 20, 28, 6,  10, 8,  16, 7,  8,  18],
            [6, 41, 5,  11, 4,  1,  22, 3,  1,  4,  0,  1,  0,  0,  1,  8,  7, 25,  9,  20, 8,  19, 8,  29, 33],
            [6, 26, 7,  12, 6,  5,  15, 8,  0,  5,  0,  0,  0,  0,  1,  53, 42, 3,  44, 50, 4,  25, 47, 59, 20],
            [0, 2,  4,  11, 16, 5,  0,  7,  4,  4,  11, 7,  5,  0,  2,  15, 15, 0,  0,  10, 0,  13, 25, 10, 16],
            [0, 0,  0,  8,  0,  2,  0,  11, 12, 0,  2,  18, 6,  2,  9,  16, 16, 0,  0,  30, 0,  7,  10, 0,  0],
            [0, 16, 8,  4,  37, 0,  2,  11, 2,  30, 0,  8,  1,  0,  4,  6,  6, 1,   1,  0,  2,  15, 4,  4,  34],
            [0, 9,  1,  4,  14, 1,  0,  5,  7,  0,  3,  9,  3,  1,  8,  0,  0, 14,  7,  10, 10, 6,  12, 0,  41],
            [0, 17, 3,  10, 6,  6,  0,  68, 9,  0,  2,  8,  0,  1,  14, 0,  0, 5, 1,    20, 1,  0,  15, 0,  15],
            [0, 8,  5,  21, 6,  9,  0,  36, 2,  0,  63, 12, 1, 0,   4,  0,  0, 9,   2,  10, 7,  14, 17, 0,  18]]
VarNutrition = makeDict([nutrition, Food], VarNutrition)

ConstraintsLow = [2000, 72, 0, 85, 100, 100, 100, 100, 100, 0, 0, 0, 0, 90, 100, 100, 100, 100, 100]
ConstraintsLow = makeDict([nutrition],ConstraintsLow)



Cost = [1.22,   1.56,   6.79,   6.79,   1.00,   2.50,   2.00,   0.14,   1.37,   1.69, 1.99, 0.50,   0.50,   0.50,   0.50,   4.25,   4.25,   4.00,   5.00,   7.00, 3.18, 1.25,   5.00,   6.00,   3.00]
Cost = makeDict([Food], Cost)

prob = LpProblem("Nutrition Calculator", LpMinimize)

vars = LpVariable.dicts("Servings of", (Food), 0, None, LpContinuous)
Svars = LpVariable.dicts("Food Chosen", (Category, Food), 0, None, LpBinary)

prob += lpSum(vars[i]*Cost[i] for i in Food )

for j in nutrition:
    prob += lpSum([vars[i]*VarNutrition[j][i] for i in Food]) >= ConstraintsLow[j]


for i in Food:
    prob += vars[i] >= 0
    prob += vars[i] <= 2




print (prob)
prob.writeLP("Nutrition.lp")
prob.solve()
print ("Status:", LpStatus[prob.status])
for v in prob.variables():
    print (v.name, "=", v.varValue)
print ("Total Cost = ", value(prob.objective))

我遇到的问题是创建这样的约束。我想使用二进制变量,但我不知道如何实现。任何帮助,将不胜感激


您应该做的是为所选的每种食物设置二元变量,然后约束它们的总和为 1——这意味着其中一个二元变量为 1,其他为 0。

问题在于,例如,打开早餐二进制变量意味着线性程序中存在 if-then 条件。如果至少选择了一项早餐,则早餐为 1,否则为 0。if-then 语句不是线性的,因此我们需要一种巧妙的方法来使其呈线性。我们可以通过“大 M 约束”来做到这一点。

让Python变量代表每种食物的决策总和,例如breakfast_sum, lunch_sum etc.

然后制作 PuLP 二进制变量breakfast_binary, lunch_binary etc.

我们将使用一个大的 M 约束来获得breakfast_binary“翻转”时breakfast_sum大于 0。然后我们将使用另一个约束来确保二元变量的总和

M基本上是一个大数。它需要有多大?请注意,您永远不会为每种早餐分配超过 2 份,因此请尝试使 M = 2 * {早餐项目数量}。现在看看这个约束:

M * breakfast_binary >= breakfast_sum.

If breakfast_sum是 0,那么breakfast_binary is allowed为 0。一旦您分配一份早餐食品,breakfast_binary被迫翻转到1。

在午餐、晚餐等时执行此操作,然后有一个额外的约束,即二元变量的总和

这个答案自由地解释了第 4 章“优化建模”数据智能作者:约翰·福尔曼。我强烈推荐它。

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

纸浆 LP 最小化配制“选择一种类型”约束 的相关文章

  • Python获取正确时区的当前时间[重复]

    这个问题在这里已经有答案了 现在我用 import datetime print datetime datetime now strftime X 将当前时间显示为字符串 问题是 我的计算机正在运行Europe Berlin时区 这里不考虑
  • Windows 中的 Python 多处理池奇怪行为

    Python 多处理池在 Linux 和 Windows 之间有不同的行为 当按工作人员数量运行方法映射时 在 Linux 中 它会在您作为参数提供的特定函数的范围内运行该进程 但在 Windows 中 每个工作进程都在父进程的范围内运行
  • 从框架中获取可调用对象

    给定框架对象 由sys getframe http docs python org library sys html sys getframe 例如 我可以获得底层的可调用对象吗 代码解释 def foo frame sys getfram
  • 如何测试该变量不等于多个事物?

    这是我的一段代码 choice while choice 1 and choice 2 and choice 3 choice raw input pick 1 2 or 3 if choice 1 print 1 it is elif c
  • 使用python编辑html,但是lxml将漂亮的html实体转换为奇怪的编码

    我正在尝试使用 python 带有 pyquery 和 lxml 来更改和清理一些 html Eg html div p It 146 s a spicy meatball p div lxml html clean 函数 clean ht
  • Python:由于 OSError 无法安装软件包:[Errno 2] 没有这样的文件或目录

    我尝试使用pip安装sklearn 并且我收到以下错误消息 错误 由于 OSError 无法安装软件包 Errno 2 没有这样的文件或目录 C Users 13434 AppData Local Packages PythonSoftwa
  • FastAPI UploadFile 与 Flask 相比慢

    我创建了一个端点 如下所示 app post report upload def create upload files files UploadFile File try with open files filename wb as wf
  • 如何用pygame画一条虚线?

    我需要在坐标系上绘制正弦波和余弦波 就像在this https i stack imgur com DGI8g png图片 除了没能代表以外 我所有的工作都做得很好虚线和曲线与 pygame 一致 我有与我需要的类似的东西 但我怎样才能让它
  • matplotlib - 将文本包装在图例中

    我目前正在尝试绘制一些pandas数据通过matplotlib seaborn 然而我的一个专栏标题特别长 拉长了情节 考虑以下示例 import random import pandas as pd import matplotlib p
  • 私有属性,但却是一个神秘的领域

    我想将属性设为私有 但带有 pydantic 字段 from pydantic import BaseModel Field PrivateAttr validator class A BaseModel a str I want a py
  • python os.fork 使用相同的 python 解释器吗?

    据我所知 Python 中的线程使用相同的 Python 解释器实例 我的问题是与创建的流程相同os fork 或者每个进程创建的os fork有自己的翻译吗 每当你 fork 时 整个 Python 进程都会在内存中复制 包括Python
  • 如何在 tkinter 后台运行函数[重复]

    这个问题在这里已经有答案了 我是 GUI 编程新手 我想用 tkinter 编写一个 Python 程序 我想要它做的就是在后台运行一个可以通过 GUI 影响的简单函数 该函数从 0 计数到无穷大 直到按下按钮为止 至少这是我想要它做的 但
  • 如何在使用 Flask for Python 3 的同时使用 Bootstrap 4?

    我检查过 发现默认安装时 Flask Bootstrap 原生使用 Bootstrap 3 3 7 但实际上我想通过使用 Flask Bootstrap 包在我的项目中使用 Bootstrap 4 任何有关如何更新它或类似内容的帮助将不胜感
  • 在添加数据之前使用 Python gdata 清除工作表中的行

    我有一个 Google 电子表格 我使用 python 脚本和 gdata 库填充值 如果我多次运行脚本 它会将新行附加到工作表中 我希望脚本在填充之前首先清除行中的所有数据 这样每次运行时我都会有一组新的数据脚本 我尝试过使用 Updat
  • PySpark DataFrame 上分组数据的 Pandas 式转换

    如果我们有一个由一列类别和一列值组成的 Pandas 数据框 我们可以通过执行以下操作来删除每个类别中的平均值 df DemeanedValues df groupby Category Values transform lambda g
  • 从 SUDS 中的 SOAP 响应中提取 Cookie

    我必须使用具有多种服务的 API 所有这些都需要来自下面的身份验证的 JSESSION cookie 然而 当我调用下一个服务时 它不会保留 cookie 因此会拒绝它们 from suds client import Client url
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • 如何将另一整列作为参数传递给 pandas fillna()

    我想用另一列中的值填充一列中的缺失值 使用fillna方法 我读到循环遍历每一行将是非常糟糕的做法 最好一次完成所有事情 但我不知道如何使用fillna 之前的数据 Day Cat1 Cat2 1 cat mouse 2 dog eleph
  • 无法将 librosa 与 python 3 一起使用

    我已经在 Windows 上的 ubuntu 子系统上使用 pip3 正确安装了 librosa 但是当我尝试执行像这样的简单程序时 import librosa data sr librosa load sound mp3 print d
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用

随机推荐

  • 除非手动执行,否则 Elastic Beanstalk 上的“npm install”会失败

    我有一个带有 PHP 应用程序的 Elastic Beanstalk 环境 我只想跑npm install我的应用程序部署后 node and npm都通过部署配置安装在服务器上 我定义了一个容器命令 只需 cd 到正确的目录 然后运行np
  • 如何使用log4cxx保留单个文件并覆盖同一文件中的内容?

    在我的应用程序中 多个线程将数据记录在同一个文件中 如果文件大小超过限制 那么我必须删除文件中的特定记录并将所有内容向上移动 我可以在 Log4cxx 中执行此操作吗 如果可以 请回复您的想法 谢谢 该示例将解决您的问题 log4j roo
  • Erlang 有支持 AJAX 的模块吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想创建一个能够接收和发送 AJAX 消息的 Erlang 服务器 有没有提供此功能的模
  • Botmaker 解决 Qnamaker 后续问题

    对于我当前的项目 我尝试使用仅上下文的后续提示 My problem is now that some of the questions from the follow up prompts are the same 在 qna ui 中
  • 如何在处理函数的其余部分之前更新 WPF 中的 UI 元素?

    我想在用户单击按钮后立即禁用该按钮以阻止他们再次单击它 单击它时会执行许多检查 并且这些检查似乎是在 UI 更改发生之前完成的 我试图通过为按钮使用单独的线程来做到这一点 但它似乎仍然只在检查完成后更新 这是我正在使用的代码 private
  • 将子文档数组元素添加到mongoDB中的子文档数组元素

    这可能吗 我有一个集合 C 其中包含属性 A1 的数组 每个属性都有一个子属性数组 A2 如何将子文档添加到特定的 C A1 子文档 这是一个例子 db docs insert id 1 A1 A2 1 2 3 A2 4 5 6 如果您知道
  • 实体框架。删除表中的所有行

    如何使用实体框架快速删除表中的所有行 我目前正在使用 var rows from o in dataDb Table select o foreach var row in rows dataDb Table Remove row data
  • 使用 Java 8 将 ms 转换为字符串日期

    我有一个毫秒时间戳 并使用 SimpleDateFormater 对其进行格式化 如下所示 SimpleDateFormat sdfDate new SimpleDateFormat MM d yyyy h mm a return sdfD
  • 如何使用 .NET 从十六进制颜色代码获取颜色?

    如何从十六进制颜色代码中获取颜色 例如 FFDFD991 我正在读取文件并获得十六进制颜色代码 我需要创建相应的System Windows Media Color十六进制颜色代码的实例 框架中有内置方法可以做到这一点吗 我假设这是一个 A
  • MPI 和 C 结构

    我必须承认 当我看到使用 MPI 传输一个 C 结构体需要多少行代码时 我感到非常震惊 在什么情况下可以使用预定义的数据类型简单地传输结构MPI CHAR 考虑以下示例 struct particle double x double y l
  • PHP switch 语句变量范围

    在 PHP 中 switch 语句中的变量作用域是如何处理的 例如 以这个假设的例子为例 someVariable 0 switch something case 1 someVariable 1 break case 2 someVari
  • 如何在maven多模块项目中仅运行父pom.xml

    我有 Maven 多模块项目 在父级 我有一些java文件 在父 pom xml 中 在打包阶段我做了一些事情 通常 当我在父级别运行 mvn package 时 父 pom 的 package 阶段将运行 并且所有模块也将被打包 我正在寻
  • 将数据从 SAP 提取到 SQL Server

    我正在使用 SSIS 包将 SAP 数据库表中的数据提取到 SQL Server 表中 我正在使用 OLEDB 源 目标连接来实现此目的 现在的问题是 SAP 中的一个表有 500 万条记录 需要大约 2 小时才能将这些数据提取到我的 SQ
  • 使用多处理时 cv2.Boost 的 Pickle 异常

    我正在从事名为 Faciel Actions UnitsDetection 的项目 我正在使用 python2 7 和 opencv 2 4 错误 pickle PicklingError Can t pickle
  • 跨多个数据库的连接查询语法错误

    我有2个数据库 即db1 db2 我需要一个查询从这些数据库 db1 db2 中获取数据 每个数据库都有2个表 优惠 发票 在 db1 concessions gt concession 中是主键 db1 invoicing gt 优惠编号
  • 限制正则​​表达式中的字符长度

    我使用以下正则表达式 不限制任何字符长度 var test a z A Z 0 9 lt gt Works fine 在上面 当我尝试将字符长度限制为 15 时 如下所示 它会抛出错误 var test a z A Z 0 9 lt gt
  • 使用json从PHP-MySql服务器获取图像到Android

    我正在开发一个应用程序 它从 php 服务器下载图像并在图像视图中显示图像 但是当我从 php 页面接收图像时 if empty result if mysql num rows result gt 0 result mysql fetch
  • 如何根据部分文件名检查文件是否存在?

    我试图检查我的文件夹中是否存在文件 但我只有部分文件名来检查它 有没有办法检查它 例如我有以下内容 God of War 文件名实际上称为 God of War PSP USA rar file exists 函数是否有某种类似的功能 或者
  • 如何使用python OpenCV找到单通道图像中与特定值匹配的最大连通分量?

    因此 我有一个主要为 0 背景 的单通道图像 以及前景像素的一些值 如 20 21 22 非零前景像素大多与具有相同值的其他前景像素聚集在一起 然而 图像中存在一些噪点 为了消除噪音 我想使用连通分量分析 并且对于每个值 在本例中为 20
  • 纸浆 LP 最小化配制“选择一种类型”约束

    下面的代码用于运行 LP 最小化问题 其中我们有某些食物 它们的营养价值和成本 该代码当前在所呈现的状态下工作 我正在尝试添加另一种类型的约束 我将所有食物分为不同的类别 早餐 午餐 晚餐 零食 我想创建一个约束 其中Only 1早餐 午餐