A. C語言 動態規劃 完全裝箱問題
【問題】 裝箱問題
問題描述:裝箱問題可簡述如下:設有編號為0、1、…、n-1的n種物品,體積分別為v0、v1、…、vn-1。將這n種物品裝到容量都為V的若干箱子里。約定這n種物品的體積均不超過V,即對於0≤i<n,有0<vi≤V。不同的裝箱方案所需要的箱子數目可能不同。裝箱問題要求使裝盡這n種物品的箱子數要少。
若考察將n種物品的集合分劃成n個或小於n個物品的所有子集,最優解就可以找到。但所有可能劃分的總數太大。對適當大的n,找出所有可能的劃分要花費的時間是無法承受的。為此,對裝箱問題採用非常簡單的近似演算法,即貪婪法。該演算法依次將物品放到它第一個能放進去的箱子中,該演算法雖不能保證找到最優解,但還是能找到非常好的解。不失一般性,設n件物品的體積是按從大到小排好序的,即有v0≥v1≥…≥vn-1。如不滿足上述要求,只要先對這n件物品按它們的體積從大到小排序,然後按排序結果對物品重新編號即可。裝箱演算法簡單描述冊搭如下:
{ 輸入箱子的容積;
輸入物品種數n;
按體積從大到小順序,輸入各物品的體積;差喊
預置已用箱子鏈為空;
預置已用箱子計數器box_count為0;
for (i=0;i { 從已用的第一隻箱子開始順序尋找能放入物品i 的箱子j;
if (已用箱子都不能再放物品i)
{ 另用一個箱子,並將物品i放入該箱子;
box_count++;虛姿野
}
else
將物品i放入箱子j;
}
}
上述演算法能求出需要的箱子數box_count,並能求出各箱子所裝物品。下面的例子說明該演算法不一定能找到最優解,設有6種物品,它們的體積分別為:60、45、35、20、20和20單位體積,箱子的容積為100個單位體積。按上述演算法計算,需三隻箱子,各箱子所裝物品分別為:第一隻箱子裝物品1、3;第二隻箱子裝物品2、4、5;第三隻箱子裝物品6。而最優解為兩只箱子,分別裝物品1、4、5和2、3、6。
若每隻箱子所裝物品用鏈表來表示,鏈表首結點指針存於一個結構中,結構記錄尚剩餘的空間量和該箱子所裝物品鏈表的首指針。另將全部箱子的信息也構成鏈表。以下是按以上演算法編寫的程序。
【程序】
# include
# include
typedef struct ele
{ int vno;
struct ele *link;
} ELE;
typedef struct hnode
{ int remainder;
ELE *head;
Struct hnode *next;
} HNODE;
void main()
{ int n, i, box_count, box_volume, *a;
HNODE *box_h, *box_t, *j;
ELE *p, *q;
Printf(「輸入箱子容積\n」);
Scanf(「%d」,&box_volume);
Printf(「輸入物品種數\n」);
Scanf(「%d」,&n);
A=(int *)malloc(sizeof(int)*n);
Printf(「請按體積從大到小順序輸入各物品的體積:」);
For (i=0;i Box_h=box_t=NULL;
Box_count=0;
For (i=0;i { p=(ELE *)malloc(sizeof(ELE));
p->vno=i;
for (j=box_h;j!=NULL;j=j->next)
if (j->remainder>=a[i]) break;
if (j==NULL)
{ j=(HNODE *)malloc(sizeof(HNODE));
j->remainder=box_volume-a[i];
j->head=NULL;
if (box_h==NULL) box_h=box_t=j;
else box_t=boix_t->next=j;
j->next=NULL;
box_count++;
}
else j->remainder-=a[i];
for (q=j->next;q!=NULL&&q->link!=NULL;q=q->link);
if (q==NULL)
{ p->link=j->head;
j->head=p;
}
else
{ p->link=NULL;
q->link=p;
}
}
printf(「共使用了%d只箱子」,box_count);
printf(「各箱子裝物品情況如下:」);
for (j=box_h,i=1;j!=NULL;j=j->next,i++)
{ printf(「第%2d只箱子,還剩餘容積%4d,所裝物品有;\n」,I,j->remainder);
for (p=j->head;p!=NULL;p=p->link)
printf(「%4d」,p->vno+1);
printf(「\n」);
}
}
B. 急需集裝箱裝箱演算法計算公式和方法
1)集裝箱自重系數.即自重與載重之滲洞比,計算公式是:
集裝叢岩枯箱棗雹自重系數=集裝箱自重/集裝箱載重量
(2)集裝箱比容.指箱內容積與載重量之比,計算公式是:
集裝箱比容(m3/t)=集裝箱內部幾何容積/集裝箱載重量
(3)集裝箱的比面.指集裝箱底面積與載重量之比,計算公式是:
集裝箱比面(m2/t)=集裝箱底部面積/集裝箱載重量
返回
C. 集裝箱裝箱量計算
20尺集裝箱內徑:5.89x2.34x2.38(長寬高)
40尺集裝箱內徑:12,03x2.34x2.38
用包裝箱尺寸,去吻合集裝箱的長寬高,一定要小於集裝箱的長寬高。即可。
例:
高:1.140x2層=2.28m,小於集裝箱的高。
寬:1.080x2排=2.160m,小於集裝箱的寬。
長:0.5x11排=5.5m , 小於集裝箱的長。
長寬高都可以保證裝進去。
數量:2x2x11=44箱。
集裝箱計算單位,簡稱:TEU,是英文Twenty Equivalent Unit的縮寫, 又稱20英尺換算單位,是計算集裝箱箱數的換算單位。也稱國際標准箱單位。通常用來表示船舶裝載集裝箱的能力,也是集裝箱和港口吞吐量的重要統計、換算單位。
各國大部分集裝箱運輸,都採用20英尺和40英尺長的兩種集裝箱。為使集裝箱箱數計算統一化,把20英尺集裝箱作為一個計算單位,40尺集裝箱作為兩個計算單位,以利統一計算集裝箱的營運量。
在統計集裝箱數量時有的一個術語:自然箱,也稱"實物箱"。自然箱是不進行換算的實物箱,即不論是40英尺集裝箱,30英尺集裝箱,20英尺集裝箱或10英尺集裝箱均作為一個集裝箱統計。
(3)港口裝箱近似演算法擴展閱讀:
集裝箱內部的最大長、寬、高尺寸。高度為箱底板面至箱頂板最下面的距離,寬度為兩內側襯板之間的距離,長度為箱門內側板量至端壁內襯板之間的距離。它決定集裝箱內容積和箱內貨物的最大尺寸。
國際上通常使用的干貨櫃(DRYCONTAINER)有:
1.外尺寸為20x8x8英尺6英寸,簡稱20尺貨櫃(內徑:5898*2352*2390mm);
2.40x8x8英尺6英寸,簡稱40尺貨櫃(內徑:12024*2352*2390mm);
及較多使用的40x8x9英尺6英寸,簡稱40尺高櫃。
為11.8x2.34x2.68米.配貨毛重一般為26噸,體積為68立方米。
45尺高櫃:內容積為:13.58x2.34x2.68米,配貨毛重一般為29噸,體積為86立方米。
20尺開頂櫃:內容積為5.89x2.32x2.31米,配貨毛重20噸,體積31.5立方米。
40尺開頂櫃:內容積為12.01x2.33x2.15米,配貨毛重30.4噸,體積65立方米。
20尺平底貨櫃:內容積5.85x2.23x2.15米,配貨毛重23噸,體積28立方米。
40尺平底貨櫃:內容積12.05x2.12x1.96米,配貨毛重36噸,體積50立方米。
D. C++實現裝箱問題的FFD近似解和近似比
體積1.5是錯的吧,沒辦法裝箱啊
E. 港口貨物吞吐量怎麼計算
港口吞吐量的計算方法
(1)貨物吞吐量以實際必須裝卸全部船舶貨物為依據,在辦理交接手續後統一結算;
(2)由水路到達港口,經裝卸又從水路駛離的轉口貨物,分別按進港和出港各計算一次吞吐量;
(3)牲畜、家禽無法預估實際重量的貨物,按系數進行換算;
(4)由水路運進港口卸貨,計算一次進港吞吐量;自本港裝船運出港口的貨物,計算一次出港吞吐量。
【拓展】
哪些情況不屬於吞吐量:
(1)在港口內裝船,凱蠢運至區域以外倒入海中的廢棄物,不納入
(2)港口范圍內的輪渡、短途運輸,以及為運輸船舶裝卸服務和各碼頭之間的駁運量,不納入
(3)同孝御一船舶裝運進港,未經裝卸直接出港的貨物(包括原駁船換拖),不納入
(4)港口進行疏浚,運出港外的廢棄泥沙,不納入
(5)由同一船舶卸下,又裝上同一船舶運出港口的同一批貨物,或裝船未運出,又卸回本港的貨物,不納入
影響港口集裝箱吞吐量的因素
(1)世界經濟
(2)港口外部環境
(3)碼頭供求關系
(4)港口自身條件
擴大港口集裝箱吞吐量的方法
(1)港口取消不合理收費,降低價格
(2)改進集裝箱操作,提升服務質量
(3)加強與船舶公司的合作,達到「雙贏」
(4)加大重視力度,改善港口外部環境
(5)靈活運用港口價格是關鍵
集裝箱裝箱量的計算
20尺集裝箱內徑:5.89x2.34x2.38(長寬高)
40尺集裝箱內徑:12,03x2.34x2.38
用包裝箱尺寸,去吻合集裝箱的長寬高,一定要小於集裝箱的長寬高。即可。
例:
高:1.140x2層=2.28m,小於集裝箱的高。
寬:1.080x2排=2.160m,小於集裝箱的寬。
長:0.5x11排=5.5m , 小於集裝箱的長。
長寬高都可以保證裝進去。
數量:2x2x11=44箱。
集裝箱計算單位,簡稱:TEU,是英文Twenty Equivalent Unit的巧孫岩縮寫, 又稱20英尺換算單位,是計算集裝箱箱數的換算單位。也稱國際標准箱單位。通常用來表示船舶裝載集裝箱的能力,也是集裝箱和港口吞吐量的重要統計、換算單位。
各國大部分集裝箱運輸,都採用20英尺和40英尺長的兩種集裝箱。為使集裝箱箱數計算統一化,把20英尺集裝箱作為一個計算單位,40尺集裝箱作為兩個計算單位,以利統一計算集裝箱的營運量。
在統計集裝箱數量時有的一個術語:自然箱,也稱實物箱"。自然箱是不進行換算的實物箱,即不論是40英尺集裝箱,30英尺集裝箱,20英尺集裝箱或10英尺集裝箱均作為一個集裝箱統計。"
F. 求程序:裝箱問題的近似演算法--NF ( Next Fit ) 演算法。謝謝幫助!
看看這個思路怎麼樣,好像代碼略多。
import java.util.Random;
import java.util.Scanner;
public class FillBox {
private Scanner scann;
private int objNum;
private int boxNum;
private int boxLength;
private Goods[] mGoods;
private Random random;
private Box[] mBox;
public FillBox(){
scann=new Scanner(System.in);
random=new Random();
objNum=getArgsFormConsol("請輸入物品個數objNum:");
boxNum=getArgsFormConsol("請輸箱子個數boxNum:");
boxLength=getArgsFormConsol("請輸箱子長度(單位CM)boxLength:");
//設置物品數組
setGoodsArray(objNum,boxLength);
//設置箱子數組
setBoxAry(boxNum,boxLength);
//開始裝箱子
doFillBox();
//物品的大小情況
showGoodsMessage();
//顯示裝箱情況
showBoxUse();
}
public static void main(String[] args){
new FillBox();
}
public int getArgsFormConsol(String pIntroction){
System.out.print(pIntroction);
int result=scann.nextInt();
System.out.println("***************\n");
return result;
}
public void setGoodsArray(int pNum,int pSize){
mGoods=new Goods[pNum];
for(int i=0;i<pNum;i++){
int goodSize=pSize/4+random.nextInt(pSize/3);
Goods goods=new Goods(i,goodSize);
mGoods[i]=goods;
}
}
public void setBoxAry(int pTolNum,int pSize){
mBox=new Box[pTolNum];
for(int i=0;i<pTolNum;i++){
Box aBox=new Box(i,pSize);
mBox[i]=aBox;
}
}
public void doFillBox(){//明跡族開支裝箱子
int aBoxSpaceValue=boxLength;
int currentBoxId=0;
for(int i=0;i<mGoods.length;i++){
if(currentBoxId>=boxNum){
System.out.println("已經沒有足夠的可用的箱子了!"激弊);
break;
}
Goods aGod=mGoods[i];
if(mGoods[i].getGoodsLength()<=aBoxSpaceValue){
//裝進這個箱子
mBox[currentBoxId].addGoods(aGod.getGoodsNum());
aBoxSpaceValue-=mGoods[i].getGoodsLength();
}else{
mBox[currentBoxId].setSpaceValue(aBoxSpaceValue);
aBoxSpaceValue=boxLength;//可用長度變長boxLength
currentBoxId++;
i--;//這個州消貨物裝不下了,換下一個箱子
}
}
}
public void showBoxUse(){
System.out.println("=====================\n下面是裝箱詳細情況:\n====================");
for(int i=0;i<boxNum;i++){
System.out.println("\n"+mBox[i].getShow()+"\n* * * * * * * * * * * * * * *");
}
}
public void showGoodsMessage(){
for(int i=0;i<objNum;i++){
System.out.println("boxID:"+mGoods[i].getGoodsNum()+", box長度:"+mGoods[i].getGoodsLength());
}
}
}
public class Goods {
private int goodsNum;
private int goodsLength;
public Goods(){
}
public Goods(int pNum,int pLength){
this.goodsNum=pNum;
this.goodsLength=pLength;
}
public int getGoodsNum() {
return goodsNum;
}
public void setGoodsNum(int goodsNum) {
this.goodsNum = goodsNum;
}
public int getGoodsLength() {
return goodsLength;
}
public void setGoodsLength(int goodsLength) {
this.goodsLength = goodsLength;
}
}
import java.util.Vector;
public class Box {
private int boxNum;
private int boxLength;
private Vector<Integer> containGoodsID;
private int spaceValue;
public Box(){
}
public Box(int pNum,int pLength){
this.boxNum=pNum;
this.boxLength=pLength;
containGoodsID=new Vector<Integer>();
spaceValue=boxLength;
}
public int getBoxNum() {
return boxNum;
}
public void setBoxNum(int boxNum) {
this.boxNum = boxNum;
}
public int getBoxLength() {
return boxLength;
}
public void setBoxLength(int boxLength) {
this.boxLength = boxLength;
}
public void addGoods(Integer pGoodsID){
containGoodsID.add(pGoodsID);
}
public void removieGoods(Integer pGoodsID){
containGoodsID.removeElement(pGoodsID);
}
public int getSpaceValue() {
return spaceValue;
}
public void setSpaceValue(int spaceValue) {
this.spaceValue = spaceValue;
}
public String getShow(){
StringBuffer sb=new StringBuffer("箱子編號:"+this.boxNum+" 長度:"+this.boxLength+" 可用空間:"+spaceValue+"\n本箱子裝的貨物編號:");
for(int i=0;i<containGoodsID.size();i++){
sb.append(containGoodsID.get(i)+", ");
}
return sb.toString();
}
}
可能修飾性的代碼比較多,關鍵邏輯就看doFill()了
G. 集裝箱海運費計算方式
1、拼箱費用的計算
LCL運費計算只要採用「W/M」方式,W表示重量噸,按商品的毛重1000kg=1重量噸;M表示尺碼噸,1立方米=1尺碼噸。「W/M」方式即在重量噸和尺納敏碼噸里二者選其大計費。
2、整箱運費的計算
整箱貨物運費計算,一種是和拼箱一樣,按照實際重量計算,另一種就是按照集裝箱的類型按耐衫箱計算運費。在整箱托運集昌茄腔裝箱並且集裝箱為船公司所有時,承運人計算海運費有「集裝箱最低利用率」和「集裝箱最高利用率」的規定。
H. 集裝箱最優裝櫃計算方法
20尺集裝箱內徑:5.89x2.34x2.38(長寬高)
40尺集裝箱內徑:12,03x2.34x2.38
用你的包裝箱尺寸,去吻合集裝箱的長寬高,一定要小於集裝箱的長寬高。即可。
例:
高:1.140x2層=2.28m,小於集裝箱的高。
寬:1.080x2排=2.160m,小於集裝箱的寬。
長:0.5x11排=5.5m
,
小於集裝箱的長。
長寬高都可以保證裝進去。
數量:2x2x11=44箱。
提示:40尺集裝箱長12.03m,理論裝24排,但是實際上在長度方向,一定會漲箱,保證裝不進去。(這是實際經驗),只能按照23排計算。
40尺可裝數量:2x2x23=92箱。
祝你好運!
I. 怎樣計算集裝箱的裝櫃量20GP,40HQ
20尺開頂櫃:內容積為5.89x2.32x2.31米,配貨毛重20噸,體積31.5立慶前讓方米。
40尺開頂櫃:內容積為12.01x2.33x2.15米,配貨毛重30.4噸,體積65立方米。
20尺平底貨櫃:內容積5.85x2.23x2.15米,配貨毛重23噸,體積28立方米。
40尺平底貨櫃:內容積12.05x2.12x1.96米,配貨毛重36噸,體積50立方米。
國際上通常使用的干貨櫃(DRYCONTAINER)有:
1、外尺寸為20x8x8英尺6英寸,簡稱20尺貨櫃(內徑:5898*2352*2390mm);
2、40x8x8英尺6英寸,簡稱40尺貨櫃(內徑:12024*2352*2390mm);
及較多使用的40x8x9英尺6英寸,簡稱40尺高櫃。
為11.8x2.34x2.68米.配貨毛重一般為26噸,體積為68立方米。
計算單位
集裝箱計算單位,簡稱:TEU,是英文Twenty Equivalent Unit的縮寫, 又稱20英尺換算單位,是計算集裝箱箱數的換算單位。也稱國際標准箱單位。通常用來表示船舶裝載集裝箱的能力,也是集裝箱和港口吞吐量的重要統計、換算單位。
各國大部分集裝箱運輸,都採用20英尺和40英尺長的兩種集裝箱。為使集裝箱箱數計算統一化,把20英尺集裝箱作為一個計算單位,40尺集裝箱作為兩個計算單位,以利統一計算集裝箱的營運量。
在統計集裝箱數量時有的一個術語:自然箱,也稱"實物箱"。自然箱是不進行換算的實物箱,即不論是40英尺集裝箱,30英尺集裝箱,20英尺集裝箱或10英尺集裝箱均作為一個集裝箱統計。
(9)港口裝箱近似演算法擴展閱讀
標准箱號構成基本概念:採用ISO6346(1995)標准。
標准集裝箱箱號由11位編碼組成,包括三個部分:
1、 第一部分由4位英文字母組成。前三位代碼 (Owner Code) 主要說明箱主譽局、經營人,第四位代碼說明集裝箱的類型。列如CBHU 開頭的標准集悔雹裝箱是表明箱主和經營人為中遠集運。
2、 第二部分由6位數字組成。是箱體注冊碼(Registration Code),用於一個集裝箱箱體持有的唯一標識。
3、 第三部分為校驗碼(Check Digit)由前4位字母和6位數字經過校驗規則運算得到,用於識別在校驗時是否發生錯誤。即第11位數字。
根據校驗規則箱號的每個字母和數字都有一個運算的對應值。箱號的前10位字母和數字的對應值從0到Z對應數值為10到38,11、22、33不能對11取模數,所以要除去
第N位的箱號對應值再分別乘以2的N-1次方 (N=1,2,3………..10)
例如:箱號為CBHU3202732的集裝箱它的第1位代碼為C,
它的代碼值=代碼的對應值×2的0次方 =13×1=13。
類推第2位代碼為B
它的代碼值=代碼的對應值×2的1次方 =12×2=24
以此類推得到箱號前10位代碼的代碼值。
將前10位的代碼值乘積累加後對11取模
箱號為CBHU3202732的集裝箱前10位箱號的代碼累加值=4061,取11的模後為2,就是這個箱號第11位的識別碼的數值。
參考資料來源:網路-集裝箱號
參考資料來源:網路-集裝箱
J. 裝箱問題的BFD演算法
NP不完全問題只給0分是沒人做的,給200分做恐沒賣怕都很難呀.
我做過二維的NP排料問題,很麻煩的.三維的要更難了乎清!
祝歲察前你好運!