3 回答

TA貢獻1719條經驗 獲得超6個贊
只是我對問題的看法,正如我在您的問題下方的評論中所述:
一種算法,它計算每個期間每個訂單所需的固定數量訂單數量,以便始終滿足需求。
另外,每個訂單的其余部分,在某個時期沒有被覆蓋,因此最終可以少一個訂單來覆蓋下一個時期的需求。
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

TA貢獻1812條經驗 獲得超5個贊
也許我們可以討論這個作為討論的基礎:
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正是您所需要的...... :)
添加回答
舉報