linalg.solve() 遍历字典
linalg.solve() iteration over dictionaries
这是上下文:我必须生产不同产品的组合。
我不想为每种产品以单批次生产它们,而是希望尽可能小且同质地生产它们,每批次只包含少量的总产量。
对于我知道的每种产品的需求:
demands = {'p1': 140, 'p2': 220, 'p3': 275, 'p4': 320, 'p5': 60}
我知道我的工厂运行的时间(分钟):
tdisp = 460
我计算每个产品的生产率(min/piece):
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}
如果我按ceil生产,我会生产过剩,如果我按floor生产,我将无法满足需求。
所以我必须为一定数量的地块生产地板,为剩余部分生产天花板。
我想做的是为每个产品解决这样一个系统:
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)
但这是我得到的结果:
追溯(最近调用最后):
文件“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],拆分[1]]}})
TypeError: 'int' 对象不可订阅
您的代码的问题出在 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]}})
这是上下文:我必须生产不同产品的组合。 我不想为每种产品以单批次生产它们,而是希望尽可能小且同质地生产它们,每批次只包含少量的总产量。
对于我知道的每种产品的需求:
demands = {'p1': 140, 'p2': 220, 'p3': 275, 'p4': 320, 'p5': 60}
我知道我的工厂运行的时间(分钟):
tdisp = 460
我计算每个产品的生产率(min/piece):
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}
如果我按ceil生产,我会生产过剩,如果我按floor生产,我将无法满足需求。 所以我必须为一定数量的地块生产地板,为剩余部分生产天花板。 我想做的是为每个产品解决这样一个系统:
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)
但这是我得到的结果:
追溯(最近调用最后):
文件“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],拆分[1]]}})
TypeError: 'int' 对象不可订阅
您的代码的问题出在 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]}})