I'm working on an optimization problem and working through converting a hard coded, inflexible solution into a functional, flexible one. I'm struggling on how to use multiple dictionaries in a function of a PuLP optimization problem. My best guess would be to possible use nested for loops, but can't wrap my head around how to do this. Below is what my current hard coded solution looks like.
import pulp
part_numbers = {"Part A", "Part B"}
employees = {"Employee A", "Employee B", "Employee C", "Employee D", "Employee E", "Employee F", "Employee G", "Employee H"}
efficiency = {85, .75, .5, .75, .59, .40, .87, .37, .65, .85, .85, .5, .4, .8, .3, .92}
exptime = {20, 10}
model += ((
(pulp.lpSum(
( (exptime[0] * qty_produced[part_numbers[0], employees[0]])/ efficiency[0])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[1]])/ efficiency[1])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[2]])/ efficiency[2])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[3]]) / efficiency[3])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[4]]) / efficiency[4])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[5]]) / efficiency[5])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[6]]) / efficiency[6])
+ ((exptime[0] * qty_produced[part_numbers[0], employees[7]]) / efficiency[7])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[0]])/ efficiency[8])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[1]])/ efficiency[9])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[2]])/ efficiency[10])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[3]]) / efficiency[11])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[4]]) / efficiency[12])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[5]]) / efficiency[13])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[6]]) / efficiency[14])
+ ((exptime[1] * qty_produced[part_numbers[1], employees[7]]) / efficiency[15])
))/(len(part_numbers)*(len(employees)))))
model += ((exptime[0] * qty_produced[part_numbers[0], employees[0]])/efficiency[0]) + ((exptime[1] * qty_produced[part_numbers[1], employees[0]])/efficiency[8]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[1]])/efficiency[1]) + ((exptime[1] * qty_produced[part_numbers[1], employees[1]])/efficiency[9]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[2]])/efficiency[2]) + ((exptime[1] * qty_produced[part_numbers[1], employees[2]])/efficiency[10]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[3]])/efficiency[3]) + ((exptime[1] * qty_produced[part_numbers[1], employees[3]])/efficiency[11]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[4]])/efficiency[4]) + ((exptime[1] * qty_produced[part_numbers[1], employees[4]])/efficiency[12]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[5]])/efficiency[5]) + ((exptime[1] * qty_produced[part_numbers[1], employees[5]])/efficiency[13]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[6]])/efficiency[6]) + ((exptime[1] * qty_produced[part_numbers[1], employees[6]])/efficiency[14]) <= 530
model += ((exptime[0] * qty_produced[part_numbers[0], employees[7]])/efficiency[7]) + ((exptime[1] * qty_produced[part_numbers[1], employees[7]])/efficiency[15]) <= 530
model.solve()
pulp.LpStatus[model.status]