十二、机器学习算法整合(knn、朴素贝叶斯、决策树、随机森林、线性回归、岭回归、逻辑回归、聚类、支持向量机)

一、需要导入的库:

'''
作者:小宇
最后完成日期:2021.2.28
包含内容:knn、朴素贝叶斯、决策树、随机森林、线性回归、岭回归、逻辑回归、聚类、支持向量机
'''
from sklearn.datasets import load_breast_cancer,load_iris,load_boston,load_digits  #导入数据
from sklearn.naive_bayes import GaussianNB,MultinomialNB    #朴素贝叶斯
from sklearn.model_selection import train_test_split        #数据集划分
from sklearn.neighbors import KNeighborsClassifier          #Knn
from sklearn.tree import DecisionTreeClassifier,export_graphviz  #决策树
from sklearn.ensemble import RandomForestClassifier        #随机森林
from sklearn.linear_model import LinearRegression          #正则方程优化的线性回归
from sklearn.linear_model import Ridge                      #岭回归
from sklearn.linear_model import SGDRegressor
from sklearn.linear_model import LogisticRegression
from sklearn.cluster import KMeans
from sklearn.svm import SVC
from sklearn.feature_extraction import DictVectorizer       #特征抽取
from sklearn.model_selection import GridSearchCV            #网页搜索
from sklearn.metrics import accuracy_score              #准确率
from sklearn.metrics import classification_report
from sklearn.metrics import mean_squared_error
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import random

二、k近邻:

def knn_algorithm():
    '''
    knn:根据邻居进行分类,常用欧式距离,还有曼哈顿等距离计算公式
    优点:简单,易于理解和实现,无需训练
    缺点:懒惰算法,计算量大,内存开销大,必须指定K值,
         k值取小:受异常点影响
         k值取大:受样本均衡影响
    使用场景:小数据场景,几千~几万样本
    API:sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
         n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
         algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:
    '''
    iris = load_iris()
    x = iris.data
    y = iris.target
    x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=30,train_size =0.8)
    knn = KNeighborsClassifier(n_neighbors=2,algorithm='auto')
    knn.fit(x_train,y_train)
    predictions = knn.predict(x_test)
    print(predictions)
    print(accuracy_score(y_test,predictions))
    return None

三、朴素贝叶斯:

1、贝叶斯公式:
在这里插入图片描述
2、拉普拉斯平滑系数(防止计算出的概率为0的情况):
在这里插入图片描述

def pbaye_algorithm():
    '''
    朴素贝叶斯:假定事件之间相互独立,使用贝叶斯公式对样本进行计算,常用拉普拉斯平滑系数消除由于数据集有限导致概率为0的情况;
    优点:1)有有稳定的分类效率;2)对缺失数据不太敏感,算法简单;3)分类准确度高,速度快
    缺点:特征属性有关联时其效果不好
    应用:常用语文本分类等
    API:sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
         alpha:拉普拉斯平滑系数
    '''
    datal = load_breast_cancer()
    x_train,x_test,y_train,y_test = train_test_split(datal['data'],datal['target'],random_state = 20,train_size = 0.8)
    pbaye = MultinomialNB()
    pbaye.fit(x_train,y_train)
    pred = pbaye.predict(x_test)
    print(accuracy_score(y_test,pred))
    print(confusion_matrix(y_test,pred))
    print(classification_report(y_test,pred))
    return None

四、决策树

1、信息熵:
底数根据实际情况来取,此处取2

2、信息增益:
在这里插入图片描述
3、信息熵的计算:
在这里插入图片描述
4、条件熵的计算:
在这里插入图片描述

def decisionc():
    '''
    决策树:1)信息熵:衡量不确定性的大小;2)条件熵H(D|A),条件A下的信息熵;3)信息增益:不确定性减少的程度
    优点:简单,树木可视化;
    缺点:数过于复杂时,过拟合。
    改进:1)减枝cart算法;
         2)随机森林
    应用:个人信用评估等
    API:class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
        决策树分类器
        criterion:默认’gini’系数,可选择信息增益的熵’entropy’
        max_depth:树的深度大小
        random_state:随机数种子
        max_depth:树的深度大小
    '''
    iris = datasets.load_iris()
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=20,train_size=0.8)
    cls = DecisionTreeClassifier(criterion='entropy')
    cls.fit(x_train,y_train)
    pred = cls.predict(x_test)
    print(accuracy_score(y_test,pred))
    print(confusion_matrix(y_test,pred))
    print(classification_report(y_test,pred))
    #产生决策树,将得到的文本复制至:http://webgraphviz.com/可得到树
    data_l = export_graphviz(cls,out_file='tree.dot',feature_names=iris.feature_names)
    return None

五、随机森林:

def random_forest():
    '''
    随机森林:随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
    优点:1)具有极好的准确率;2)能够有效地运行在大数据集上;3)处理具有高维特征的输入样本,无需要降维就能够评估各个特征在分类问题上的重要性。
    API:class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
        随机森林分类器
        n_estimators:integer,optional(default = 10)森林里的树木数量120,200,300,500,800,1200
        criteria:string,可选(default =“gini”)分割特征的测量方法
        max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30
        max_features="auto”,每个决策树的最大特征数量
            If "auto", then max_features=sqrt(n_features).
            If "sqrt", then max_features=sqrt(n_features) (same as "auto").
            If "log2", then max_features=log2(n_features).
            If None, then max_features=n_features.
        bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
        min_samples_split:节点划分最少样本数
        min_samples_leaf:叶子节点的最小样本数
    '''
    titan = pd.read_csv('titanic.csv')
    x = titan[['pclass', 'age', 'sex']]
    y = titan['survived']
    #print(x['age'])
    x['age'].fillna(x['age'].mean(), inplace=True)
    #print(x['age'])
    dict = DictVectorizer(sparse=False)
    #转化成字典并进行特征抽取
    x = dict.fit_transform(x.to_dict(orient="records"))
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
    rs = RandomForestClassifier()
    #下面使用网格搜索
    param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
    rs = GridSearchCV(rs, param_grid=param, cv=3)
    rs.fit(x_train, y_train)
    pred = rs.predict(x_test)
    print(accuracy_score(y_test,pred))
    return None

六、线性回归:

def line_regression():
    '''
    线性回归:一个自变量称为单变量回归,多个自变量称为多元回归。找到最小损失,优化方法有正规方程和梯度下降两种方式
    API1(正规方程):sklearn.linear_model.LinearRegression(fit_intercept=True)此为通过正规方程优化
            fit_intercept:是否计算偏置
            LinearRegression.coef_:回归系数
            LinearRegression.intercept_:偏置
    API2(梯度下降):sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
            SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型。
            loss:损失类型
            loss=”squared_loss”: 普通最小二乘法
            fit_intercept:是否计算偏置
            learning_rate : string, optional
            学习率填充
            'constant': eta = eta0
            'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
            'invscaling': eta = eta0 / pow(t, power_t)
            power_t=0.25:存在父类当中
            对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率。
            SGDRegressor.coef_:回归系数
            SGDRegressor.intercept_:偏置
    '''
    data = load_boston()
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=24)
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))
    # 梯度下降进行预测
    lin = SGDRegressor()
    lin.fit(x_train, y_train)
    pre = lin.predict(x_test)
    print("权重:", lin.coef_)
    print("偏执:", lin.intercept_)
    print("预测结果:",pre)
    a = [x for x in range(len(pre))]
    plt.plot(a,pre,color = 'red')
    plt.plot(a,y_test,color = 'yellow')
    plt.show()

七、岭回归

def lin_regression():
    '''
    岭回归:一种线性回归,在回归时加上正则化限制,解决过拟合现象。有L1和L2两种正则化方法,常用L2方法。正则化力度越大,权重系数越小,正则化力度越小,权重系数越大;
    L2正则化API:sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
                具有l2正则化的线性回归
                alpha:正则化力度,也叫λ,λ取值:0~1 1~10
                solver:会根据数据自动选择优化方法
                sag:如果数据集、特征都比较大,选择该随机梯度下降优化
                normalize:数据是否进行标准化
                normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
                Ridge.coef_:回归权重
                Ridge.intercept_:回归偏置
    '''
    data = load_boston()
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=24)
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))
    rd = Ridge(alpha=1.0)
    rd.fit(x_train, y_train)
    print("岭回归的权重参数为:", rd.coef_)
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    print("岭回归的预测的结果为:", y_rd_predict)
    print("岭回归的均方误差为:", mean_squared_error(y_test, y_rd_predict))

八、逻辑回归

def logic_regression():
    '''
    逻辑回归:逻辑回归时解决二分类问题的利器,其输入为一个线性回归的结果。
    API:sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
        solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
        sag:根据数据集自动选择,随机平均梯度下降
        penalty:正则化的种类
        C:正则化力度
    分类评估API:sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
                y_true:真实目标值
                y_pred:估计器预测目标值
                labels:指定类别对应的数字
                target_names:目标类别名称
                return:每个类别精确率与召回率
    相关概念:精准率:召回率:准确率:
    应用:广告点击率;是否为垃圾邮件;是否患病;金融诈骗;虚假账号
    '''
    data = load_breast_cancer()
    x_train,x_test,y_train,y_test = train_test_split(data.data,data.target,random_state=30,train_size=0.8)
    lg = LogisticRegression()
    lg.fit(x_train,y_train)
    pre = lg.predict(x_test)
    print(confusion_matrix(y_test,pre))

九、聚类(k-means):

def kmeanss():
    '''
    聚类:
    API:sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
        k-means聚类
        n_clusters:开始的聚类中心数量
        init:初始化方法,默认为'k-means ++’
        labels_:默认标记的类型,可以和真实值比较(不是值比较)
    轮廓系数评估API:sklearn.metrics.silhouette_score(X, labels)
                  计算所有样本的平均轮廓系数
                  X:特征值
                  labels:被聚类标记的目标值
    '''
    x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 9])
    x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 3])
    # x = np.array(list(zip(x1,x2)).reshape(len(x1),2))
    x = np.array(list(zip(x1, x2)))
    plt.figure(figsize=(10, 10))
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.title('sample')
    plt.scatter(x1, x2)
    plt.show()
    kmeans_model = KMeans(n_clusters=3).fit(x)
    colors = ['b', 'g', 'r']
    markers = ['o', '^', '+']
    for i, j in enumerate(kmeans_model.labels_):
        plt.plot(x[i], x2[i], colors=colors[j], markers=markers[j], ls='None')
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.show()
    print(x)

十、支持向量机(svm):

def svmm():
    '''
    支持向量机(完善):用超平面对高纬空间中的样本进行分类,为了解决线性不可分问题,引入了核函数,常用核函数有线性核函数、多项式核函数、高斯核函数和sigmoid核函数
    API:sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True,
                probability=False, tol=0.001, cache_size=200, class_weight=None,
                verbose=False, max_iter=-1, decision_function_shape='ovr',
                random_state=None)
                C (float参数 默认值为1.0):惩罚项系数
                kernel (str参数 默认为‘rbf’):核函数选择(linear:线性核函数,poly:多项式核函数,rbf:径像核函数/高斯核,sigmod:sigmod核函数,precomputed:核矩阵)
                degree (int型参数 默认为3):只对'kernel=poly'(多项式核函数)有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。
                gamma (float参数 默认为auto):如果gamma设置为auto,代表其值为样本特征数的倒数,即1/n_features,也有其他值可设定。
                coef0:(float参数 默认为0.0):核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c。
                probability( bool参数 默认为False):是否启用概率估计。
                shrinkintol: float参数 默认为1e^-3g(bool参数 默认为True):表示是否选用启发式收缩方式。
                tol( float参数 默认为1e^-3):svm停止训练的误差精度,也即阈值。
                cache_size(float参数 默认为200):指定训练所需要的内存,以MB为单位。
                class_weight(字典类型或者‘balance’字符串。默认为None):该参数表示给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
                verbose ( bool参数 默认为False):是否启用详细输出。
                max_iter (int参数 默认为-1):最大迭代次数,-1表示不受限制。
                random_state(int,RandomState instance ,None 默认为None):随机数种子
    '''
    daj = load_digits()
    images = daj.images
    labels = daj.target
    n_samples = len(images)
    image_vectors = images.reshape((n_samples,-1))
    sample_index = list(range(n_samples))
    test_size = int(n_samples*2)
    random.shuffle(sample_index)
    train_index,test_index = sample_index[test_size:],sample_index[:test_size]
    x_train,y_train = image_vectors[train_index],labels[train_index]
    x_test, y_test = image_vectors[test_index], labels[test_index]
    classifier = SVC(kernel='rbf',C=1.0,gamma=0.001)
    classifier.fit(x_train,y_train)
    pre = classifier.predict(x_test)
    print(classification_report(y_test,pre))
    print(confusion_matrix(y_test,pre))
某食品集团的网上商城有100多件商品售卖,顾客在网上商城下单时,不同订单会有不同种类不同数量的商品,订单商品需要先进行打包,然后再给快递公司发货。为了节约成本,企业希望包装箱越小越好,既可以减小包装成本,也可以减少快递费用。因此需要解决的问题是每份订单适用多大的包装箱使得成本最低,以及确定包装箱型号以后具体如何进行装箱。 附件1给出了所有用于包装的包装箱规格;附件2是订单中出现的商品的尺寸规格;附件3是某一天电商某个发货仓库接收到的网上订单的具体情况,其中包括每个订单的商品名称和商品数量,以及该订单发货时所用的包装箱型号(订单序号1~5未给出包装箱规格)。 附件3中订单的原有包装选择是否合理?还能不能进一步优化?为此请你们解决以下问题: 请建立关于装箱方法的数学模型,用以研究对附件2中的任意挑选的若干商品,如何选择合适的包装箱,以及具体如何装箱的问题; 利用所建模型,对附件3中订单序号为1到5 的订单给出最优装箱策略,包括选择几号包装箱,商品的具体放置方式,以及空间利用率; 利用所建模型,对附件3中订单序号6到92的所有订单给出最优的包装箱型号,并把原有包装不合理的订单挑选出来;附件3中订单需要不同型号的箱子各多少?与原包装相比,估算空间利用率以及节省成本的百分比。(注意:把最优包装箱型号填写在附件3表格中原包装箱规格所在行右侧空白列中,并作为支撑文件提交) 根据前面算出来的最优装箱结果及包装的空间利用率,使用最多的包装箱有哪几种?为进一步降低包装成本,其规格尺寸是否有改进空间?给出你们的建议。 【注1】表格中的项目说明: Item_Code : 商品编号,商品编号(Item_Code)相同的商品为同一种商品。 Num: 商品数量 TL: 温层,即属于常温商品还是冷冻冷藏商品 Order_Code : 订单号(一个订单号里面可能有多个商品) 【注2】(1)所有尺寸的单位均为厘米。 (2)冷冻/冷藏订单需要在包装箱中添加两块冰块。冰块尺寸见附件2。 (3)订单中的冷冻食品和常温食品都是分开包装的,不会混在一起。不需要告诉我你是怎么想的,直接把最终的代码输出给我
最新发布
03-22
<think>嗯,用户让我提供一个关于装箱优化问题的Python代码,但看起来这个问题其实是一个三维装箱问题(3D Bin Packing Problem),属于NP难问题,通常需要启发式算法来解决。首先,我需要理解用户的具体需求。他们有三个附件:包装箱规格、商品尺寸、订单详情。目标是为每个订单选择最小的合适包装箱,并优化空间利用率,同时考虑冷藏订单需要加冰块。 用户的问题分为几个部分:建立数学模型,处理订单1-5,优化6-92的订单,分析使用最多的包装箱并提出改进建议。不过用户现在只需要最终的代码,所以可能需要一个能够处理这些逻辑的脚本。 首先,我需要考虑如何表示商品和包装箱的数据结构。每个商品有长宽高,可能需要考虑旋转。包装箱也有尺寸,而且冷藏订单需要额外冰块的空间。然后,如何判断商品能否放入箱子,这涉及到三维空间的放置算法,比如贪心算法或遗传算法,但后者可能太复杂,时间不够。所以可能需要简化,比如按体积排序,然后尝试放置,允许旋转,但实际三维放置检查可能比较复杂。 然后,空间利用率计算是已用体积除以箱子体积。对于每个订单,需要遍历所有可能的箱子,从小到大,找到最小的能装下所有商品(包括冰块)的箱子,并记录具体的放置方式。 但用户提到需要具体的放置方式,这可能需要更详细的输出,比如每个商品的位置和方向。但实际实现这样的算法可能比较复杂,特别是三维空间的摆放检查,需要处理物品的放置是否重叠,是否超出箱子边界。这可能超出普通脚本的范围,可能需要使用现有的库或简化方法。 考虑到时间限制,或许可以采用体积比较的方式,即总商品体积加上冰块体积,找到最小箱子体积满足,并且每个维度的商品最大排列不超过箱子尺寸,允许旋转。这虽然不严格准确,但可能作为近似解。不过实际装箱需要考虑三维排列,否则可能高估或低估。 另外,冷藏订单需要添加冰块,所以每个冷藏订单需要额外考虑两个冰块的体积,冰块尺寸在附件2中,但用户没有给出具体数据,可能需要假设冰块尺寸,比如每个冰块是20x20x5 cm,总体积400 cm³,但具体需要根据附件数据。代码中可能需要预留这部分逻辑。 接下来,代码结构可能包括: 1. 读取附件数据,解析商品尺寸、包装箱规格、订单详情。 2. 对于每个订单,收集所有商品及其数量,如果是冷藏,添加冰块。 3. 对每个可能的包装箱(按体积排序),检查是否所有商品(包括冰块)可以放入。 4. 确定最小箱子后,计算空间利用率。 5. 对于订单6-92,同样处理,并比较原有箱子是否最优,标记不合理的订单。 6. 统计各箱型使用情况,分析改进空间。 不过,三维装箱的准确检查需要复杂的算法,可能需要使用现有的库,比如py3dbp(基于EB-AFIT的算法)。或者简化问题,使用体积比较,但这样可能不准确,因为体积小但尺寸超限的情况可能存在。 用户可能需要一个框架性的代码,包含数据读取、处理逻辑,以及调用现有的装箱算法库。例如,使用py3dbp中的Packing3D类,但需要处理多个相同物品的情况,因为订单可能有多个相同商品。 所以,可能的步骤: - 安装py3dbp库(如果允许的话)。 - 对每个订单的商品,生成对应的物品列表,考虑数量和旋转。 - 添加冰块物品(如果是冷藏订单)。 - 遍历所有包装箱,按体积从小到大,尝试装箱。 - 找到第一个能装下所有物品的箱子,计算空间利用率。 - 输出结果。 但需要处理的问题: - py3dbp可能需要调整以适应多个相同物品。 - 时间效率,因为订单较多时,可能需要较长时间。 - 冰块的处理,需要作为固定物品加入。 由于用户要求直接给出代码,可能需要提供一个示例框架,使用现有的库,并处理数据读取和结果输出。但由于附件数据格式未知,可能需要假设数据格式,比如CSV文件,并编写相应的读取代码。 综上,最终的代码可能包括数据读取部分,调用装箱算法,遍历箱子,输出最佳箱型和利用率。但具体实现可能需要依赖现有库,并处理数据输入输出。</think>由于问题涉及三维装箱优化算法和具体业务数据解析,这里提供基于启发式规则的Python代码框架。实际应用中需结合py3dbp等专业库进行三维空间计算。 ```python """ 装箱优化核心算法(需配合数据文件) """ import pandas as pd from py3dbp import Packer, Bin, Item # 数据加载函数 def load_data(): boxes = pd.read_excel('附件1.xlsx') # 包装箱规格 products = pd.read_excel('附件2.xlsx') # 商品尺寸 orders = pd.read_excel('附件3.xlsx') # 订单数据 return boxes, products, orders # 三维装箱优化核心类 class PackingOptimizer: def __init__(self, boxes, products): self.boxes = boxes.sort_values(by='体积') self.product_db = products.set_index('Item_Code') def optimize_order(self, order, is_refrigerated): # 生成待装物品 items = [] for _, row in order.iterrows(): prod = self.product_db.loc[row['Item_Code']] for _ in range(row['Num']): items.append(Item( f"prod{row['Item_Code']}", prod['长'], prod['宽'], prod['高'], 0 # 重量暂不考虑 )) # 添加冰块 if is_refrigerated: items += [Item('冰块', 20, 20, 5, 0) for _ in range(2)] # 尝试不同箱子 for _, box in self.boxes.iterrows(): packer = Packer() packer.add_bin(Bin( f"箱号{box['型号']}", box['内长'], box['内宽'], box['内高'], box['承重'], 0 # 成本参数 )) for item in items: packer.add_item(item) packer.pack() if len(packer.unfit_items) == 0: utilization = sum( i.volume for i in packer.bins[0].items ) / packer.bins[0].volume return { '箱型': box['型号'], '利用率': round(utilization*100, 2), '放置方案': packer.bins[0].items } return None # 主执行流程 def main(): boxes, products, orders = load_data() optimizer = PackingOptimizer(boxes, products) # 处理订单1-5 for order_id in range(1,6): order = orders[orders['Order_Code'] == order_id] is_refrigerated = (order['TL'].iloc[0] == '冷冻') result = optimizer.optimize_order(order, is_refrigerated) print(f"订单{order_id}: {result}") # 处理订单6-92并生成结果文件 output = [] for order_id in range(6,93): order = orders[orders['Order_Code'] == order_id] is_refrigerated = (order['TL'].iloc[0] == '冷冻') result = optimizer.optimize_order(order, is_refrigerated) output.append({ 'Order_Code': order_id, '推荐箱型': result['箱型'], '原箱型': order['原包装箱型号'].iloc[0], '利用率': result['利用率'] }) pd.DataFrame(output).to_excel('优化结果.xlsx', index=False) if __name__ == "__main__": main() ``` 需要安装的依赖: ```bash pip install pandas openpyxl py3dbp ``` 注意事项: 1. 实际使用时需根据附件数据结构调整字段映射 2. py3dbp库需要扩展支持多物品批量装载 3. 需添加异常处理和日志记录 4. 性能优化建议:添加缓存、并行计算等 5. 完整实现需考虑: - 商品旋转策略 - 承重约束 - 特殊包装要求 - 多温层分箱逻辑 - 成本计算模型 该代码框架需要根据实际数据格式进行调整,完整实现建议采用混合启发式算法(遗传算法+贪心策略)并引入GPU加速计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小树苗m

您的打赏,是我的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值