我正在尝试慢慢扩大优化问题的规模,并且在我试图将用户输入的值引入比较约束的阶段。但是,将抛出一个递归错误。我不确定我是否理解为什么会发生递归错误,以及如何修复它(参见约束部分的第一行)。当我硬编码一个值时,它可以工作,但当我使用用户输入时,它会抛出一个错误。
此外,作为额外的奖励,如果有人知道如何循环约束,我将非常感激。我已经在这个问题上摸索了一段时间了。最终,这将有10名员工和多达55个不同的部分,所以我认为在添加约束时循环将会容易得多。我已经在网上找过了,但还没有找到任何帮助。
# 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)发布于 2021-05-26 07:32:19
您在这里的轨道是正确的,但有一些问题。我不确定你会在哪里弹出一个递归错误。您必须发布完整的代码和错误消息,并提供行参考以获取相关帮助。
在你的输入上...我不明白您在哪里将数量转换为整数?回想一下,所有键盘输入都是作为字符串接受的,因此需要进行转换。但是,在调试时,最明智的做法是在开始时创建一些字典来保存数据,这样就不会重复键入数据。稍后,如果需要,您可以从键盘输入动态构建相同的字典/列表。还包括您的其他模型参数,如您在obj函数中使用的系数和数量限制。这将允许您清理您的约束。这里有一个想法来展示我的想法。
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)https://stackoverflow.com/questions/67686762
复制相似问题