我试图将以下问题降到最低程度:在生产笔记本电脑、手机和平板电脑时,库存成本(每月1美元)和加班时间(每小时10美元)都有成本。有一个需求计划需要满足,它作为一个特定月份的最小小工具数量的约束。除此之外,还有最多20000小时的生产,外加每月3000个加班小时。
问题是python/pulp给我的结果(只有一个例外)是插入到LpVariables中的所有上限值:而不是最小化的成本!
from pulp import *
# Define the LP problem: minimize costs
prob = LpProblem("Minimize costs of production and inventory", LpMinimize)
# Demand schemes
demand_laptops = [75, 125, 1000, 1500, 1000, 500, 1250, 1500, 1000, 500, 500, 400, 300] # Demand laptops
demand_phones = [120, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000] # Demand phones
demand_tablets = [50, 2000, 3000, 2000, 3000, 4000, 5000, 2000, 3000, 4000, 5000, 4000, 5000] # Demand tablets
# Defining variables: normal production hours and overtime production hours.
production_laptop = {x: LpVariable("Production hours for laptop in month {}".format(x), 0, 20000)
for x in range(1, 13)}
production_phone = {x: LpVariable("Production hours for phone in month {}".format(x), 0, 20000)
for x in range(1, 13)}
production_tablet = {x: LpVariable("Production hours for tablet in month {}".format(x), 0, 20000)
for x in range(1, 13)}
overtime_laptop = {x: LpVariable("Overtime hours for laptop in month {}".format(x), 0, 3000)
for x in range(1, 13)}
overtime_phone = {x: LpVariable("Overtime hours for phone in month {}".format(x), 0, 3000)
for x in range(1, 13)}
overtime_tablet = {x: LpVariable("Overtime hours for tablet in month {}".format(x), 0, 3000)
for x in range(1, 13)}
# defining a list of names for the inventory of products
inventory_laptops = {x: "inventory of laptops in month {}".format(x)
for x in range(1, 13)}
inventory_phones = {x: "inventory of phones in month {}".format(x)
for x in range(1, 13)}
inventory_tables = {x: "inventory of tablets in month {}".format(x)
for x in range(1, 13)}
# Inventory (to be minimized)
inventory_laptops[1] = demand_laptops[0] + (1 / 5) * production_laptop[1] + (1 / 5) * overtime_laptop[1] - demand_laptops[1]
inventory_laptops[2] = inventory_laptops[1] + (1 / 5) * production_laptop[2] + (1 / 5) * overtime_laptop[2] - demand_laptops[2]
inventory_laptops[3] = inventory_laptops[2] + (1 / 5) * production_laptop[3] + (1 / 5) * overtime_laptop[3] - demand_laptops[3]
inventory_laptops[4] = inventory_laptops[3] + (1 / 5) * production_laptop[4] + (1 / 5) * overtime_laptop[4] - demand_laptops[4]
inventory_laptops[5] = inventory_laptops[4] + (1 / 5) * production_laptop[5] + (1 / 5) * overtime_laptop[5] - demand_laptops[5]
inventory_laptops[6] = inventory_laptops[5] + (1 / 5) * production_laptop[6] + (1 / 5) * overtime_laptop[6] - demand_laptops[6]
inventory_laptops[7] = inventory_laptops[6] + (1 / 5) * production_laptop[7] + (1 / 5) * overtime_laptop[7] - demand_laptops[7]
inventory_laptops[8] = inventory_laptops[7] + (1 / 5) * production_laptop[8] + (1 / 5) * overtime_laptop[8] - demand_laptops[8]
inventory_laptops[9] = inventory_laptops[8] + (1 / 5) * production_laptop[9] + (1 / 5) * overtime_laptop[9] - demand_laptops[9]
inventory_laptops[10] = inventory_laptops[9] + (1 / 5) * production_laptop[10] + (1 / 5) * overtime_laptop[10] - demand_laptops[10]
inventory_laptops[11] = inventory_laptops[10] + (1 / 5) * production_laptop[11] + (1 / 5) * overtime_laptop[11] - demand_laptops[11]
inventory_laptops[12] = inventory_laptops[11] + (1 / 5) * production_laptop[12] + (1 / 5) * overtime_laptop[12] - demand_laptops[12]
inventory_phones[1] = demand_phones[0] + (1 / 2) * production_phone[1] + (1 / 2) * overtime_phone[1] - demand_phones[1]
inventory_phones[2] = inventory_phones[1] + (1 / 2) * production_phone[2] + (1 / 2) * overtime_phone[2] - demand_phones[2]
inventory_phones[3] = inventory_phones[2] + (1 / 2) * production_phone[3] + (1 / 2) * overtime_phone[3] - demand_phones[3]
inventory_phones[4] = inventory_phones[3] + (1 / 2) * production_phone[4] + (1 / 2) * overtime_phone[4] - demand_phones[4]
inventory_phones[5] = inventory_phones[4] + (1 / 2) * production_phone[5] + (1 / 2) * overtime_phone[5] - demand_phones[5]
inventory_phones[6] = inventory_phones[5] + (1 / 2) * production_phone[6] + (1 / 2) * overtime_phone[6] - demand_phones[6]
inventory_phones[7] = inventory_phones[6] + (1 / 2) * production_phone[7] + (1 / 2) * overtime_phone[7] - demand_phones[7]
inventory_phones[8] = inventory_phones[7] + (1 / 2) * production_phone[8] + (1 / 2) * overtime_phone[8] - demand_phones[8]
inventory_phones[9] = inventory_phones[8] + (1 / 2) * production_phone[9] + (1 / 2) * overtime_phone[9] - demand_phones[9]
inventory_phones[10] = inventory_phones[9] + (1 / 2) * production_phone[10] + (1 / 2) * overtime_phone[10] - demand_phones[10]
inventory_phones[11] = inventory_phones[10] + (1 / 2) * production_phone[11] + (1 / 2) * overtime_phone[11] - demand_phones[11]
inventory_phones[12] = inventory_phones[11] + (1 / 2) * production_phone[12] + (1 / 2) * overtime_phone[12] - demand_phones[12]
inventory_tables[1] = demand_tablets[0] + (1 / 4) * production_tablet[1] + (1 / 4) * overtime_tablet[1] - demand_tablets[1]
inventory_tables[2] = inventory_tables[1] + (1 / 4) * production_tablet[2] + (1 / 4) * overtime_tablet[2] - demand_tablets[2]
inventory_tables[3] = inventory_tables[2] + (1 / 4) * production_tablet[3] + (1 / 4) * overtime_tablet[3] - demand_tablets[3]
inventory_tables[4] = inventory_tables[3] + (1 / 4) * production_tablet[4] + (1 / 4) * overtime_tablet[4] - demand_tablets[4]
inventory_tables[5] = inventory_tables[4] + (1 / 4) * production_tablet[5] + (1 / 4) * overtime_tablet[5] - demand_tablets[5]
inventory_tables[6] = inventory_tables[5] + (1 / 4) * production_tablet[6] + (1 / 4) * overtime_tablet[6] - demand_tablets[6]
inventory_tables[7] = inventory_tables[6] + (1 / 4) * production_tablet[7] + (1 / 4) * overtime_tablet[7] - demand_tablets[7]
inventory_tables[8] = inventory_tables[7] + (1 / 4) * production_tablet[8] + (1 / 4) * overtime_tablet[8] - demand_tablets[8]
inventory_tables[9] = inventory_tables[8] + (1 / 4) * production_tablet[9] + (1 / 4) * overtime_tablet[9] - demand_tablets[9]
inventory_tables[10] = inventory_tables[9] + (1 / 4) * production_tablet[10] + (1 / 4) * overtime_tablet[10] - demand_tablets[10]
inventory_tables[11] = inventory_tables[10] + (1 / 4) * production_tablet[11] + (1 / 4) * overtime_tablet[11] - demand_tablets[11]
inventory_tables[12] = inventory_tables[11] + (1 / 4) * production_tablet[12] + (1 / 4) * overtime_tablet[12] - demand_tablets[12]
# Constraints to meet demand scheme
prob += demand_laptops[0] + (1 / 5) * production_laptop[1] + (1 / 5) * overtime_laptop[1] >= demand_laptops[1]
prob += inventory_laptops[1] + (1 / 5) * production_laptop[2] + (1 / 5) * overtime_laptop[2] >= demand_laptops[2]
prob += inventory_laptops[2] + (1 / 5) * production_laptop[3] + (1 / 5) * overtime_laptop[3] >= demand_laptops[3]
prob += inventory_laptops[3] + (1 / 5) * production_laptop[4] + (1 / 5) * overtime_laptop[4] >= demand_laptops[4]
prob += inventory_laptops[4] + (1 / 5) * production_laptop[5] + (1 / 5) * overtime_laptop[5] >= demand_laptops[5]
prob += inventory_laptops[5] + (1 / 5) * production_laptop[6] + (1 / 5) * overtime_laptop[6] >= demand_laptops[6]
prob += inventory_laptops[6] + (1 / 5) * production_laptop[7] + (1 / 5) * overtime_laptop[7] >= demand_laptops[7]
prob += inventory_laptops[7] + (1 / 5) * production_laptop[8] + (1 / 5) * overtime_laptop[8] >= demand_laptops[8]
prob += inventory_laptops[8] + (1 / 5) * production_laptop[9] + (1 / 5) * overtime_laptop[9] >= demand_laptops[9]
prob += inventory_laptops[9] + (1 / 5) * production_laptop[10] + (1 / 5) * overtime_laptop[10] >= demand_laptops[10]
prob += inventory_laptops[10] + (1 / 5) * production_laptop[11] + (1 / 5) * overtime_laptop[11] >= demand_laptops[11]
prob += inventory_laptops[11] + (1 / 5) * production_laptop[12] + (1 / 5) * overtime_laptop[12] >= demand_laptops[12]
prob += demand_phones[0] + (1 / 2) * production_phone[1] + (1 / 2) * overtime_phone[1] >= demand_phones[1]
prob += inventory_phones[1] + (1 / 2) * production_phone[2] + (1 / 2) * overtime_phone[2] >= demand_phones[2]
prob += inventory_phones[2] + (1 / 2) * production_phone[3] + (1 / 2) * overtime_phone[3] >= demand_phones[3]
prob += inventory_phones[3] + (1 / 2) * production_phone[4] + (1 / 2) * overtime_phone[4] >= demand_phones[4]
prob += inventory_phones[4] + (1 / 2) * production_phone[5] + (1 / 2) * overtime_phone[5] >= demand_phones[5]
prob += inventory_phones[5] + (1 / 2) * production_phone[6] + (1 / 2) * overtime_phone[6] >= demand_phones[6]
prob += inventory_phones[6] + (1 / 2) * production_phone[7] + (1 / 2) * overtime_phone[7] >= demand_phones[7]
prob += inventory_phones[7] + (1 / 2) * production_phone[8] + (1 / 2) * overtime_phone[8] >= demand_phones[8]
prob += inventory_phones[8] + (1 / 2) * production_phone[9] + (1 / 2) * overtime_phone[9] >= demand_phones[9]
prob += inventory_phones[9] + (1 / 2) * production_phone[10] + (1 / 2) * overtime_phone[10] >= demand_phones[10]
prob += inventory_phones[10] + (1 / 2) * production_phone[11] + (1 / 2) * overtime_phone[11] >= demand_phones[11]
prob += inventory_phones[11] + (1 / 2) * production_phone[12] + (1 / 2) * overtime_phone[12] >= demand_phones[12]
prob += demand_tablets[0] + (1 / 4) * production_tablet[1] + (1 / 4) * overtime_tablet[1] >= demand_tablets[1]
prob += inventory_phones[1] + (1 / 4) * production_tablet[2] + (1 / 4) * overtime_tablet[2] >= demand_tablets[2]
prob += inventory_phones[2] + (1 / 4) * production_tablet[3] + (1 / 4) * overtime_tablet[3] >= demand_tablets[3]
prob += inventory_phones[3] + (1 / 4) * production_tablet[4] + (1 / 4) * overtime_tablet[4] >= demand_tablets[4]
prob += inventory_phones[4] + (1 / 4) * production_tablet[5] + (1 / 4) * overtime_tablet[5] >= demand_tablets[5]
prob += inventory_phones[5] + (1 / 4) * production_tablet[6] + (1 / 4) * overtime_tablet[6] >= demand_tablets[6]
prob += inventory_phones[6] + (1 / 4) * production_tablet[7] + (1 / 4) * overtime_tablet[7] >= demand_tablets[7]
prob += inventory_phones[7] + (1 / 4) * production_tablet[8] + (1 / 4) * overtime_tablet[8] >= demand_tablets[8]
prob += inventory_phones[8] + (1 / 4) * production_tablet[9] + (1 / 4) * overtime_tablet[9] >= demand_tablets[9]
prob += inventory_phones[9] + (1 / 4) * production_tablet[10] + (1 / 4) * overtime_tablet[10] >= demand_tablets[10]
prob += inventory_phones[10] + (1 / 4) * production_tablet[11] + (1 / 4) * overtime_tablet[11] >= demand_tablets[11]
prob += inventory_phones[11] + (1 / 4) * production_tablet[12] + (1 / 4) * overtime_tablet[12] >= demand_tablets[12]
# Objective function: inventory costs and overtime costs (10 per hour)
prob += sum(inventory_laptops) + sum(inventory_phones) + sum(inventory_tables) + (10 * (sum(overtime_laptop) + sum(overtime_phone) + sum(overtime_tablet)))
# Solve the problem
prob.solve()
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
print("total costs:", value(prob.objective))这给了我以下结果:
Status: Optimal
Overtime_hours_for_laptop_in_month_1 = 3000.0
Overtime_hours_for_laptop_in_month_10 = 3000.0
Overtime_hours_for_laptop_in_month_11 = 3000.0
Overtime_hours_for_laptop_in_month_12 = 3000.0
Overtime_hours_for_laptop_in_month_2 = 3000.0
Overtime_hours_for_laptop_in_month_3 = 3000.0
Overtime_hours_for_laptop_in_month_4 = 3000.0
Overtime_hours_for_laptop_in_month_5 = 3000.0
Overtime_hours_for_laptop_in_month_6 = 3000.0
Overtime_hours_for_laptop_in_month_7 = 3000.0
Overtime_hours_for_laptop_in_month_8 = 3000.0
Overtime_hours_for_laptop_in_month_9 = 3000.0
Overtime_hours_for_phone_in_month_1 = 3000.0
Overtime_hours_for_phone_in_month_10 = 3000.0
Overtime_hours_for_phone_in_month_11 = 3000.0
Overtime_hours_for_phone_in_month_12 = 3000.0
Overtime_hours_for_phone_in_month_2 = 3000.0
Overtime_hours_for_phone_in_month_3 = 3000.0
Overtime_hours_for_phone_in_month_4 = 3000.0
Overtime_hours_for_phone_in_month_5 = 3000.0
Overtime_hours_for_phone_in_month_6 = 3000.0
Overtime_hours_for_phone_in_month_7 = 3000.0
Overtime_hours_for_phone_in_month_8 = 3000.0
Overtime_hours_for_phone_in_month_9 = 3000.0
Overtime_hours_for_tablet_in_month_1 = 0.0
Overtime_hours_for_tablet_in_month_10 = 3000.0
Overtime_hours_for_tablet_in_month_11 = 3000.0
Overtime_hours_for_tablet_in_month_12 = 3000.0
Overtime_hours_for_tablet_in_month_2 = 3000.0
Overtime_hours_for_tablet_in_month_3 = 3000.0
Overtime_hours_for_tablet_in_month_4 = 3000.0
Overtime_hours_for_tablet_in_month_5 = 3000.0
Overtime_hours_for_tablet_in_month_6 = 3000.0
Overtime_hours_for_tablet_in_month_7 = 3000.0
Overtime_hours_for_tablet_in_month_8 = 3000.0
Overtime_hours_for_tablet_in_month_9 = 3000.0
Production_hours_for_laptop_in_month_1 = 20000.0
Production_hours_for_laptop_in_month_10 = 20000.0
Production_hours_for_laptop_in_month_11 = 20000.0
Production_hours_for_laptop_in_month_12 = 20000.0
Production_hours_for_laptop_in_month_2 = 20000.0
Production_hours_for_laptop_in_month_3 = 20000.0
Production_hours_for_laptop_in_month_4 = 20000.0
Production_hours_for_laptop_in_month_5 = 20000.0
Production_hours_for_laptop_in_month_6 = 20000.0
Production_hours_for_laptop_in_month_7 = 20000.0
Production_hours_for_laptop_in_month_8 = 20000.0
Production_hours_for_laptop_in_month_9 = 20000.0
Production_hours_for_phone_in_month_1 = 20000.0
Production_hours_for_phone_in_month_10 = 20000.0
Production_hours_for_phone_in_month_11 = 20000.0
Production_hours_for_phone_in_month_12 = 20000.0
Production_hours_for_phone_in_month_2 = 20000.0
Production_hours_for_phone_in_month_3 = 20000.0
Production_hours_for_phone_in_month_4 = 20000.0
Production_hours_for_phone_in_month_5 = 20000.0
Production_hours_for_phone_in_month_6 = 20000.0
Production_hours_for_phone_in_month_7 = 20000.0
Production_hours_for_phone_in_month_8 = 20000.0
Production_hours_for_phone_in_month_9 = 20000.0
Production_hours_for_tablet_in_month_1 = 7800.0
Production_hours_for_tablet_in_month_10 = 20000.0
Production_hours_for_tablet_in_month_11 = 20000.0
Production_hours_for_tablet_in_month_12 = 20000.0
Production_hours_for_tablet_in_month_2 = 20000.0
Production_hours_for_tablet_in_month_3 = 20000.0
Production_hours_for_tablet_in_month_4 = 20000.0
Production_hours_for_tablet_in_month_5 = 20000.0
Production_hours_for_tablet_in_month_6 = 20000.0
Production_hours_for_tablet_in_month_7 = 20000.0
Production_hours_for_tablet_in_month_8 = 20000.0
Production_hours_for_tablet_in_month_9 = 20000.0
__dummy = None
total costs: None有人能告诉我我做错了什么吗?
发布于 2016-10-23 09:47:13
有一些语法故障会导致求解者得到一个与您预期不同的模型。此外,我也想指出一些句法建议。
怎么了?
首先,production变量被定义为字典,其值为LpVariables。我建议您使用为这项工作设计的pulp数据结构,LpVariable.dicts。这样定义就会是这样:
production_laptop = LpVariable.dicts(
"Production hours for laptop in month ", range(1, 13),
lowBound = 0, upBound = 20000)请注意,我显式地表示下界和上界:这是一个好习惯,如果您必须在几个月(甚至几周)后重用代码,这会有很大帮助。
稍后,定义表示变量名称的字典:inventory_变量。然后,重新定义这些字典的值,以指向变量和约束的组合。我将这些变量定义为前面的变量:
inventory_laptops = LpVariable.dicts(
"inventory of laptops in month ", range(1,13), lowBound = 0)如果变量之间存在关系,则可以在约束中表示它们,因此在变量定义阶段不需要担心这一点。
注意,在定义变量之后,应该定义目标函数。它的定义是不正确的,因为它不是sum(inventory_laptops),而是sum(inventory_laptops[i] for i in range(1,13)),否则我们尝试通过字典(特别是在字典的钥匙上 )来实现sum。
语法
DRY:您编写了大量重复的代码,这些代码可以很容易地放入循环中。尝试不重复你自己,因为代码不必要的冗长和复杂,并且容易出错。实际上,您的代码中有一个错误,可能是因为您已经有了复制粘贴代码:最后一个约束块混合了电话和平板电脑,如下所示:
prob += inventory_phones[1] + (1 / 4) * production_tablet[2] + (1 / 4) * overtime_tablet[2] >= demand_tablets[2]可能是因为您正在复制、粘贴并用phones替换tablets。您可以很容易地将这些行写成
for i in range(1,13):
prob += (demand_tablets[i - 1] if i == 1 else inventory_tables[i - 1]) + \
(1 / 4) * production_tablet[i] + (1 / 4) * overtime_tablet[i] >= \
demand_tablets[i], "demand tablets {}".format(i)它还具有额外的好处,即您为约束指定了一个名称,以便以后可以跟踪它(如果需要)。
注释:尝试使用有用的注释。这些评论描述的是你的意图,而不是你实际做的事情。当变量名为# Demand laptops时,为什么要注释demand_laptops
Consistency:,这是一个大的。使用代码需要一些时间,主要是因为变量名称不一致:demand_tablets, inventory_tables, overtime_tablet和production_tablet都非常相似,很容易混淆。试着坚持更一致的表示法。
行长度:虽然不是必要的,但Python不使用任意的行长度。尝试使用一个好的IDE (我使用Pycharm,有时使用崇高文本),它将引导您使用常规的Python约定(也用于命名变量、函数等)。这使得代码看起来更像Python。
调试数学优化模型:小问题的一个非常有用的习惯,就是打印出传递给求解者的公式。这可以帮助您捕获许多错误和问题。例如,很明显,您已经定义了一个名为_dummy的变量,它是意外完成的。这是用prob.writeLP("DebugThis.lp")完成的。我也会使用更短的长度变量,这样我就可以理解约束和目标函数中发生了什么。最后,尽量避免在模型中使用硬数字。对于现在的实例,库存成本可能是10,但在将来,这种情况可能会发生变化(在不分配的环境中会发生变化)。因此,最好定义一份库存成本清单(每个产品和/或周期一份),并只更新该清单。如果您想要添加更多的产品,这是很有帮助的,因为约束和变量将自动生成。
修订代码
我在此实现了您代码的工作版本。为了让它接近原版,这样更容易理解(对你自己来说)我没有实现我建议的所有东西。作为对下面几行的进一步改进,尝试拥有一个产品列表并自动生成产品月份对。有几种方法可以做到这一点,也许这个例子会有所帮助。
from pulp import * # I would not import the entire workspace - you might end up shadowing variables names that you need
# Problem formulation starts here
prob = LpProblem("Minimize costs of production and inventory", LpMinimize)
# Problem data: Product Demands
demand_laptops = [75, 125, 1000, 1500, 1000, 500, 1250, 1500, 1000, 500, 500, 400, 300]
demand_phones = [120, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000]
demand_tablets = [50, 2000, 3000, 2000, 3000, 4000, 5000, 2000, 3000, 4000, 5000, 4000, 5000]
# Defining variables: normal production, overtime, and inventories
production_laptop = LpVariable.dicts(
"Production hours for laptop in month ", range(1, 13),
lowBound = 0, upBound = 20000)
production_phone = LpVariable.dicts(
"Production hours for phone in month ", range(1, 13),
lowBound = 0, upBound = 20000)
production_tablet = LpVariable.dicts(
"Production hours for tablet in month ", range(1, 13),
lowBound = 0, upBound = 20000)
overtime_laptop = LpVariable.dicts(
"Overtime hours for laptop in month ", range(1, 13),
lowBound = 0, upBound = 3000)
overtime_phone = LpVariable.dicts(
"Overtime hours for phone in month ", range(1, 13),
lowBound = 0, upBound = 3000)
overtime_tablet = LpVariable.dicts(
"Overtime hours for tablet in month ", range(1, 13),
lowBound = 0, upBound = 3000)
inventory_laptops = LpVariable.dicts(
"inventory of laptops in month ", range(1,13), lowBound = 0)
inventory_phones = LpVariable.dicts(
"inventory of phones in month ", range(1,13), lowBound = 0)
inventory_tables = LpVariable.dicts(
"inventory of tables in month ", range(1,13), lowBound = 0)
# Objective function: inventory costs and overtime costs
prob += (sum(
inventory_laptops[i] + inventory_phones[i] + inventory_tables[i]
for i in range(1,13)) + \
10 * sum(overtime_laptop[i] + overtime_phone[i] + overtime_tablet[i]
for i in range(1,13)))
# Constraint definition part
for i in range(1,13):
# Inventory definition for laptops, phones and tablets
prob += inventory_laptops[i] == (demand_laptops[i - 1] if i == 1 else \
inventory_laptops[i - 1]) + \
(1 / 5) * production_laptop[i] + (1 / 5) * overtime_laptop[i] - \
demand_laptops[i], "inventory_laptops definition {}".format(i)
prob += inventory_phones[i] == (demand_phones[i - 1] if i == 1 else \
inventory_phones[i - 1]) + \
(1 / 2) * production_phone[i] + (1 / 2) * overtime_phone[i] - \
demand_phones[i], "inventory_phones definition {}".format(i)
prob += inventory_tables[i] == (demand_tablets[i - 1] if i == 1 else \
inventory_tables[i - 1]) + \
(1 / 4) * production_tablet[i] + (1 / 4) * overtime_tablet[i] - \
demand_tablets[i], "inventory_tables definition {}".format(i)
# Demand-covering constraints for laptops, phones, tablets
prob += (demand_laptops[i - 1] if i == 1 else inventory_laptops[i - 1]) + \
(1 / 5) * production_laptop[i] + (1 / 5) * overtime_laptop[i] >= \
demand_laptops[i], "demand laptops {}".format(i)
prob += (demand_phones[i - 1] if i == 1 else inventory_phones[i - 1]) + \
(1 / 2) * production_phone[i] + (1 / 2) * overtime_phone[i] >= \
demand_phones[i], "demand phones {}".format(i)
prob += (demand_tablets[i - 1] if i == 1 else inventory_tables[i - 1]) + \
(1 / 4) * production_tablet[i] + (1 / 4) * overtime_tablet[i] >= \
demand_tablets[i], "demand tablets {}".format(i)
# Solve the problem
prob.solve()
# Take a look at what was solved
prob.writeLP("SO40113557.lp")
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
print("total costs:", value(prob.objective))输出(不打印变量名称/值):
('Status:', 'Optimal')
('total costs:', 0.0)我希望这能帮到你!
https://stackoverflow.com/questions/40113557
复制相似问题