首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PuLP优化的RecursionError

使用PuLP优化的RecursionError
EN

Stack Overflow用户
提问于 2021-05-25 19:10:17
回答 1查看 33关注 0票数 0

我正在尝试慢慢扩大优化问题的规模,并且在我试图将用户输入的值引入比较约束的阶段。但是,将抛出一个递归错误。我不确定我是否理解为什么会发生递归错误,以及如何修复它(参见约束部分的第一行)。当我硬编码一个值时,它可以工作,但当我使用用户输入时,它会抛出一个错误。

此外,作为额外的奖励,如果有人知道如何循环约束,我将非常感激。我已经在这个问题上摸索了一段时间了。最终,这将有10名员工和多达55个不同的部分,所以我认为在添加约束时循环将会容易得多。我已经在网上找过了,但还没有找到任何帮助。

代码语言:javascript
复制
# Initial User Input
total_parts = int(input("Enter number of different parts: "))
partno = []
quantity = []
for i in range(total_parts):
    pn = input("Enter Part Number : ").strip()
    qty = input("Enter Qty of Part Number : ")
    partno.append(pn)
    quantity.append(qty)

# Pulp Model
model = pulp.LpProblem("Part production", pulp.LpMinimize)

# Construct decision variable lists
part_numbers = partno
employees = ['Employee A', 'Employee B', 'Employee C']

qty_produced = pulp.LpVariable.dicts("production",
                                     ((i, j) for i in part_numbers for j in employees),
                                     lowBound=0,
                                     cat='Continuous')
# Objective Function
model += ((
    (pulp.lpSum(
        ((10 * qty_produced[part_numbers[0], employees[0]])/.5)
        +((10 * qty_produced[part_numbers[0], employees[1]])/.85)
       + ((10 * qty_produced[part_numbers[0], employees[2]])/.65)
        +((30 * qty_produced[part_numbers[1], employees[0]])/.85)
       + ((30 * qty_produced[part_numbers[1], employees[1]])/.75)
        +((30 * qty_produced[part_numbers[1], employees[2]])/.95)
))/6))

# Constraints
model += pulp.lpSum([qty_produced[part_numbers[0], j] for j in employees]) >= quantity[0]
model += pulp.lpSum([qty_produced[part_numbers[1], j] for j in employees]) >= 10
model += ((10 * qty_produced[part_numbers[0], employees[0]])/.5) + ((30 * qty_produced[part_numbers[1], employees[0]])/.85) <= 530
model += ((10 * qty_produced[part_numbers[0], employees[1]])/.5) + ((30 * qty_produced[part_numbers[1], employees[1]])/.85) <= 530
model += ((10 * qty_produced[part_numbers[0], employees[2]])/.5) + ((30 * qty_produced[part_numbers[1], employees[2]])/.85) <= 530

# Solve problem
model.solve()
pulp.LpStatus[model.status]

for var in qty_produced:
    var_value = qty_produced[var].varValue
    print("The quantity of {1} produced by {0} is {2}".format(var[1], var[0], var_value))

avg_time = pulp.value(model.objective)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-26 07:32:19

您在这里的轨道是正确的,但有一些问题。我不确定你会在哪里弹出一个递归错误。您必须发布完整的代码和错误消息,并提供行参考以获取相关帮助。

在你的输入上...我不明白您在哪里将数量转换为整数?回想一下,所有键盘输入都是作为字符串接受的,因此需要进行转换。但是,在调试时,最明智的做法是在开始时创建一些字典来保存数据,这样就不会重复键入数据。稍后,如果需要,您可以从键盘输入动态构建相同的字典/列表。还包括您的其他模型参数,如您在obj函数中使用的系数和数量限制。这将允许您清理您的约束。这里有一个想法来展示我的想法。

代码语言:javascript
复制
import pulp

## Data

employees = {'bob', 'cindy', 'tom'}
parts = {'A19', 'X22'}
max_quantities = {  'A19': 200,
                    'X22': 150}

## Model
prob = pulp.LpProblem('sample', pulp.LpMinimize)

X = pulp.LpVariable.dicts("produce", [(e, p) for e in employees for p in parts],
                            lowBound=0, cat="Integer")

# max_production
for p in parts:
    prob += pulp.lpSum(X[e, p] for e in employees) <= max_quantities[p]

print(prob)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67686762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档