使用 Python 的 pulp 时如何基于决策变量创建约束程序
How to create a program for constraints based on decision variables when using Python's pulp
简介
我想使用 Python 的纸浆创建一个“使用决策变量的开关(如果语法)”。
这里,“switch using decision variables (if syntax)”是指,例如,“当x(x为大于等于0的整数)和y(y为0、1的二元变量)为决策变量时,if x为大于等于1的整数,y输出1,x为0则y输出0,下面是一个简单的例子,公式见下面附的问题公式3(图片)
以下是我们如何尝试创建“带有决策变量的开关(if 语法)”以及我们取得的结果的简单示例。
例子是参考《运筹学概论》(东海大学出版社)中的例子制作的。
一家冰淇淋店打算生产两种冰淇淋:浓缩咖啡冰淇淋和覆盆子冰淇淋。然而,他不能随心所欲地生产,因为他只能生产 8000 cc 的牛奶并工作 360 分钟。鉴于每个冰淇淋所需的牛奶量和时间,增加产量以使利润最大化的计划是什么? 然而,今天一份覆盆子冰淇淋的覆盆子(配料)数量将过期。所以,你至少要生产一份覆盆子冰淇淋才不会浪费。
Product name
Quantity of milk needed
Working time
Profit
Espresso ice cream
100cc
7 minutes
50 yen
Raspberry ice cream
150cc
5 minutes
10 yen
上面的问题设置可以表述如下
Problem Formulation1
作为一个Python程序,可以表示如下
import pulp
problem = pulp.LpProblem('ice', pulp.LpMaximize)
# Define the decision variables
x_e = pulp.LpVariable('x_e', lowBound=0, cat=pulp.LpInteger)
x_r = pulp.LpVariable('x_r', lowBound=0, cat=pulp.LpInteger)
# Set the objective function
problem += 50*x_e +10*x_r
# Set constraints
problem += 100*x_e + 150* x_r <= 8000
problem += 7*x_e + 5*x_r <= 360
## Newly added constraint
problem += x_r >= 1
# # optimize
problem.solve()
# # print the result
print("Espresso",x_e.value(), "pieces")
print("raspberry",x_r.value(), "pieces")
print("profit",pulp.value(problem.objective), "yen")
运行上述程序的结果如下。
我们能够在不丢弃即将过期的覆盆子(一个覆盆子冰淇淋的量)的情况下实现利润最大化。
Espresso 50.0 pieces
raspberry 2.0 pieces
profit 2520.0 yen
挑战:在引入一个约束作为我自己创建的“带有决策变量的开关(如果语法)”(冰淇淋生产问题)
在上一章中,我们在原来的基础问题上增加了如下约束条件
Problem Formulation2
#Newly added constraints
problem += x_r >= 1
为了配合本题的主题,我们将此约束重写为“switch with decision variables (if syntax)”约束,如下所示
Problem Formulation3
import pulp
problem = pulp.LpProblem('ice', pulp.LpMaximize)
# Define a decision variable
x_e = pulp.LpVariable('x_e', lowBound=0, cat=pulp.LpInteger)
x_r = pulp.LpVariable('x_r', lowBound=0, cat=pulp.LpInteger)
### Newly added decision variable
y_r = pulp.LpVariable('y_r', lowBound=0, cat=pulp.LpBinary)
# Set the objective function
problem += 50*x_e +10*x_r
# Set constraints
problem += 100*x_e + 150* x_r <= 8000
problem += 7*x_e + 5*x_r <= 360
### Newly added constraint
if x_r.value() >= 1:
y_r=1
problem += y_r == 1
# # Optimize
problem.solve()
# Print the result
print("Espresso",x_e.value(), "pieces")
print("raspberry",x_r.value(), "pieces")
print("profit",pulp.value(problem.objective), "yen")
结果如下,我报错了
if x_r.value() >= 1:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
我尝试在上面进行处理,但无法使用决策变量创建开关(如果语法)。
是否不可能在 pulp 中创建和解决这样的约束(= switch(if 语法)使用决策变量)?
(很抱歉我学习不足,但它是一个非线性问题,不能用纸浆表达吗?)
(很抱歉我学习不足,但也许这是一个非线性问题,不能用纸浆表达?)还是我的程序写得不好?
请告知原因及解决方法,不胜感激。
(如果可能的话,我想使用我熟悉的pulp,但是如果没有pulp也可以写程序,我想挑战一下,所以请告诉我。)
尝试:
if x_r.value() >= 1:
你忘了括号我相信
您不能添加基于 x_r.value()
的约束,因为在问题解决之前这将不可用。
更好的方法是通过两个附加约束连接 x_r
和 y_r
:
problem += M*y_r >= x_r
problem += y_r <= x_r
这里M
是一个足够大的数字,你的数据设置M = min(8000/150, 360/5)
就足够了。
简介
我想使用 Python 的纸浆创建一个“使用决策变量的开关(如果语法)”。 这里,“switch using decision variables (if syntax)”是指,例如,“当x(x为大于等于0的整数)和y(y为0、1的二元变量)为决策变量时,if x为大于等于1的整数,y输出1,x为0则y输出0,下面是一个简单的例子,公式见下面附的问题公式3(图片)
以下是我们如何尝试创建“带有决策变量的开关(if 语法)”以及我们取得的结果的简单示例。
例子是参考《运筹学概论》(东海大学出版社)中的例子制作的。
一家冰淇淋店打算生产两种冰淇淋:浓缩咖啡冰淇淋和覆盆子冰淇淋。然而,他不能随心所欲地生产,因为他只能生产 8000 cc 的牛奶并工作 360 分钟。鉴于每个冰淇淋所需的牛奶量和时间,增加产量以使利润最大化的计划是什么? 然而,今天一份覆盆子冰淇淋的覆盆子(配料)数量将过期。所以,你至少要生产一份覆盆子冰淇淋才不会浪费。
Product name | Quantity of milk needed | Working time | Profit |
---|---|---|---|
Espresso ice cream | 100cc | 7 minutes | 50 yen |
Raspberry ice cream | 150cc | 5 minutes | 10 yen |
上面的问题设置可以表述如下
Problem Formulation1
作为一个Python程序,可以表示如下
import pulp
problem = pulp.LpProblem('ice', pulp.LpMaximize)
# Define the decision variables
x_e = pulp.LpVariable('x_e', lowBound=0, cat=pulp.LpInteger)
x_r = pulp.LpVariable('x_r', lowBound=0, cat=pulp.LpInteger)
# Set the objective function
problem += 50*x_e +10*x_r
# Set constraints
problem += 100*x_e + 150* x_r <= 8000
problem += 7*x_e + 5*x_r <= 360
## Newly added constraint
problem += x_r >= 1
# # optimize
problem.solve()
# # print the result
print("Espresso",x_e.value(), "pieces")
print("raspberry",x_r.value(), "pieces")
print("profit",pulp.value(problem.objective), "yen")
运行上述程序的结果如下。 我们能够在不丢弃即将过期的覆盆子(一个覆盆子冰淇淋的量)的情况下实现利润最大化。
Espresso 50.0 pieces
raspberry 2.0 pieces
profit 2520.0 yen
挑战:在引入一个约束作为我自己创建的“带有决策变量的开关(如果语法)”(冰淇淋生产问题)
在上一章中,我们在原来的基础问题上增加了如下约束条件
Problem Formulation2
#Newly added constraints
problem += x_r >= 1
为了配合本题的主题,我们将此约束重写为“switch with decision variables (if syntax)”约束,如下所示
Problem Formulation3
import pulp
problem = pulp.LpProblem('ice', pulp.LpMaximize)
# Define a decision variable
x_e = pulp.LpVariable('x_e', lowBound=0, cat=pulp.LpInteger)
x_r = pulp.LpVariable('x_r', lowBound=0, cat=pulp.LpInteger)
### Newly added decision variable
y_r = pulp.LpVariable('y_r', lowBound=0, cat=pulp.LpBinary)
# Set the objective function
problem += 50*x_e +10*x_r
# Set constraints
problem += 100*x_e + 150* x_r <= 8000
problem += 7*x_e + 5*x_r <= 360
### Newly added constraint
if x_r.value() >= 1:
y_r=1
problem += y_r == 1
# # Optimize
problem.solve()
# Print the result
print("Espresso",x_e.value(), "pieces")
print("raspberry",x_r.value(), "pieces")
print("profit",pulp.value(problem.objective), "yen")
结果如下,我报错了
if x_r.value() >= 1:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
我尝试在上面进行处理,但无法使用决策变量创建开关(如果语法)。
是否不可能在 pulp 中创建和解决这样的约束(= switch(if 语法)使用决策变量)? (很抱歉我学习不足,但它是一个非线性问题,不能用纸浆表达吗?) (很抱歉我学习不足,但也许这是一个非线性问题,不能用纸浆表达?)还是我的程序写得不好?
请告知原因及解决方法,不胜感激。 (如果可能的话,我想使用我熟悉的pulp,但是如果没有pulp也可以写程序,我想挑战一下,所以请告诉我。)
尝试:
if x_r.value() >= 1:
你忘了括号我相信
您不能添加基于 x_r.value()
的约束,因为在问题解决之前这将不可用。
更好的方法是通过两个附加约束连接 x_r
和 y_r
:
problem += M*y_r >= x_r
problem += y_r <= x_r
这里M
是一个足够大的数字,你的数据设置M = min(8000/150, 360/5)
就足够了。