2007 年 3 月謎題解答

加入我們的科學愛好者社群!

這個過程的計算“內迴圈”是計算平均成本。也就是說,給定一組四個資料包大小,計算每個訂單所需的平均資料包數量。一種稱為動態程式設計的技術非常適合此目的。看看你是否能理解它是如何工作的。

以下是一種動態程式設計方法的高階虛擬碼。

目標:給定四個大小 1、s1、s2、s3,求每個訂單的成本。


關於支援科學新聞

如果您喜歡這篇文章,請考慮透過以下方式支援我們屢獲殊榮的新聞報道 訂閱。透過購買訂閱,您正在幫助確保有關塑造當今世界的發現和想法的具有影響力的故事的未來。


建立一個大小為 80 的陣列。(這將是您的成本陣列。)將每個條目初始化為具有無限成本,除了位置 1、s1、s2 和 s3 的條目,您將它們的成本賦值為 1。

 對於條目 i = 2 到 80
    如果 cost(i) == 無窮大
      對於條目 j 從 1 到 i-1
        如果 (cost(j) + cost(i-j)) < cost(i)
          cost(i) := (cost(j) + cost(i-j))
        結束 如果
      結束 對於
    結束 如果
 結束 對於
將所有成本求和併除以 80 以獲得平均成本

讓我們用文字看看發生了什麼:假設您正在測試資料包大小 1、5、10 和 14。最初,cost(1) = 1,cost(5) = 1,cost(10) = 1,cost(14) = 1。所有其他成本都是無限的。現在從 i = 2 開始。此時,cost(2) = 無窮大,因此語句“如果 cost(i) == 無窮大”為真。然後我們檢視 j 從 1 到 2 – 1。這隻剩下 j = 1,我們測試 cost(2) 是否大於 cost(1) + cost(2-1) = cost(1) + cost(1) = 1 + 1 = 2。因為 cost(2) 目前是無窮大,所以該測試成功。因此 cost(2) 的值為 2(這就是當 i 為 2 且 j 為 1 時“cost(i) := (cost(j) + cost(i-j))”的含義),這是兩個單單元資料包的成本。看看您是否可以繼續這種模式。

既然您知道如何評估給定的候選資料包大小集,那麼剩下的就是遍歷不同的資料包大小三元組可能性,以找到最佳的資料包大小集。

1. 當 1 到 80 之間的所有數量的可能性相等時,一個好的資料包大小集是:1 5 18 25,每個請求的平均成本低於 3.7 個數據包。

2. 相同的動態程式設計方法也適用於此問題,但成本函式必須有所改變,以反映不同大小訂單的可能性變化。一種方法是將 10 到 20 之間的訂單(包括 10 和 20)的成本乘以 4。這將反映這些訂單頻率的增加。要獲得最佳平均值,請將總成本除以 113(80 + (3*11))。否則,過程不會發生任何變化。一個好的資料包大小集(實際上是最好的之一)是 1、10、13 和 17。平均所需的資料包數量低於 3.5。你能找到其他的嗎?

© .