我遇到一个问题,我需要我的代码添加列表元素,直到总和尽可能接近常量为止。达到常数后,我需要代码来存储总和以及索引的总和(计算达到该总和需要多少个变量)。我是Python的初学者,这个问题让我很难受。
我尝试了while循环和for循环。那时,我有点困惑,不确定我的方法是否正确。
这是逻辑的具体示例。假设周期1的需求为10,周期2的需求为23,Q为12(此处Q表示最优数量)。我想弄清楚的是,我们是否应该在包含需求1 + 2的需求的期间1下订单,还是最好在期间1下订单1,在期间2下订单更好?时期1的需求接近Q或时期1 + 2的累积需求接近Q。在此示例中,| 10-12 | <|(10 + 23)-12 |,因此我们要记录期间1的订单,以及另一期间2的订单。
def feeoq(q, demand):
sum = 0
prod = []
for i in demand:
sum = sum + i
if abs(sum - q) < abs(sum + i - q):
return prod.append(sum)
else:
sum = sum + i
我没有收到错误消息,但是该函数未返回我期望的结果。
答案 0 :(得分:1)
您已重复sum = sum + i
行。在循环开始时一次,然后在else条件下。我想您应该删除第一条加法行并追加sum + i。
答案 1 :(得分:0)
也许我们可以将其作为讨论的基础:
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)))
说明:
基本上,此功能首先检查sum
是否大于q
。仅当是时,您才具有两个值,两个值都不小于或大于q。这是您进行测试的先决条件,两者中的一个到q
的距离更短。
现在,根据哪个更接近q
,该函数将返回sum
或sum - e
。
现在,在代码中使用 yield 时,我在这里使用动词 return :这不是通常的函数,而是generator。关于此类函数的主要线索是,当它们
简而言之:如果您想总结直到任何东西,IMO正是您所需要的,但是当到达任何时,您并不想停止……:)< / p>
答案 2 :(得分:0)
仅是我对问题的看法,如您的问题下方我的评论所述:
一种算法,该算法计算每个期间每个订单的固定数量所需的订单数量,从而始终满足需求。
此外,还考虑了每个订单的其余部分(在某个时期内未涵盖),因此最终可以用一个订单少一个订单来满足下一个时期的需求。
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