3 回答
TA贡献1824条经验 获得超8个赞
也许我们可以讨论这个作为讨论的基础:
import numpy as np
np.random.seed(42)
L = np.random.randint(0, 10, 10)
q = 7
print(L)
def subs(L, q):
sum = 0
for i, e in enumerate(L):
sum += e
if sum > q:
if abs(sum - q) > abs(sum - e - q):
r = sum - e
sum = e
n = i - 1
else:
r = sum
sum = 0
n = i
yield n, r
yield i, sum
print(list(subs(L, q)))
解释 :
基本上,这个函数首先检查 ifsum是否大于q. 仅当是时,您才有两个值,它们不是都小于或都大于 q。这是您的测试的先决条件,两者中的一个与 的距离较小q。
现在,根据哪个更接近q,函数返回sum或sum - e。
现在我在这里使用动词return而在代码中使用yield:它不是一个常用的函数,而是一个generator。关于这种类型函数的主要线索是,当它们产生一个值时,你可以认为在第一步中就像返回一个值,但有一个重要区别:函数本身不返回(即不结束),但是睡着了,等待它的下一次调用,保持它的完整状态,包括到现在计算的所有值,然后在yield之后继续下一行,就好像之前什么都没发生一样 - 直到下一个yield关键字。
简而言之:如果您想总结到任何事情但又不想在达到任何事情时停下来,IMO正是您所需要的...... :)
TA贡献2012条经验 获得超12个赞
只是我对问题的看法,正如我在您的问题下方的评论中所述:
一种算法,它计算每个期间每个订单所需的固定数量订单数量,以便始终满足需求。
另外,每个订单的其余部分,在某个时期没有被覆盖,因此最终可以少一个订单来覆盖下一个时期的需求。
def calcOrder(demand, Q):
result = []
rest = 0
for i, e in enumerate(demand):
current = e - rest
order = np.ceil(current/Q)
result.append(int(order))
rest = order * Q - current
return result
例子:
import numpy as np
np.random.seed(793)
demand = np.random.randint(0, 51, 5)
Q = 12
demand
# array([50, 20, 19, 48, 25])
print(f'demand\tcurrent\torder\trest')
rest = 0
for i, e in enumerate(demand):
current = e - rest
order = int(np.ceil(current/Q))
rest = order * Q - current
print(f'{e}\t{current}\t{order}\t{rest}')
# demand current order rest
# 50 50 5 10
# 20 10 1 2
# 19 17 2 7
# 48 41 4 7
# 25 18 2 6
添加回答
举报