我正在处理一个优化问题,并通过将硬编码的、不灵活的解决方案转换为功能灵活的解决方案。我正在努力解决如何在PuLP优化问题的一个函数中使用多个字典。我最好的猜测是可以使用嵌套的for循环,但我不能理解如何做到这一点。下面是我当前的硬编码解决方案。
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]发布于 2021-06-01 20:30:54
请注意,您提供的迭代器不是字典,而是集合。字典是以键和值的形式出现的,而集合只是对唯一值的说明。我不确定最后一部分的计算逻辑,但我希望这能让您先行一步了解如何循环遍历nest。另一个要注意的事项是,如果您的集合具有相同的长度,则应考虑使用enumerate,以便减少循环的嵌套
#step 1: #handles the intial calculaion for the values to be applied for the pulp.lpSum
def func(part, empl, eff,exptime):
val= 0
for indx, time in enumerate(exptime): # assumes you have the same data length
for prt in part:
for employee in empl:
for efficiency in eff:
val += (time *qty_produced[prt],employee)/efficiency
return val /(len(part)* len(empl))
#step2:
def model_func(func,part, empl, eff,exptime ):
len_emp = len(employees)//2
len_part= len(part)//2
len_eff = len(efficiency)//2
len_exp = len(exptime)//2
model = 0
func_result = func(part, empl, eff,exptime)
model+= (pulp.lpSum(func_result))
for xp1, xp2 in zip(part_numbers[:len_part], part_numbers[len_exp:]):
for empl1, emp2 in zip(employees[:len_emp],employees[len_emp:]):
for eff1, eff2 in zip(efficiency[:len_eff], efficiency[len_eff:]):
for exp1,exp2 in zip(exptime[:len_exp], exptime[len_exp:]):
model += #(exp1 * qty_produced[xp1] ,empl1/eff1 ) + (exp2 * qty_produced[xp2],empl2/eff2 ) as an example
return model
# call your function
model_func(func,part_numbers,employees,efficiency,exptime) # should return your model outputhttps://stackoverflow.com/questions/67788388
复制相似问题