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排料问题,很麻烦的.三维的要更难了乎清!
祝岁察前你好运!