2019第十二届“认证杯”数学建模(第二阶段)

刚开始第二阶段了吧,因为一些事情没去参加第二阶段。这里就给大家提供一些思路吧。

这道题看着像是在第一阶段上的深入,实际上方法都一样的。我们先分析一遍论文吧。

论文分析

首先第一句话的文本获取,不用多说,编程直接和第一阶段一样,随机生成(C/C++,MATLAB等等百度随机数生成,个人用的分布引擎,然后写入文档,30段随机文本就生成了)。

OK,后面的我们提取一下要求:

  1. 片段长度15
  2. 错误发生概率1/5
  3. 插入,替换,删失
  4. 每个错误只涉及一个字符

敲黑板了,“造”数据,先造出符合上面第一个要求的片段,发生次数和片段个数自己控制好。接着,让第三个要求的概率为1/5左右,涉及一个字符。这里,我们结果就出来了。

 

首先每个字符的错误为1/5左右,那么长度为15的片段,每个错误出现的长度为3左右。我们可以将错误分成插入错误,替换错误,删失错误分别进行处理,再进行对比,找出的相同字符串就是我们需要的字符串。

在进行对比时,我们可以引入一个“标记m”,记录两个字符片段进行对比时。当字符不同时,m++,下一个在不同m++,在此期间,我们需要进行判断m是否大于我们设定的一个数n(3左右),可以称为容错数n,若大于,我们进行下一个字符串比较,若小于继续进行这个字符串下一个字符的比较,当字符再次相同时,m=0重新记录。

 

至于下面说的,不知道长度怎么办?那长度未知,首先我们要进行分析,尽量的缩短长度的范围,再者对算法的遍历方法进行改进,具体方法是使用某个算法,自己选择,减少遍历次数,你们组的编程肯定知道的。

 

模型介绍

 

第一个模型(算法模型)

找到几种算法,进行分析+比较搜索效率,找到当前最优算法

在对于三种错误进行筛选时,我们需要对每种错误进行调整,使得我们的结果更加准确,假设下面的错误都发生在子串当中。我举例错误只举了一次错误,实际不止,方法相同。

1.删失错误

这时候,子串和预期答案,必定少了一个,当我们进行字符对比时,遇到删失错误的位置,我们的子串比较字符位置不变,母串比较字符向后移动一位,再进行对比,且m++,因为子串少了一位,所以子串最后一位实际没有参加对比,这一位的不同我们不计入m。

 

2.替换错误

发生这种错误时,子串和母串的长度是不变的,因此我们只需要记录标记m,进行判断就行。

 

3.插入错误

这种错误相当于,子串多了一位,这时候,在遇到发生插入错位位置的时候,我们将子串比较字符向后移动一位,m++。这种错误,以子串为主,相当于子串少了一位,因此我们可以将母串的最后一位arr[i]和子串的brr[i+1],子串相当于增加了一位进行比较,需要计入m。

 

 把这个问题分成三个部分解决,每个“错误”筛选出的片段,总的实际上就是我们所需要的片段。也就是,已知三个集合,求这三个集合的并集,但这中间肯定存在误差,搜索的字符串比我们实际的要多,这个问题可以放到优化模型中提出。

第二个模型(优化模型)

 实际上我们需要优化的地方就是,我们在分别筛选时,筛选的字符串肯定比实际的多,就算比较之后选出相同的,实际筛选出的也会多,这里优化的就是提高我们三种方法搜索准确率或者对比时如何处理。在这里如果会的话,可以加入一个筛选的模型。

 

注意:如果大家写不出代码,那就一定流程图写好,写清楚,算法别搞花里胡哨,能解决问题就行。

 

至于具体如何填充论文,还有代码,就要靠各位自己加油了。有问题的话评论留言,这几天我都会看。

后面有补充的话,我都会放到这篇博客上。

 

2019/5/18 14:17 更新几种错误的处理方法和第二问的未知长度的方法等

2019/5/18 17:17 更新了三种错误解决后的处理方法。(在明天会给大家说一些这篇论文中应该着重注意的地方,大家注意关注。

觉得博客有帮助的朋友可以给博主点个赞,对建模感兴趣的朋友可以关注一下博主,你们的支持就是我最大的动力!

posted @ 2019-05-17 22:56  Hk_Mayfly  阅读(1168)  评论(2编辑  收藏