⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4block.txt

📁 2D single bin packing 问题的4Block算法
💻 TXT
字号:
// 做4-Block //
void BlockManager::Creat4_Block(const Volume& Vol,BlcGroup& rBlcGroup,Goods rGoods,int GoodsNum)
{
	bool bNull=true;
	int i=0,j=0,XL=Vol.m_iXL,YL=Vol.m_iYL,ZL=Vol.m_iZL,tGoodsNum=GoodsNum,
		MaxXNum=0,MaxYNum=0,MaxZNum=0,
		MaxNum=0,tMaxNum=0,MinXL=0,
		GoodsL,GoodsW,GoodsH,
		XNum[4],YNum[4],MXNum[4],MYNum[4];
	Block tBlock;
	BlcGroup tBlcGroup,endBlcGroup;
	tBlcGroup.m_pSGL=rBlcGroup.m_pSGL;

	for(j=0;j<6;j++)
	{
		if(rGoods.m_iRotate==1&&j!=0)
			break;
		if(rGoods.m_iRotate==0&&j!=0&&j!=2)
			continue;
		bNull=true;
		GoodsNum=tGoodsNum;
		rGoods.GetRotate(j,GoodsL,GoodsW,GoodsH);
		MaxXNum=XL/GoodsL;
		MaxYNum=YL/GoodsW;
		if(ZL/GoodsH>0)
		{
			if(m_iLoadType==0)
			{
				GoodsNum/=ZL/GoodsH;
				if(GoodsNum==0)
					continue;
			}
			MaxZNum=1;
		}
		else
		{
			MaxZNum=0;
			continue;
		}
			
		if(MaxXNum==0||MaxYNum==0||MaxZNum==0)
			continue;
			
		// 做4-Block //
		MinXL=1000000;
		{
			MaxNum=0;	
			{
				for(YNum[0]=MaxYNum;YNum[0]>=1;YNum[0]--)
				{
					// 货物个数对第1block x方向个数的限制 //
					MXNum[0]=int(GoodsNum/(MaxZNum*YNum[0]));
					// 空间x长度对第1block x方向个数的限制 //
					if(MXNum[0]>MaxXNum)
						MXNum[0]=MaxXNum;
					// 根据空间y长度和第1block y方向个数得到第2block y方向个数 //
					YNum[1]=int(YL-YNum[0]*GoodsW)/GoodsL;

					for(XNum[0]=MXNum[0];XNum[0]>=1;XNum[0]--)
					{
						// x,y须同时为0 //
						if(YNum[1]==0)
							MXNum[1]=0;
						else
						{
							// 货物个数对第2block x方向个数的限制 //
							MXNum[1]=int((GoodsNum-(XNum[0]*YNum[0])*MaxZNum)/(MaxZNum*YNum[1]));
							// 第2block x长度不得超过第1block(由于对称性,可以这样设定) //
							if(MXNum[1]*GoodsW>XNum[0]*GoodsL)
								MXNum[1]=(XNum[0]*GoodsL)/GoodsW;
						}
							
						for(XNum[1]=MXNum[1];XNum[1]>=0;XNum[1]--)
						{
							// x,y须同时为0 //
							if(YNum[1]>0&&XNum[1]==0)
								continue;
							// 货物个数对第3block x方向个数的限制 //
							MXNum[3]=int((GoodsNum-(XNum[0]*YNum[0]+XNum[1]*YNum[1])*MaxZNum)/MaxZNum);
							// 空间x长度和第2Block的长度对第3block x个数的限制 //
							if(MXNum[3]>(XL-XNum[0]*GoodsL)/GoodsW)
								MXNum[3]=(XL-XNum[0]*GoodsL)/GoodsW;
							for(XNum[3]=MXNum[3];XNum[3]>=0;XNum[3]--)
							{
								// 如果底面之和大于容器底面的90%,则X取最大者 //
								if(GoodsNum*GoodsL*GoodsL*10>=XL*YL*9&&XNum[3]<MXNum[3])
									break;
								if(XNum[3]==0)
									MYNum[3]=0;
								else
								{
									MYNum[3]=YL/GoodsL;
									// 货物个数对第3block y方向个数的限制 //
									if(MYNum[3]>int((GoodsNum-(XNum[0]*YNum[0]+XNum[1]*YNum[1])*MaxZNum)/(MaxZNum*XNum[3])))
										MYNum[3]=int((GoodsNum-(XNum[0]*YNum[0]+XNum[1]*YNum[1])*MaxZNum)/(MaxZNum*XNum[3]));
								}
								for(YNum[3]=0;YNum[3]<=MYNum[3];YNum[3]++)
								{
									// x,y须同时为0 //
									if(XNum[3]>0&&YNum[3]==0)
										continue;
									// 货物个数对第3block y方向个数的限制 //
									MYNum[2]=int((GoodsNum-(XNum[0]*YNum[0]+XNum[1]*YNum[1]+XNum[3]*YNum[3])*MaxZNum)/MaxZNum);
									// 空间y长度和第4Block的y长度对第3block y个数的限制 //
									if(MYNum[2]>(YL-YNum[3]*GoodsL)/GoodsW)
										MYNum[2]=(YL-YNum[3]*GoodsL)/GoodsW;
									for(YNum[2]=0;YNum[2]<=MYNum[2];YNum[2]++)
									{
										// x,y须同时为0 //
										if(YNum[2]==0)
											XNum[2]=0;
										else
										{
											// 货物个数对第3block x方向个数的限制 //
											XNum[2]=int((GoodsNum-(XNum[0]*YNum[0]+XNum[1]*YNum[1]+XNum[3]*YNum[3])*MaxZNum)/(MaxZNum*YNum[2]));
											// 空间x长度和第2Block的长度对第3block x个数的限制 //
											if(XNum[2]>(XL-XNum[1]*GoodsW)/GoodsL)
												XNum[2]=(XL-XNum[1]*GoodsW)/GoodsL;
										}
										//for(XNum[2]=0;XNum[2]<=MXNum[2];XNum[2]++)
										{
											// 防止1,3Block重叠 //
											if(XNum[0]*GoodsL+XNum[2]*GoodsL>XL&&YNum[2]*GoodsW>YNum[1]*GoodsL)
												break;
											if(YNum[0]*GoodsW+YNum[2]*GoodsW>YL&&XNum[2]*GoodsL>XNum[3]*GoodsW)
												break;
											// 摆放类型是"4-Block" //
											tBlcGroup.m_iBlockType=4;
											// 生成4-Block
											MakeBlcGroup(Vol,tBlcGroup,XNum,YNum,GoodsL,GoodsW,GoodsH,MaxZNum);
											// 作出的Block不合适 //
											if(tBlcGroup.bNoOK4_Block(Vol))
												continue;
											if(m_iLoadType==0)
											{
												tBlcGroup.SetZNum(ZL/GoodsH);
											}
											// 这个4block是否比前一个合适
											if(CompareBlcGroup_same(tBlcGroup,endBlcGroup))
											{
												endBlcGroup=tBlcGroup;
												bNull=false;
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		if(bNull)
			continue;
		if(CompareBlcGroup_same(endBlcGroup,rBlcGroup))
		{
			rBlcGroup=endBlcGroup;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -