近似裝箱問題

2021-10-07 14:54:07 字數 2137 閱讀 9301

設給定n項物品, 大小為s1, s2, s3, …, sn, 每個物品的都不超過1; 現有大小為1的箱子若干個, 將物品裝入箱子中, 盡量使用少的箱子裝滿所有物品;

例項:現有一列物品:0.2, 0.5, 0.4, 0.7, 0.1, 0.3, 0.8;其中一種裝箱方案如下所示:

裝箱問題是乙個np完全問題, np完全問題的最優解的時間複雜度不能是乙個二項式的(通常np問題的時間複雜度是指數型的);因此, 當獲知這是乙個np完全問題, 就要考慮不糾結於求解其最優解,通常求解器近似解,並且近似解的時間複雜度很小;

1) 聯機演算法

聯機演算法相當於輸入資料不是一次性傳遞到演算法的,每來乙個資料, 演算法就要處理這個資料;演算法對已經處理過的資料並不能修改, 演算法對未來的資料也無法**;

2) 離線演算法

離線演算法的輸入資料通常是一組事先已知的資料, 演算法可以對資料進行預先處理,例如排序。之後在進行裝箱演算法。一般離線演算法能夠得到更優的解;

1) 下項適配(next fit)

當處理乙個物品的時候, 檢查當前箱子容量是否足夠;如果足夠, 就將物品放入當前箱子, 如果不足, 就重新開闢乙個新的箱子;

下項適配的**如下:

#include

#include

#define n 7

float item=

;float box[n]=;

int flags[n]=;

void

binningnextfit()

else}}

intmain()

下項適配的結果是:

2) 首次適配(first fit)

每次考慮將乙個物品放入箱子中的時候,都從第乙個箱子開始嘗試放入物品;當所有的已開啟的箱子的容量都不滿足的時候, 重新開闢乙個新的箱子;

首次適配的**如下:

#include

#include

#define n 7

float item=

;float box[n]=;

int flags[n]=;

void

binningfirst()

}}}int

main()

首次適配的情況如下:

3) 最佳適配(best fit)

每次考慮將乙個物品放入箱子的時候, 都考慮所有能夠容納物品的箱子中, 選取剩餘容量最小的那個箱子;

最佳適配演算法的**如下:

#include

#include

#define n 7

float item=

;float box[n]=;

int flags[n]=;

//資料的型別要設定對, 索引設定為int, 資料型別設定為float

void

binningfirst()

} box[index]

-= item[i]

; flags[i]

= index +1;

}}intmain()

最佳適配的裝箱情況如下:

採用下項適配, 需要5個箱子;

採用首次適配和最佳適配, 需要4個箱子;

而實際上最優解只需要3個箱子;

中上所述, 使用上述三個演算法求得的裝箱問題只能得出近似最優解;

裝箱問題近似演算法概述

問題描述 一維經典裝箱問題可描述如下 s s1,s2,sn 其中0 si 1,稱之為第i個物體的體積 或重量 1 i n,現有n個容積 或載重量 為1 的箱子,要求如何設法將s1,s2,sn放入盡可能少的箱中。裝箱問題是np問題,即在多項式時間內無法精確求解,一般採用近似演算法,即啟發式演算法,這樣...

關於近似裝箱問題的思考。

有這樣乙個需求,需要對一組元素進行打包 裝箱 箱子的容積一定,但是至少可以裝入一件物品,即使物品的體積大於箱子,求用最少的箱子裝載。該問題類似裝箱。在對物體發貨時候,可以達到最少的包裹數,挺有實際意義,藉此研究一下裝箱問題。下面 是對與該問題的實現。由於是記錄作用,文筆較為粗糙,後續修正加以詳細說明...

問題A 裝箱問題

思路 思路 根據演算法筆記上01揹包問題的一維形式改編,就僅僅是把每件物品的價值改為1,再未做其他修改,後來發現不行 const int maxn 1001 int dp maxn int w maxn int main for int i 0 i參照別人的答案,進行的思考 首先,狀態轉移方程 dp...