首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要一个迭代多个字典的好方法

我需要一个迭代多个字典的好方法
EN

Stack Overflow用户
提问于 2021-06-01 19:53:04
回答 1查看 60关注 0票数 0

我正在处理一个优化问题,并通过将硬编码的、不灵活的解决方案转换为功能灵活的解决方案。我正在努力解决如何在PuLP优化问题的一个函数中使用多个字典。我最好的猜测是可以使用嵌套的for循环,但我不能理解如何做到这一点。下面是我当前的硬编码解决方案。

代码语言:javascript
复制
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]
EN

回答 1

Stack Overflow用户

发布于 2021-06-01 20:30:54

请注意,您提供的迭代器不是字典,而是集合。字典是以键和值的形式出现的,而集合只是对唯一值的说明。我不确定最后一部分的计算逻辑,但我希望这能让您先行一步了解如何循环遍历nest。另一个要注意的事项是,如果您的集合具有相同的长度,则应考虑使用enumerate,以便减少循环的嵌套

代码语言:javascript
复制
#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 output
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67788388

复制
相关文章

相似问题

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