【问题标题】:linalg.solve() iteration over dictionarieslinalg.solve() 迭代字典
【发布时间】:2021-08-26 23:01:07
【问题描述】:

这里是上下文:我必须生产不同产品的组合。 我不想为每种产品单独生产一批,而是希望生产尽可能小且同质的批次,每批只占总产量的一小部分。

对于我知道需求的每种产品:

demands = {'p1': 140, 'p2': 220, 'p3': 275, 'p4': 320, 'p5': 60}

我知道我的工厂运行的时间(分钟):

tdisp = 460

我计算每个产品的生产率(分钟/件):

tts = {p: tdisp/demands[p] for p in demands}

我计算了在给定时间内我可以容纳的最大批次数,考虑到一个批次的长度作为生产最慢部分所需的时间:

n_seq = math.ceil(tdisp/max(tts.values()))

然后我会考虑一个批次的长度和每个产品的生产率之间的比率,看看我可以在一个批次中容纳多少个产品:

tt_ratios = {p: max(tts.values())/tts[p] for p in tts}

在很多情况下,这些值不是整数,但它们必须是整数,因为我们谈论的是单件! 所以我计算 bot 的上限值和下限值:

tt_ratios_ceil = {p: math.ceil(tt_ratios[p]) for p in tt_ratios}
tt_ratios_floor = {p: math.floor(tt_ratios[p]) for p in tt_ratios}

如果我按照ceil生产,我会生产过剩,如果我按照地板生产,我将无法满足需求。 所以我必须为一定数量的地块生产地板,为剩余的部分生产天花板。 我想做的是为每个产品解决一个这样的系统:

n*x +N*y = demands[part]
x + y = n_seq

n 为小写字母,N 为大写字母,x,y 分别为序列数。

这是完整的代码:

import math
import numpy as np

demands = {'p1': 140, 'p2': 220, 'p3': 275, 'p4': 320, 'p5': 60}
tdisp = 460
tts = {p: tdisp/demands[p] for p in demands}
n_seq = math.ceil(tdisp/max(tts.values()))
tt_ratios = {p: max(tts.values())/tts[p] for p in tts}

tt_ratios_ceil = {p: math.ceil(tt_ratios[p]) for p in tt_ratios}
tt_ratios_floor = {p: math.floor(tt_ratios[p]) for p in tt_ratios}

splits = {}
for p in tt_ratios:
    if tt_ratios[p] != 1:
        split = np.linalg.solve([[tt_ratios_floor[p], tt_ratios_ceil[p]], [1, 1]], [demands[p], n_seq])
    else:
        split = n_seq
    splits.update({p: {'min': [tt_ratios_floor[p], split[0]], 'max': [tt_ratios_ceil[p], split[1]]}})

print(splits)

但这是我得到的结果:

Traceback(最近一次调用最后一次):

文件“C:\Users\damia\PycharmProjects\logistic_management_tool\try.py”,第 19 行,在

splits.update({p: {'min': [tt_ratios_floor[p], split[0]], 'max': [tt_ratios_ceil[p],split[1]]}})

TypeError: 'int' 对象不可下标

【问题讨论】:

  • 这里的问题是当您将split 设置为n_seq(一个int),然后在更新字典时尝试调用split[1]
  • 哇,谢谢,我没看到!

标签: python numpy dictionary iteration


【解决方案1】:

您的代码的问题在于else 子句,您在其中将split 设置为int。确实,然后您尝试在之后立即调用split[1],从而得到一个错误。 解决此问题的方法是复制splits.update 指令并将其修改为与int 一起使用,如下所述:

if tt_ratios[p] != 1:
    split = np.linalg.solve([[tt_ratios_floor[p], tt_ratios_ceil[p]], [1, 1]], [demands[p], n_seq])
    splits.update({p: {'min': [tt_ratios_floor[p], split[0]], 'max': [tt_ratios_ceil[p], split[1]]}})
else:
    split = n_seq
    splits.update({p: {'min': [tt_ratios_floor[p], split], 'max': [tt_ratios_ceil[p], split]}})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2017-10-29
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多