11、装箱小程序(包裹系数计算)

 

输入格式如下,以csv存储:

sku_id长s宽s高s重量箱子长s箱子宽s箱子高s
21958092705834130140012001810

 

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值