2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模

D题 汽车总装线的配置问题

一.问题背景
  某汽车公司生产多种型号的汽车,每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种,配置分为B1、B2、B3、B4、B5和B6六种,动力分为汽油和柴油2种,驱动分为两驱和四驱2种,颜色分为黑、白、蓝、黄、红、银、棕、灰、金9种。
  公司每天可装配各种型号的汽车460辆,其中白班、晚班(每班12小时)各230辆。每天生产各种型号车辆的具体数量根据市场需求和销售情况确定。附件给出了该企业2018年9月17日至9月23日一周的生产计划。
  公司的装配流程如图1所示。待装配车辆按一定顺序排成一列,首先匀速通过总装线依次进行总装作业,随后按序分为C1、C2线进行喷涂作业。

  二.装配要求
  由于工艺流程的制约和质量控制的需要以及降低成本的考虑,总装和喷涂作业对经过生产线车辆型号有多种要求:
  (1)每天白班和晚班都是按照先A1后A2的品牌顺序,装配当天两种品牌各一半数量的汽车。如9月17日需装配的A1和A2的汽车分别为364和96辆,则该日每班首先装配182辆A1汽车,随后装配48辆A2汽车。
  (2)四驱汽车连续装配数量不得超过2辆,两批四驱汽车之间间隔的两驱汽车的数量至少是10辆;柴油汽车连续装配数量不得超过2辆,两批柴油汽车之间间隔的汽油汽车的数量至少10辆。若间隔数量无法满足要求,仍希望间隔数量越多越好。间隔数量在5-9辆仍是可以接受的,但代价很高。
  (3)同一品牌下相同配置车辆尽量连续,减少不同配置车辆之间的切换次数。
  (4)对于颜色有如下要求:
  1)蓝、黄、红三种颜色汽车的喷涂只能在C1线上进行,金色汽车的喷涂只能在C2线上进行,其他颜色汽车的喷涂可以在C1和C2任意一条喷涂线上进行。
  2)除黑、白两种颜色外,在同一条喷涂线上,同种颜色的汽车应尽量连续喷涂作业。
  3)喷涂线上不同颜色汽车之间的切换次数尽可能少,特别地,黑色汽车与其它颜色的汽车之间的切换代价很高。
  4)不同颜色汽车在总装线上排列时的具体要求如下:

(a)黑色汽车连续排列的数量在50-70辆之间,两批黑色汽车在总装线上需间隔至少20辆。
  (b)白色汽车可以连续排列,也可以与颜色为蓝或棕的汽车间隔排列;
  (c)颜色为黄或红的汽车必须与颜色为银、灰、棕、金中的一种颜色的汽车间隔排列;
  (d)蓝色汽车必须与白色汽车间隔排列;
  (e)金色汽车要求与颜色为黄或红的汽车间隔排列;若无法满足要求,也可以与颜色为灰、棕、银中的一种颜色的汽车间隔排列;
  (f)颜色为灰或银的汽车可以连续排列,也可以与颜色为黄、红、金中的一种颜色的汽车间隔排列;
  (g)棕色汽车可以连续排列,也可以与颜色为黄、红、金、白中的一种颜色的汽车间隔排列。
  (h)关于其他颜色的搭配,遵循"没有允许即为禁止"的原则。
  由于该公司的生产线24小时不间断作业,以上总装线和喷涂线的各项要求对相邻班次(包括当日晚班与次日白班)的车辆同样适用。
  三.需要解决的问题
  (1)根据问题的背景、装配要求以及附件中的数据,建立数学模型或者设计算法,使其能给出符合要求、且具有较低生产成本的装配顺序。
  (2)根据(1)中的数学模型或算法,针对附件中的数据,给出你们的计算结果:
  (a)将9月20日的装配顺序按照下表格式填写在表中,并将此表放在论文的附录中。

(b)按照上表的格式给出9月17日至9月23日每天的装配顺序,文件以"schedule.xlsx"命名,作为论文的支撑材料与论文同时提交。

整体求解过程概述(摘要)

汽车是当前运用最为广泛的交通工具。为了减少汽车的生产成本以及能方便得出汽车生产线上的装配顺序,需对原有的汽车生产线进行优化。本文针对工艺要求、质量控制的需要和成本,关于调整生产线上的汽车品牌、颜色等顺序,设计了确定汽车装配顺序问题的算法。
  针对问题一,需要一个能得出生产成本较低的汽车装配顺序的算法。因为属性和工艺要求的多样性,难以找到使所有目标达到最佳的方案,于是采用多目标规划,用了序贯算法的思想,根据品牌、配置、动力、驱动、颜色这5个属性的优先级,将目标规划问题分解成一系列的单目标规划问题,然后根据优先级依次求解。
  对于品牌A1和A2,两班分别装配当天两种品牌各一半数量的汽车(总数460辆)。用Excel 软件根据附件所给数据制作A1和A2每天汽车总量表(见附录1.1),可知7天内每天生产A1的数量均超过350辆,A2的数量均少于105辆。
  对于汽车颜色属性如何确定装配顺序的问题,分析各颜色之间的间隔关系与数量,结合换色成本的考虑,采用分类思想先分为黑车和其他颜色的车,建立求黑车最小组数的最优化模型,并且根据最优化模型得出各天黑车组数最小值均为4组,并且求出黑色车各组的具体数量。再将其他颜色的车进行分类,设计五步确色法来确定颜色装配顺序。结合了颜色装配流程图(见图3),建立了各颜色装配顺序的模型。
  对于动力属性如何确定装配顺序的问题,尽量使柴油车在白班内完成装配,通过求基本最优解的方法,计算式(7), 若计算得到的结果大于或等于5,则直接得到两批柴油汽车之间的汽油汽车数量。若计算得到的结果小于5,则柴油汽车不能在白班完成装配,需要分配一部分到夜班,用式(8)计算出两批柴油汽车之间的汽油汽车数量,得到每个班次的柴油车组数和每组需要用来间隔的汽油车数量。
  对于驱动属性如何确定装配顺序问题,考虑情况与动力属性相似,尽量使四驱汽车在白班内完成装配,通过求基本最优解的方法,计算得到每个班次的组数、每组需要装配四驱车与两驱车的数量,由此得出两批四驱车之间数量的公式见式(5)。
  对于配置属性与其他属性之间的关系,将配置与品牌、动力、驱动、颜色等属性结合分析。将配置与动力共同分析得表3,可知7天内每天生产各类汽车的数量分布较均匀。将配置与颜色共同分析得表5,得到黑色B1配置的汽车总量为33辆。将配置与驱动共同分析得到表6,可知7天内生产的B1配置两驱汽车和四驱汽车的数量相似,两驱车在270辆到240辆之间,四驱车在30辆到10辆之间。得到7天内B1配置四驱车数量变化小。
  将配置与品牌共同分析得表7,可知B1配置的汽车数量最多,品牌A1的汽车每天产量可超过220辆,A2的汽车每天产量在60辆以内。 计算方案中所产生代价,利用层次分析法思想,确定各品牌、配置、动力、驱动、颜色这5个属性对代码权重,建立权重计算模型,根据文献所查到非黑色换色成本,得出第20日颜色切换、驱动切换、配置切换、动力切换的代价约为4550元。

模型假设:

1、假设各色车辆的数量不会发生很大的变化。
  2、假设黑车数量大于200辆并且少于280辆。
  3、假设没有新的型号、品牌出现。
  4、假设红色、黄色车为同一类车,定义为R型车。
  5、假设银色、灰色车为同一类车,定义为S型车。

问题分析:

汽车生产线优化有一系列不同要求,分析附件,得知要解决的问题为最优化问题及数据排序。建立汽车装配模型,并根据不同的要求进行修改,使汽车装配模型符合题目要求。
  因为属性和工艺要求的多样性,难以找到使所有目标达到最佳的方案,于是采用多目标规划。而序贯式算法是求解目标规划的一种早期算法,其核心是根据优先级的先后次序,将目标规划问题分解成一系列的单目标规划问题,然后再依次求解,所以可以使用序贯算法的思想。
  使用然后使用序贯算法的思想,根据品牌、配置、动力、驱动、颜色这5个属性的优先级,将目标规划问题分解成一系列的单目标规划问题,然后根据优先级依次求解。 针对问题一,考虑到符合要求且有较低生产成本的装配顺序。这是最优化求解问题。根据装配要求可知,汽车生产线有白班和晚班两个班次,总装线和喷涂线的各项要求对相邻班次的车辆同样适用。所以模型只考虑白班计划。
  使用序贯算法将品牌、驱动、动力、颜色、配置属性逐一分析。 针对品牌属性,计划将汽车总数一分为二减少计算量,先加工 A1 型号后加工 A2型号。配置方面利用Excel软件制作配置与各个属性结合的表格,并依次对表格进行具体数据分析。
  针对配置属性,考虑到同一品牌的相同配置车辆尽量连续,减少切换次数这一要求。 针对颜色属性,用Excel软件统计出各种颜色的汽车数量。以减少成本为前提,将数量最多的颜色与其它颜色在进行衔接考虑;根据题目所给要求,考虑将蓝色车辆与白色车辆分开,将金色车与红色车或黄色车分开,由于银色、灰色和棕色都可以用于相互间隔,但是棕色车与白车间隔可降低成本。所以在减少相应代价降低生产线成本的基础上安排合适的装配顺序。
  针对驱动属性,根据问题要求,考虑将四驱车在白班内全部完成,同时计算其所需要装配的组数和两驱车需要装配的数量,最后得到两批四驱车之间间隔的两驱车数量,若四驱车不能在白班内全部完成,就将四驱车平均分配在两个班次内,再计算其结果。 针对动力属性,根据问题要求,同样考虑将柴油车在白班内完成,计算出各个量后,计算出其结果,若符合问题要求则得出结果,若不符合,则将柴油车平均分配在两个班次内,再计算其结果。
  将分析后得出的品牌、配置、颜色、驱动、动力等的5种属性数据进行归类,在考虑生产成本的基础上安排合适的装配顺序,设计出算法,并写出代码。 针对问题二,在使用C-Free软件上运行代码,用Excel软件对表格进行归类排序。制作17日到23日的装配顺序表。

模型的建立与求解整体论文缩略图


全部论文请见下方" 只会建模 QQ名片" 点击QQ名片即可

程序代码:(代码和文档not free)

python 复制代码
import xlwt 
import xlrd 
 
data=xlrd.open_workbook('Problem_D_Data.xlsx') 
sheet=data.sheet_by_name('Sheet1') 
cols = sheet.col_values(0) 
riqi_index=([x for x in range(len(cols)) if cols[x] == '日期']) 
 
workbook = xlwt.Workbook(encoding='utf-8') 
sheet1 = workbook.add_sheet('sheet1',cell_overwrite_ok=True) 
#为样式创建字体 
style = xlwt.XFStyle() 
font = xlwt.Font() 
font.name = 'Times New Roman' 
font.bold = False 
#设置样式的字体 
style.font = font 
sheet1.write(0, 0, '日期', style) 
sheet1.write(0, 1, '品牌', style) 
sheet1.write(0, 2, '配置', style) 
sheet1.write(0, 3, '动力', style) 
sheet1.write(0, 4, '驱动', style) 
sheet1.write(0, 5, '颜色', style) 
sheet1.write(0, 6, '数量', style) 
idx=0 
for k in range(len(riqi_index)-1): 
    for t in range(riqi_index[k+1]-riqi_index[k]-2): 
        for s in range(5): 
                if sheet.cell_value(riqi_index[k]+t+1,s+4) !=0: 
                    idx = idx + 1 
                    #每找到一项非0的生产计划就记录一行 
                    sheet1.write(idx, 0, sheet.cell_value(riqi_index[k]+t+1,0), style)  
                    #日期在原表中位置为第1列 
                    sheet1.write(idx, 1, sheet.cell_value(riqi_index[k]+t+1,1), style) 
                    #品牌在原表中位置为第2列 
                    sheet1.write(idx, 2, sheet.cell_value(riqi_index[k],s+4), style) 
                    #配置在原表中位置为上方的第2行 
                    sheet1.write(idx, 3, sheet.cell_value(riqi_index[k]-1,s+4), style) 
                    #动力在原表中位置为上方的第1行 
                    sheet1.write(idx, 4, sheet.cell_value(riqi_index[k]+t+1,2), style) 
                    #驱动在原表中位置为第3列 
                    sheet1.write(idx, 5, sheet.cell_value(riqi_index[k]+t+1,3), style) 
                    #颜色在原表中位置为第4列 
                    sheet1.write(idx, 6, sheet.cell_value(riqi_index[k]+t+1,s+4), style) 
                    #对应以上属性的汽车生产需求 
 
workbook.save('Problem_D_Data_Chuli.xls')
bash 复制代码
model: 
sets: 
xiaobiao/1..460/:A1_,A2_,y,z,x; 
shuzhi/1..10/:SL; 
!A1黑色四驱、A2黑色四驱、 A1非黑色四驱、 
A2非黑色四驱、A1柴油、A2柴油、A1黑色柴油 
......等特殊汽车数值; 
endsets 
init: 
y,z=@ole('LingoData.xlsx'); 
endinit 
data: 
!打开Excel文件'LingoData.xlsx'读取相关数据; 
A1_,A2_,x,SL=@ole('LingoData.xlsx'); 
enddata 
min=@sum(xiaobiao(k) | k #GE# 12: 
y(k)*(10-@sum(xiaobiao(t) | (t #GE# k-11) #AND# (t #LE# k)  : 
(1-y(t)))) 
+z(k)*(10-@sum(xiaobiao(t) | (t #GE# k-11) #AND# (t #LE# k)  : 
(1-z(t)))) 
); 
@sum(xiaobiao(I):A1_(I)*x(I)*y(I))=SL(1); 
@sum(xiaobiao(I):A2_(I)*x(I)*y(I))=SL(2); 
@sum(xiaobiao(I):A1_(I)*y(I)*(1-x(I)))=SL(3); 
@sum(xiaobiao(I):A2_(I)*y(I)*(1-x(I)))=SL(4); 
@sum(xiaobiao(I):A1_(I)*z(I))=SL(5); 
@sum(xiaobiao(I):A2_(I)*z(I))=SL(6); 
@sum(xiaobiao(I):A1_(I)*x(I)*z(I))=SL(7); 
@sum(xiaobiao(I):A2_(I)*x(I)*z(I))=SL(8); 
@sum(xiaobiao(I):A1_(I)*y(I)*z(I))=SL(9); 
@sum(xiaobiao(I):A2_(I)*y(I)*z(I))=SL(10); 
@for(xiaobiao(I) | (I #GE# 2) #AND# (I #LE# 459) : 
3-y(I-1)-y(I)-y(I+1) >= y(I); 
3-z(I-1)-z(I)-z(I+1) >= z(I); 
); 
@for(xiaobiao(k) | k #GE# 7 : 
@sum(xiaobiao(t) | (t #GE# k-6) #AND# (t #LE# k)  : 
(1-y(t)))>=5; 
@sum(xiaobiao(t) | (t #GE# k-6) #AND# (t #LE# k)  : 
(1-z(t)))>=5; 
); 
@for(xiaobiao(I): 
@bin(A1_(I)); 
@bin(A2_(I)); 
@bin(y(I)); 
@bin(z(I)); 
); 
end 
bash 复制代码
function Graph=genGraph(config,color,num) 
N=sum(num); 
Graph=ones(N)*inf;  %连接图共有N个顶点 
idx=zeros(N,1);      %用来记录每个顶点的属性类表序号 
s=1; 
for k = 1:length(num) 
    idx(s:(s+num(k)-1))=k; 
    s=s+num(k); 
end 
for k = 1:N 
    for t = 1:N 
        if t==k 
            Graph(k,t) = 0; 
        end 
        if t ~= k 
            if strcmp(color{idx(k)},'白')     %白色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'白') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'蓝') 
 Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'棕') 
                    Graph(k,t) = 1; 
                end 
            end 
            if strcmp(color{idx(k)},'黄')     %黄色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'银') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'灰') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'棕') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'金') 
                    Graph(k,t) = 1; 
                end 
            end 
            if strcmp(color{idx(k)},'红')     %红色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'银') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'灰') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'棕') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'金') 
                    Graph(k,t) = 1; 
                end 
            end 
            if strcmp(color{idx(k)},'蓝')     %蓝色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'白') 
                    Graph(k,t) = 1; 
                end 
            end 
            if strcmp(color{idx(k)},'金')     %金色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'黄') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'红') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'灰') 
                    Graph(k,t) = 10;           %金色汽车优先与黄、红汽车连接 
                end 
                if strcmp(color{idx(t)},'棕') 
                    Graph(k,t) = 10; 
                end 
                if strcmp(color{idx(t)},'银') 
                    Graph(k,t) = 10; 
                end 
            end 
            if strcmp(color{idx(k)},'灰')     %灰色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'灰') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'银') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'黄') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'红') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'金') 
                    Graph(k,t) = 1; 
                end 
            end 
            if strcmp(color{idx(k)},'银')     %银色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'灰') 
                    Graph(k,t) = 1; 
end 
                if strcmp(color{idx(t)},'银') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'黄') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'红') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'金') 
                    Graph(k,t) = 1; 
                end 
            end 
            if strcmp(color{idx(k)},'棕')     %棕色汽车在装配线上的允许连接情况 
                if strcmp(color{idx(t)},'棕') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'白') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'黄') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'红') 
                    Graph(k,t) = 1; 
                end 
                if strcmp(color{idx(t)},'金') 
                    Graph(k,t) = 1; 
                end 
            end 
        end 
    end 
end
全部论文请见下方" 只会建模 QQ名片" 点击QQ名片即可
相关推荐
2401_882727578 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
smppbzyc12 小时前
2024亚太杯数学建模C题【Development Analyses and Strategies for Pet Industry 】思路详解
数学建模·数学建模竞赛·亚太杯·2024亚太杯数学建模·apmcm亚太杯·2024亚太地区数学建模竞赛·亚太杯c题
热心网友俣先生13 小时前
2024年亚太C题第二版本二问题1求解过程+代码运行以及问题2-4超详细思路分析
数学建模
小何数模13 小时前
24 年第十四届APMCM亚太数模竞赛浅析
数学建模
川川菜鸟16 小时前
2024年亚太地区数学建模C题完整思路
数学建模
2023数学建模国赛比赛资料分享16 小时前
2024亚太杯国际赛C题宠物预测1234问完整解题思路代码+成品参考文章
人工智能·数学建模·宠物·2024亚太杯国际赛数学建模·2024亚太杯国际赛a题·2024亚太杯国际赛数模abc·2024亚太杯数学建模
subject625Ruben2 天前
随机森林(Random Forest, RF)筛选回归数据(处理异常值)
算法·随机森林·数学建模·回归
数维学长9862 天前
《译文》2024年11月数维杯国际大学生数学建模挑战赛题目
数学建模
2023数学建模国赛比赛资料分享2 天前
2024年第十四届APMCM亚太杯数学建模A题B题C题思路+代码解析汇总
数学建模·2024第十四届亚太杯数模·2024亚太杯数学建模国际上·2024亚太杯数学建模国际赛
张焚雪2 天前
关于图论建模的一份介绍
python·数学建模·图论