2020年亚太杯APMCM数学建模大赛A题激光标记舱口轮廓生成求解全过程文档及程序
2020年亚太杯APMCM数学建模大赛
A题 激光标记舱口轮廓生成
原题再现:
激光是20中的一项重要发明世纪,它被称为“最锋利的刀”、“最精确的尺子”和“最不寻常的光”。 激光已越来越多地应用于工业加工, 其中可以是就业在各种加工业务例如作为标记、焊接、钻孔、切割、热处理和喷涂。 激光具有良好的方向性,可以汇聚成微小的光斑,达到高度集中的能源; 此外,到期了去它的声音单色性, 激光是很容易去控制。
激光打标是指用激光对LOGO,字符,符号,图像等进行标记。 在产品表面。 它是一种广泛使用的加工方法,具有加工效率高、非接触操作、无耗材、对产品表面变形影响小、标记含量坚固等优点。
激光打标机的舱口工具可用于舱口指定的2D复合曲线图,不同舱口参数的设置对不同材料的加工效果影响很大。 方向平行孵化和轮廓平行孵化是孵化的两种基本方式。方向平行舱口,也称为“锯齿形”舱口,其路径沿平行于最初选定的参考方向的线段移动。 基于这种策略,通过将这些并行段连接起来,得到连接路径,使它们要么从右到左(或从左到右),要么从左到右和从右到左交替遍历。 而轮廓平行舱口使用偏移段,边界曲线作为光滑舱口路径,类似于边界曲线。 因此,轮廓平行舱口是以螺旋状的方式产生的曲线,在恒定距离的曲线边界。 哪种舱口在实践中的应用高度依赖于标记材料和工艺对特定加工任务的影响。
孵化实体必须是封闭的曲线多边形,多个相互嵌套的轮廓对象可以通过分组匹配来填充。 对于图形的孵化过程,现有的边界轮廓应首先根据边缘距离向内或向外偏移,然后再受锯齿形平行或轮廓平行孵化的影响。 舱口曲线应均匀、规则,并保持基本平行。 不允许有遗漏填写区域,也不允许重复填写区域。 激光标记的孵化应以实时方式在线生成孵化轮廓。 为了满足高效率激光打标的要求,舱口曲线应与图形的边界线保持平行,最大程度上均匀分布,并自动快速生成。 效率是产生孵化数字的重要指标。
请研究图形课题采用锯齿形平行和等高线平行孵化的特点,建立孵化的数学模型,设计算法,讨论算法的效率,回答下列问题:
1. 实现附件1中单层轮廓图案的锯齿形平行和轮廓平行舱口;在这里,只考虑水平方向(0°度)的舱口。 请根据附件1中图的坐标点数据(单位:mm)实现两组输入参数下的孵化):
(1) 内收缩边界距离1mm,舱口线间距1mm;
(2) 内缩边距0.1mm,舱口线间距0.1mm。
在这两组参数下,计算锯齿形平行和等高线平行舱口的孵化曲线的孵化线的总长度,并计算锯齿形平行舱口的水平线数和等高线平行舱口的圆圈数。 根据孵化程序的多次运行计算平均运行时间(单位:ms),计算参数组(2)和(1)条件下程序运行的运行时间比)。
2. 实现附件2中相互嵌套的多层轮廓图案的锯齿形平行和轮廓平行孵化;在这里,只考虑水平方向(0°度)的孵化。 请根据附件2中图的坐标点数据(单位:mm)实现两组输入参数下的孵化):
(1) 内收缩边界距离1mm,舱口线间距1mm;
(2) 内缩边距0.1mm,舱口线间距0.1mm。
在两组参数下,计算受锯齿形平行和等高线平行舱口的孵化曲线的孵化线总长,并计算锯齿形平行舱口的水平线数和等高线平行舱口的圆圈数。 根据孵化程序的多次运行计算平均运行时间(单位:ms),计算参数组(2)和(1)条件下程序运行的运行时间比)。
3. 激光打标机产生的光斑直径很小。 激光打标的孵化线间距一般为0.01mm-0.1mm。激光打标产生大量的等高线数据,任何形状的等高线对程序的运行效率都有极高的要求。 请检查您的孵化算法经过的时间,并分析其性能,为优化孵化算法的性能和效率提供策略或方向,使其能够满足实际工业应用的效率要求。
整体求解过程概述(摘要)
激光打标已广泛应用于工业加工中。对于不同的阴影方法,标记图案的操作效率和清晰度也不同。我们需要根据不同的参数分别实现单层和多层轮廓图案的Z字形平行和轮廓平行阴影,对算法进行评估,并给出优化策略。建立了三个模型:模型一:Z字形平行剖面线模型;模型二:等高线平行剖面线模型;模型三:绩效评价函数模型。
对于模型I,我们首先计算平行线的数量,然后用等距平行线和轮廓曲线的交点构造一个相交矩阵,并将交点依次收缩为轮廓线,通过相交矩阵位置对应点的斜率确定不连续点,最后得到传递矩阵。最后,将传递矩阵划分为块,并将每个块矩阵的元素按从左到右和从右到左的交替顺序连接,以获得水平等距影线。根据我们建立的模型,附件1中单层轮廓图案中水平线间距为1mm和0.1mm的影线分别为797mm和9972mm,Z字形平行影线的水平线数分别为88和907,基于多次运行影线程序的平均经过时间分别为289ms和1886ms,经过时间比为6.52;附件2中多层轮廓图案中水平线间距为1mm和0.1mm的总长度分别为1011mm和11079mm,水平线数量分别为126和954,平均经过时间分别为266ms和1952ms;经过时间的比率为7.34。
对于模型II,我们建立了一种基于点的多边形填充算法:曲率较小的轮廓曲线直接向内收缩,同时使用Douglas Puck算法保留拐点并删除一些不重要的平滑点,有效地减少了循环次数;在曲率较大的地方,通过干涉点消除无效循环。最后,对轮廓终止条件进行了说明。根据模型,附件1中单层轮廓图案中的阴影线总长分别为402mm和1021mm,轮廓平行阴影的圆数分别为11和85,平均经过时间分别为326ms和4090ms,比值为12.55;附件2中多层轮廓图案中的总长度分别为408mm和1099mm,圆圈数分别为12和106,平均经过时间分别为440ms和5030ms;比值为11.27。
为了评估算法的效率,我们通过分析上述问题中计算结果的参数和实际情况,构建了一个性能函数来评估评分效率,然后基于该性能函数,我们使用遗传算法提出了进一步改进模型的策略和方向,使其能够满足实际工业应用的效率要求。最后,给出了该模型的优缺点。
模型假设:
•假设1:在实际情况下,拐点延迟对程序运行时间的影响可以忽略不计,并且认为标记物理图与程序设计中的图之间没有偏差。
•假设2:填充的等距轮廓线必须是闭合的弯曲多边形。
•假设3:本文中的所有曲线都是平行移动的,Z字形平行阴影仅使用0°扫描线填充。
•假设4:在激光打标的实际生产中,不存在设备故障导致的事故。
问题重述:
对于不同的材料和不同的工艺参数,激光的效果也不同。方向平行填充和轮廓平行填充是两种基本的填充方法。对于平行方向填充方法,激光器平行于最初选择的参考方向移动。而轮廓线的平行图案填充是以螺旋方式沿着曲线生成的,与曲线边界保持恒定的距离。实际使用哪种类型的舱口在很大程度上取决于标记材料和加工过程对特定加工任务的影响。我们需要建立数学模型来解决以下问题:
问题1:在只考虑水平Z字形平行影线的情况下,实现附件1中单层轮廓图案的Z字形平行和轮廓平行影线,并根据附件1的图形坐标数据实现两个输入参数下的影线。
(1) 内缩边界距离1mm,影线间距1mm;
(2) 内缩边界距离0.1mm,影线间距0.1mm。
在两组参数下,计算:
(a) Z字形平行和轮廓平行阴影的阴影曲线的阴影线的总长度;
(b) 锯齿形平行影线的水平线数;
(c) 轮廓平行影线的圆数;
(d) 基于孵化程序的多次运行的平均经过时间;
(e) 在参数组(2)和(1)的条件下程序运行的经过时间的比率。
问题2:实现附件2中相互嵌套的多层轮廓图案的Z字形平行和轮廓平行图案填充。参数设置等计算内容与问题1相同。
问题3:检查孵化算法的运行时间并分析其性能,为优化孵化算法的性能和效率提供策略或方向。
激光打标机的填充工具可以用来填充指定的二维复合曲线图,不同填充参数的设置对不同材料的加工效果有很大影响。为了解决这些问题并进一步探索阅卷效率,我们的团队将做以下工作:
•忽略一些微不足道的影响。
•建立两个多边形平行舱口模型:锯齿形和轮廓平行舱口。然后记录两个模型在不同平行扫描线间距下的填充方法、运行时间、扫描次数、长度等数据。
•建立性能评估函数来测试我们的模型,并基于遗传算法优化孵化算法。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:
部分程序如下:
function y=inward(all,d)
while (all(1,:)==all(end,:))
all(end,:)=[];
end
n=size(all,1);
L1=zeros(n,2);
a=(all(2,:)−all(n,:));
b=zeros(2,1);
b(2)=−a(1);
b(1)=a(2);
b=b./(sum(b.^2)^(1/2));
b=b’;
L1(1,:)=all(1,:)+b*d;
note=[];
note1=[];
for i=2:1:n−1
a=(all(i+1,:)−all(i−1,:));
b=zeros(2,1);
b(2)=−a(1);
b(1)=a(2);
b=b./(sum(b.^2)^(1/2));
b=b’;
L1(i,:)=all(i,:)+b*d;
if(i>=4)
note=[note;findwr(L1,i)];
end
if (comp2(all(i−1,:)’,all(i,:)’,L1(i−1,:)’,L1(i,:)’))
note1=[note1,i];
end
end
a=(all(1,:)−all(n−1,:));
b=zeros(2,1);
b(2)=−a(1);
b(1)=a(2);
b=b./(sum(b.^2)^(1/2));
b=b’;
L1(n,:)=all(n,:)+b*d;
note=[note;findwr([L1;L1(1,:)],n+1)];
L1=[L1;L1(1,:)];
if (note)
L12=resetp(L1,note,note1,all);
else
L12={L1};
end
for i=1:1:length(L12)
L112=L12{i};
if size(L112,1)>2
L112=[L112;L112(1,:)];
plot(L112(:,1),L112(:,2),’−k’);
end
end
axis equal;
y=L12;
end
function y=resetp(L1,note,note1,yall)
n0=size(L1,1);
n1=size(note,1)
mark=ones(n1,1);
m=1;
k=note(n1,1);
if (n1>=2)
com=note(1:end−1,1)−note(2:end,1);
for i=n1−1:−1:1
if (com(i)>0)
m=m+1;
mark(i)=m;
k=[k,note(i,1)];
else
while(m>0 && note(i,1)<k(end))
k(end)=[];
m=m−1;
end
m=m+1;
mark(i)=m;
k=[k,note(i,1)];
end
end
else
if(n1==1)
mark=1;
end
end
deco=judgcc(L1,mark,note);
ano=deco{3};
dele=[deco{1},note1];
comple=deco{2};
L1(comple(:,3),:)=comple(:,1:2);
i=1;
remjd=[];
while(i<=n1)
j=judgct(note(i,:),note1,n0);
note1=j{2};
if(j{1})
remjd=[remjd,note(i,1)+2:note(i,2)−1];
end
i=i+1;
end
m=size(ano,1);
numc=(1:size(L1,1))’;
Lc=[L1,numc];
Lc([dele,remjd],:)=[];
numc2=(1:size(Lc,1))’;
y={};
kk=Lc(:,3);
tt=Lc(:,1:2);
for i=1:1:m
a=numc2(kk==ano(i,1));
b=numc2(kk==ano(i,2));
c=numc2(kk==ano(i,3));
d=numc2(kk==ano(i,4));
y=[y,{tt([a:b,c:d],:)}];
Lc([a:b,c:d],:)=[];
end
tt=Lc(:,1:2);
y=[y,{tt}];
for i=1:1:length(y)
m=length(y{i});
if(m<=3)
y{i}=[];
elseif(m<=200)
yy=y{i};
j=1;
while (j<=m)
if(deld2(yall,yy(j,:)))
j=m+1;
y{i}=[];
end
j=j+1;
end
end
end
end
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
相关文章:

2020年亚太杯APMCM数学建模大赛A题激光标记舱口轮廓生成求解全过程文档及程序
2020年亚太杯APMCM数学建模大赛 A题 激光标记舱口轮廓生成 原题再现: 激光是20中的一项重要发明世纪,它被称为“最锋利的刀”、“最精确的尺子”和“最不寻常的光”。 激光已越来越多地应用于工业加工, 其中可以是就业在各种加工业务例如作…...
【单元测试】--工具与环境
一、单元测试工具概览 1.1 JUnit JUnit 是一个广泛用于 Java 程序开发的开源测试框架。它是单元测试的标准工具之一,用于编写和运行测试用例,以确保 Java 程序的各个组件按预期工作。以下是一些关键特点和概念,来介绍 JUnit: 注…...

基于Java的汽车维修预约管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

vscode调试container(进行rocksdb调试)+vscode比较git项目不同分支和fork的哪个分支
vscode调试container(进行rocksdb调试) 参考链接: https://blog.csdn.net/qq_29809823/article/details/128445308#t5 https://blog.csdn.net/qq_29809823/article/details/121978762#t7 使用vscode中的插件dev containners->点击左侧的…...
[python-大语言模型]从浅到深一系列学习笔记记录
整体学习路径参照:点这里 python-机器学习-深度学习-大语言模型-数据开发 面向开发者的LLM入门提示原则 面向开发者的LLM入门 学习链接: github地址:https://github.com/datawhalechina/prompt-engineering-for-developers 在线阅读地址&…...

Android 指定有线网或Wifi进行网络请求
Android 指定有线网或Wifi进行网络请求 文章目录 Android 指定有线网或Wifi进行网络请求一、前言:二、指定网络通讯测试1、 窗口命令 ping -I 网络节点 IP2、Java 代码指定特定网络通讯 三、指定特定网络的demo app 开发1、效果图:2、实际测试结果说明&a…...
消除过期的对象引用
Java虽然有自己的垃圾回收机制,但是并没有那么的智能,对于被引用的对象,就算我们已经不在使用它了,但是Java的回收机制是不会回收它们的,人们称之为“内存泄漏”。 以下为三种不同的内存泄漏场景,极其优化方案 1、只要类自己管理内存,就该警惕内存泄漏问题 例如Stack…...

【Shell】环境变量 自定义变量 特殊变量
Shell变量:环境变量 目标 1、理解什么是系统环境变量? 2、掌握常用的系统环境变量都有哪些? Shell变量的介绍 变量用于存储管理临时的数据, 这些数据都是在运行内存中的. 变量类型 系统环境变量 自定义变量 特殊符号变量 系统环境变…...
Maven 打包 jar、war 包配置
1、导出 jar 包配置 <build><finalName>weaver-customerservice-distribution-component</finalName><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></inc…...
感悟:一个小小的摄像头APP,也解决了很多BUG
本来以为,简单的测试一下就行了,应该没有几个BUG。应该是比较轻松的。 然而现实是每天干活时,都能发现几个BUG。这BUG不解决还不行。六石管理学告诉我们四大容易:说容易,看容易,看别人容易,会了…...

顺序表第三节(通讯录基础版)
目录 可以先看一遍第二节在看这个 顺序表(第二节)实现和解析-CSDN博客 1.顺序表的头文件 2.初始化通讯录 3.添加通讯录 特殊:查找对应姓名的通讯录的序号 4.删除通讯录 5.展示通讯录 6.查找通讯录 7.修改通讯录 8.销毁通讯…...
数字ID和字符串ID互相转化
对于想隐藏真实id的需求,比如想加密userId等 使用示例: * 不指定长度* AlphaIDCustom(12354); //会将数字转换为字母。* AlphaIDCustom(PpQXn7COf,true);//会将字母ID转换为对应的数字。* 指定长度* Alpha…...

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(三)
Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文描述了如何使用…...
Django CSRF Bypass
自存用 Django CSRF Bypass (CVE-2016-7401) 漏洞分析...

微信小程序 —— 会议OA项目首页布局与Mock数据交互
14天阅读挑战赛如果世界上有奇迹,那一定是努力的另一个名字。 目录 一、小程序布局 1.1 Flex布局 1.2 Flex属性 二、OA会议首页搭建 2.1 首页底部菜单 2.2 创建后端结口 2.3 Mock模拟数据 2.4 首页轮播图搭建 2.5 首页内容搭建 一、小程序布局 1.1 Flex布…...

机器学习-K-近邻(KNN)算法
目录 一 . K-近邻算法(KNN)概述 二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法(KNN)概述 K-近邻算法(KNN)是一种基本的分类算法,它通过计算数据点之间的距离来进行分类。在…...
shell_38.Linux读取脚本名
读取脚本名 (1)示例 $ cat positional0.sh #!/bin/bash # Handling the $0 command-line parameter # echo This script name is $0. exit $ $ bash positional0.sh This script name is positional0.sh. $ (2)如果使用另一个命令来运行 shell 脚本,则命令…...
面试题-React(十七):如何使用RTK进行状态管理
Redux Toolkit(RTK) 是一个强大的工具集,旨在简化和改进Redux的使用。它提供了一组工具和约定,使Redux的配置和编写更加直观和高效。 一、Redux Toolkit简介 Redux Toolkit是一个由Redux官方团队开发和维护的库,旨在…...

网络安全—自学笔记
目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类…...
Java后端开发(五)-- 对象转换工具类
为避免返回给前端的字段信息太多,在缓解前、后端通信的带宽压力的前提下,对不必要的字段的信息进行不返回时,entity层对象需要向vo层对象进行转换,同事尽量减少geetter与setter方法的编码。 1. ConvertUtils工具类 import org.slf4j.Logger; import org.slf4j.LoggerFacto…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...