本文章用于记录2022华为杯数学建模B题——方形件组批优化问题
提醒:大家最终提交的时候记得是pdf文件,不是word文件。
第一次参加建模比赛,经验不足,准备不充分,能力也欠缺。考虑2023年继续再战!

经过查询,发现该问题与以下两篇论文较为相似,我们的工作也是基于此开展的。
[1]严玄. 矩形三阶段带排样问题的遗传算法的研究[D].广西师范大学,2009.
[2]张浩. 面向板式产品定制生产的组批与排样协同优化方法[D].广东工业大学,2019.

下面提供我们所写文章的链接。
链接: 文章

下面为个人用MATLAB编写的层次聚类算法。
代码:

Clustering.m

clc,clear;
%读取path对应的.csv文件的数据
csv_data=readmatrix('csv_change.csv');        %确定X矩阵的大小,并赋0值
for i=1:length(csv_data)a=csv_data(i,1);b=csv_data(i,6);X(a,b)=0;
end
%为第a个订单编号的第b类材料计数
for i=1:length(csv_data)a=csv_data(i,1);b=csv_data(i,6);X(a,b)=X(a,b)+1;
end%%%%    针对以上数据,开展层次聚类算法的研究%获取距离矩阵
%X=randn(10,2);Y=pdist(X);
%获取聚类,第二参数指定层次聚类方式
Z=linkage(Y,'ward');%画图
figure
%指定显示数量,0代表全部显示;颜色阈值100
H = dendrogram(Z,0,'ColorThreshold',100);title('层次聚类法聚类结果');
%set(H,'linewidth',2);   %设置线的宽度
ylabel('欧式距离');
saveas(H,'层次聚类法聚类结果.Tif');%%%%%   针对聚类结果Z开展**组批优化**研究%计算初始簇Cu的N(产品数量,第一个)与S(产品面积,第二个)
for i=1:length(csv_data)a=csv_data(i,1);Cu_NS(a,1)=0;Cu_NS(a,2)=0;
end
for i=1:length(csv_data)a=csv_data(i,1);Cu_NS(a,1)=Cu_NS(a,1)+1;Cu_NS(a,2)=Cu_NS(a,2)+csv_data(i,5);
end%%%%    开始组合簇
% 不考虑约束条件
n=length(Z);for i=1:na=Z(i,1);b=Z(i,2);%求合并簇后对应的数量N、面积SCu_NS(n+i,1)=0;Cu_NS(n+i,2)=0;Cu_NS(n+i,1)=Cu_NS(a,1)+Cu_NS(b,1);%数量Cu_NS(n+i,2)=Cu_NS(a,2)+Cu_NS(b,2);%面积%
%     Cu_Num(i,1)=i;
%     Cu_Num(n+i,1)=0;
%
%     Cu_Num(n+i,end+1)=a;
%     Cu_Num(n+i,end+1)=b;
end
%每个簇对应的子簇(初始簇,最底层)
n=length(Z);
for i=1:nCu_Num(i,1)=i;Cu_Num(n+i,n)=0;
endfor i=1:na=Z(i,1);b=Z(i,2);aa=Cu_Num(a,:); aa(find(aa==0))=[];bb=Cu_Num(b,:); bb(find(bb==0))=[];cc=cat(2,aa,bb);for j=1:length(cc)Cu_Num(n+i,j)=cc(1,j);end%     for j=1:length(aa)
%         %Cu_Num(n+i,j)=aa(1,j);
%     end
end
%每个簇对应的子簇(前2个,最近层)
n=length(Z);
for i=1:na=Z(i,1);b=Z(i,2);Cu_in(i,1)=i;Cu_in(n+i,1)=n+i;Cu_in(n+i,2)=a;Cu_in(n+i,3)=b;
end
%找到不满足约束条件的全部簇群Cu_all
n=length(Cu_in);
j=1;
for i=1:na=Cu_in(i,1);if Cu_NS(a,1) >1000 || Cu_NS(a,2) >250000000Cu_all(j,1)=a;j=j+1;end
end
%找到不满足约束条件的底层簇Cu_min
n=length(Cu_all);
j=1;
for i=1:na=Cu_all(i,1);b=ismember(Cu_in(a,2),Cu_all);c=ismember(Cu_in(a,3),Cu_all);if b+c==0Cu_min(j,1)=a;j=j+1;end
end

csv_change.m

clc;
clear;
%拼接路径,读入all文件名
filename=dir('.\子问题2-数据集B\*.csv');
path=strcat('.\子问题2-数据集B\',filename(1).name);  %读取path对应的.csv文件的数据
t=readcell(path);
%删除第一行
t(1,:)=[];
%将订单编号进行排序,并转为数值导入到D中
order=erase(t(:,6),'order');
order_num=str2num(char(order));
[a,b]=sort(order_num); for i=1:length(a)D(i,1)=a(i);                    %D(:,1)代表订单编号D(i,2)=cell2mat(t(b(i),1));     %D(:,2)代表订单idw=cell2mat(t(b(i),4));D(i,3)=w;                       %D(:,3)代表订单宽度h=cell2mat(t(b(i),5));D(i,4)=h;                       %D(:,4)代表订单高度D(i,5)=w*h;                     %D(:,5)代表订单面积
end%将材料类型按顺序赋值给D
[mat,mat_id]=sort(t(:,2));
m=1;
n=length(mat);
mat(n+1)=mat(n);for i = 1:nfor j =1:nif b(j)==mat_id(i)D(j,6)=m;               %D(:,6)代表材料类型endendif strcmp(mat(i),mat(i+1))==0m=m+1;        end
endcsvwrite('csv_change.csv',D);

Order_group_batch.m

clc;
clear all;
%拼接路径,读入all文件名
filename=dir('.\子问题2-数据集B\*.csv');
path=strcat('.\子问题2-数据集B\',filename(1).name);  %读取path对应的.csv文件的数据
t=readcell(path);
%删除第一行
t(1,:)=[];
%将订单编号进行排序,并转为数值导入到D中for i=1:length(t)t(i,7)=num2cell(i);             %补充订单的排列顺序编号
end
order=erase(t(:,6),'order');order_num=str2num(char(order));
[a,b]=sort(order_num); for i=1:length(a)D(i,1)=a(i);                    %D(:,1)代表订单编号D(i,2)=cell2mat(t(b(i),1));     %D(:,2)代表订单idD(i,7)=cell2mat(t(b(i),7));     %D(:,7)代表订单的排列顺序编号w=cell2mat(t(b(i),4));D(i,3)=w;                       %D(:,3)代表订单宽度h=cell2mat(t(b(i),5));D(i,4)=h;                       %D(:,4)代表订单高度D(i,5)=w*h;                     %D(:,5)代表订单面积end%将材料类型按顺序赋值给D
[mat,mat_id]=sort(t(:,2));
m=1;
n=length(mat);
mat(n+1)=mat(n);for i = 1:nfor j =1:nif b(j)==mat_id(i)D(j,6)=m;               %D(:,6)代表材料类型   数值endendif strcmp(mat(i),mat(i+1))==0m=m+1;        end
endamax=max(D(:,1));
bmax=max(D(:,6));
X=zeros(amax,bmax);%X为第a个订单编号的第b类材料计数
%XX为第a个订单编号所包含的产品顺序编号
n=length(D);for i=1:na=D(i,1);b=D(i,6);X(a,b)=X(a,b)+1;
end
w=1;D(end+1,1)=0;
for i=1:length(D)-1a=D(i,1);b=D(i+1,1);XX(D(i,1),w)=D(i,7);if a==bw=w+1;elsew=1;end
end
D(end,:)=[];%%%%    针对以上数据,开展层次聚类算法的研究%获取距离矩阵
%X=randn(10,2);Y=pdist(X);
%获取聚类,第二参数指定层次聚类方式
Z=linkage(Y,'ward');%画图
figure(1)
%指定显示数量,0代表全部显示;颜色阈值100
%H = dendrogram(Z,0,'ColorThreshold',100);
H = dendrogram(Z,0);title('层次聚类法聚类结果');
%set(H,'linewidth',2);   %设置线的宽度
ylabel('欧式距离');
saveas(1,'层次聚类法聚类结果.tif');%%%%%   针对聚类结果Z开展**组批优化**研究%计算初始簇Cu的N(产品数量,第一个)与S(产品面积,第二个)
Cu_NS=zeros(amax,2);
for i=1:length(D)a=D(i,1);Cu_NS(a,1)=Cu_NS(a,1)+1;Cu_NS(a,2)=Cu_NS(a,2)+D(i,5);
end%%%%    开始组合簇
% 不考虑约束条件
n=length(Z)+1;for i=1:n-1a=Z(i,1);b=Z(i,2);%求合并簇后对应的数量N、面积SCu_NS(n+i,1)=0;Cu_NS(n+i,2)=0;Cu_NS(n+i,1)=Cu_NS(a,1)+Cu_NS(b,1);%数量Cu_NS(n+i,2)=Cu_NS(a,2)+Cu_NS(b,2);%面积end
%每个簇对应的子簇(初始簇,最底层)Cu_Num
n=length(Z)+1;
for i=1:nCu_Num(i,1)=i;end
for i=1:n-1Cu_Num(n+i,n)=0;
endfor i=1:n-1a=Z(i,1);b=Z(i,2);aa=Cu_Num(a,:); aa(find(aa==0))=[];     %删除数组末尾的0bb=Cu_Num(b,:); bb(find(bb==0))=[];cc=cat(2,aa,bb);                        %合并数组for j=1:length(cc)Cu_Num(n+i,j)=cc(1,j);end
end
%每个簇对应的子簇(前2个,最近层)Cu_in
n=length(Z)+1;
for i=1:n-1a=Z(i,1);b=Z(i,2);Cu_in(i,1)=i;Cu_in(n,1)=n;Cu_in(n+i,1)=n+i;Cu_in(n+i,2)=a;Cu_in(n+i,3)=b;
end
%找到不满足约束条件的全部簇群Cu_all
n=length(Cu_in);
j=1;
for i=1:nif Cu_NS(i,1) >1000 || Cu_NS(i,2) >250000000Cu_all(j,1)=i;j=j+1;end
end
%找到不满足约束条件的底层簇Cu_min
n=length(Cu_all)+1;
j=1;
for i=1:n-1a=Cu_all(i,1);b=ismember(Cu_in(a,2),Cu_all);  c=ismember(Cu_in(a,3),Cu_all);if b==0Cu_min(j,1)=Cu_in(a,2);j=j+1;endif c==0Cu_min(j,1)=Cu_in(a,3);j=j+1;end
end%XX为产品顺序号D(:,7)
n=length(Cu_min);
w=2;
d(1,1)=0;
for i=1:n                   %遍历所有分类批次a=Cu_min(i);            %i批对应的簇b=Cu_Num(a,:);          %簇中包含的使用订单号b(find(b==0))=[];       %去末尾的零for j=1:length(b)       %遍历所有订单号c=XX(b(1,j),:);     %订单中包含的所有产品c(find(c==0))=[];d=cat(2,d,c);endfor k=1:length(d)Cu_a(i,k)=d(1,k);endd=[];end%生成目标表格
strs1=[1;2];
strs2={'5-0218S';'5-0218S'};
strs3=[1;1];
strs4=[1;2];    strs5=[1;2];
strs6=[1;2];    strs7=[1;2];    strs8=[1;2];  strs9=[1;1];Goals=table(strs1,strs2,strs3,strs4,strs5,strs6,strs7,strs8,strs9,...'VariableNames',{'批次序号',    '原片材质',   '原片序号',   '产品id',   ...'产品x坐标',    '产品y坐标', '产品x方向长度',    '产品y方向长度','原片材质_数字',});n=length(Cu_min);
w=1;for i=1:n                   %遍历同一批次下所有的产品顺序号D(:,7)a=Cu_a(i,:);  a(find(a==0))=[];       %去末尾的零for j=1:length(a)       %遍历所有产品顺序号for k=1:length(D)   %遍历所有数据if D(k,7)==a(j) %找寻相同产品顺序号Goals.("批次序号")(w)=i;Goals.("原片材质")(w)=t(D(k,7),2);Goals.("原片序号")(w)=0;Goals.("产品id")(w)=D(k,2);Goals.("产品x坐标")(w)=0;Goals.("产品y坐标")(w)=0;Goals.("产品x方向长度")(w)=D(k,3);Goals.("产品y方向长度")(w)=D(k,4);Goals.("原片材质_数字")(w)=D(k,6);w=w+1;endendend
end%csvwrite('Goals.csv',Goals);

下图为层次聚类算法结果图:

2022华为杯数学建模B题——方形件组批优化问题相关推荐

  1. 【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现(更新完毕)

    更新时间 (1)2022-10-6,13:00 更新内容:二维举行下料求解算法的相关参考文献 (2)2022-10-6,17:55 更新内容:问题一B题建立的数学模型和求解方案 (3)2022-10- ...

  2. 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】

    提示:下文将介绍2022年华为杯数学建模E题赛后总结加思路详细介绍配代码 傻逼队友,傻逼队友,傻逼队友一定要看好人在进行组队,这是劝告. 这里有几点总结进行描述: 第一,图一定要尽量多,对图的解释要多 ...

  3. 2022年数维杯数学建模C题 电动汽车充电站的部署优化策略求解全过程文档及程序

    2022年数维杯数学建模 C题 电动汽车充电站的部署优化策略 原题再现:   近年来,随着化石能源的逐渐枯竭和环境污染的不断加剧,电动汽车(EV)作为传统燃油车的主要替代品之一,得到了快速的发展.据国 ...

  4. 2022 高教杯数学建模C题古代玻璃制品的成分分析与鉴别回顾及总结

    2022 高教杯数学建模C题古代玻璃制品的成分分析与鉴别回顾及总结 Paper & Code:https://github.com/Fly-Pluche/2022-mathematical-m ...

  5. 2021华为杯数学建模D题解题-抗乳腺癌候选药物的优化建模

    2021华为杯数学建模D题解题-抗乳腺癌候选药物的优化建模 赛题 1. 问题一解题:特征选择 1.1. 赛题分析 1.2. 解题:特征选择方法对比 1.3. 模型评估 2. 问题二解题:预测模型 2. ...

  6. 2021年华为杯数学建模B题,四题全部代码和思路

    2021年华为杯数学建模B题,四题全部代码和思路 需要的请联系我,企鹅1514168893.先看视频,满意再来找我,谢谢哈 四题均已做完

  7. 2020华为杯数学建模D题交流2群

    2020华为杯数学建模D题交流2群

  8. 2021年国赛高教杯数学建模D题连铸切割的在线优化解题全过程文档及程序

    2021年国赛高教杯数学建模 D题 连铸切割的在线优化 原题再现   连铸是将钢水变成钢坯的生产过程,具体流程如下(图 1):   钢水连续地从中间包浇入结晶器,并按一定的速度从结晶器向下拉出,进入二 ...

  9. 2022华为杯研究生数学建模竞赛B题方案及赛后总结:方形件组批优化问题

    "中国光谷·华为杯"第十九届中国研究生数学建模竞赛『二等奖』,@队友:zhugby.M学弟 目录 一.赛题 1.1 问题描述 1.2 问题和数据说明 二.摘要 三.问题一的模型建立 ...

最新文章

  1. catv系统主要有哪三部分组成_你了解买车“三大件”之一的悬挂系统吗?家用车用什么悬挂系统?...
  2. 维特根斯坦:为何夸大人工智能是对人性的贬损?
  3. C++ string中find ,rfind 等函数 用法总结及示例
  4. Java必须了解的“递归”与“IO流”!!!
  5. 微型计算机的外存储器可与 直接打交道,微型计算机的外存储器可与( )直接打交道。...
  6. apache apollo php,php windows環境 安裝 Apache-apollo + phpMQTT 實現發送 MQTT
  7. HTML DOM那点儿事儿
  8. iOS9 白名单问题 -canOpenURL: failed for URL: xx - error:This app is not allowed to query for scheme x...
  9. Oracle入门(十四.20)之创建DML触发器:第一部分
  10. 【LINQ】Linq to SQL -- Count/Sum/Min/Max/Avg 操作符
  11. python中循环结构break_Python编程10:跳出循环结构之break和continue
  12. [.NET] 使用 .NET Framework 開發 ActiveX Control
  13. Unit 11 电话转接
  14. 功能强大的云打印组件-接口文档
  15. springmvc转换器converter的使用
  16. 虚幻引擎4的实时渲染流程(直播总结)
  17. linux nano编译器_Nano 编辑器可以做些什么?
  18. 传奇手游战神引擎多机多区配置方法
  19. windows 任务相关 删除任务
  20. idea根据路径找控制器的插件(推荐)

热门文章

  1. 击败酷睿i9,苹果M1芯片为何如此优秀?
  2. 遗传算法求函数最小值(多维)1
  3. vue-baidu-map使用方法(简单快速)在vue项目中使用
  4. 定时向QQ推送天气消息
  5. 尝试解决联想M7450F在win10下无法使用的问题,记录下过程
  6. U-App 升级剧透,你不抢个内测账号?
  7. 4.9 Selenium 库趣味案例:网页自动投票
  8. 自动化运维_Git_git服务和Head指针
  9. tar命令功能及选项
  10. redis 学习参考网站(中文官方网站)