输入格式如下,以csv存储:
sku_id | 长s | 宽s | 高s | 重量 | 箱子长s | 箱子宽s | 箱子高s |
2195809 | 270 | 58 | 34 | 130 | 1400 | 1200 | 1810 |
python代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Dec 20 17:19:04 2017
@author: zhangchaoyu
"""
import re
import copy
import os
def num_f(f):
flines = -1
for i in f:
flines = flines + 1
return flines
def read_csv(f,num_f):
data = []
#标题不读
f.readline()
for i in range(num_f):
row = f.readline()
row = re.split(',', row)
for k in range(1,len(row)):
row[k] = int(float(row[k]))
data.append(row)
return data
def isNaN(num):
return num != num
#二维装箱
def sub_boxpacking(CL,CW,CH,l,w,h):
#简单码放模式作为下界
n1 = (CL//l)*(CW//w) + (CL%l//w)*(CW//l)
n2 = (CW//l)*(CL//w) + (CW%l//w)*(CL//l)
n = max(n1,n2)
if(CL*CW/l/w >= n+1 and CW > l+w):
up1 = int(CL//l)
up2 = int(CL//w)
up3 = int(CW//l)
up4 = int(CW//w)
for x1 in range(1,up1+1):
x2 = (CL-x1*l)//w
for y1 in range(1,up4+1):
y4 = (CW-y1*w)//l
for y2 in range(1,up3+1):
y3 = (CW-y2*l)//w
for x3 in range(1,up1+1):
x4 = (CL-x3*l)//w
if (y1*w <= y2*l and x2*w <= x3*l and y3*w <= y4*l and x4*w <= x1*l):
if((y1+y3)*w>CW or (x2+x4)*w>CL):
continue
n3 = x1*y1+x2*y2+x3*y3+x4*y4
#if(n3>n):
#print([x1,y1,x2,y2,x3,y3,x4,y4])
n = max(n3,n)
if (y1*w >= y2*l and x2*w >= x3*l and y3*w >= y4*l and x4*w >= x1*l):
if((x1+x3)*l>CL or (y2+y4)*l>CW):
continue
n3 = x1*y1+x2*y2+x3*y3+x4*y4
#if(n3>n):
#print([x1,y1,x2,y2,x3,y3,x4,y4])
n = max(n3,n)
return n
def boxpacking(data):
#码盘件数、#码垛层数、每层件数、利用率
num = []
num_levels = []
num_eachlevel = []
fl = []
flag = 1;
for sku in data:
print("正在计算第",flag,"个,总共",len(data),"个,占比",flag*10000//len(data)/100,"%")
flag += 1
e1,e2,e3 = sku[1],sku[2],sku[3]
if e1<=10 or e2<=10 or e3<=10 or isNaN(e1) or isNaN(e2) or isNaN(e3):
num.append(-1)
num_levels.append(-1)
num_eachlevel.append(-1)
fl.append(-1)
continue
CL = sku[5]
CW = sku[6]
CH = sku[7]
n1 = sub_boxpacking(CL,CW,CH,e1,e2,e3)
n2 = sub_boxpacking(CL,CW,CH,e2,e3,e1)
n3 = sub_boxpacking(CL,CW,CH,e3,e1,e2)
n_el = n1
n_l = CH//e3
if(n_el*n_l<n2*(CH//e1)):
n_el = n2
n_l = CH//e1
if(n_el*n_l<n3*(CH//e2)):
n_el = n3
n_l = CH//e2
num.append(n_el*n_l)
num_levels.append(n_l)
fl.append(n_el*n_l*e1*e2*e3/CL/CW/CH)
if n_l == 0:
num_eachlevel.append(0)
else:
num_eachlevel.append(n_el)
return [num,num_levels,num_eachlevel,fl]
def outPut(data,result):
output = copy.deepcopy(data)
for i in range(len(output)):
output[i] += [result[0][i],result[1][i],result[2][i],result[3][i]]
if os.path.exists("码盘结果汇总.csv"):
os.remove("码盘结果汇总.csv")
f1 = open("码盘结果汇总.csv","a")
f1.write('sku_id,长s,宽s,高s,重量,箱子长s,箱子宽s,箱子高s,码盘件数,码垛层数,每层件数,体积利用率\n')
for i in range(len(output)):
for j in range(len(output[i])):
f1.write(str(output[i][j]))
f1.write(',')
f1.write('\n')
f1.close()
if __name__ == '__main__':
print("文件录入")
num_f = num_f(open(r'输入格式.csv'))
data = read_csv(open(r'输入格式.csv'),num_f)
print("文件录入完成,开始计算")
result = boxpacking(data)
print("计算完成,输出文件")
outPut(data,result)