找回密码
 会员注册
查看: 29|回复: 0

2024年第五届“华数杯”全国大学生数学建模竞赛B赛题解析

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64449
发表于 2024-9-2 22:40:56 | 显示全部楼层 |阅读模式
本次华数杯B题第一问是根据附件1提供的信息,设计一个与电路单元连线接口坐标相关的线长评估模型,使估计线长尽可能与对应的RSMT线长相近,并可应用于评估附件1中的总连接线长。假设附件1中的每条连线接口都有两个端点,电路单元的长和宽分别为和W这样计算出来的线长与RSMT线长差值就比较小,也比较容易计算。第二个问题:根据问题1构建的线长评估模型,结合附件1和附件2提供的信息,建立数学模型,目标为最小化总连接线长,并满足单元密度约束。请仅仅回答第二个问题,并提供详细LaTeX数学公式:根据题目的要求,应该在设计的时候同时满足两个目标,即最小化总连接线长和满足单元密度约束。因此,我们可以通过加入一个惩罚项来实现对单元密度的约束。根据题目中给出的信息,我们可以知道,单元密度的计算公式为:importnumpyasnpimportmatplotlib.pyplotasplt#导入数据data1=np.loadtxt("附件1.txt",dtype=str,delimiter=",",skiprows=1)data2=np.loadtxt("附件2.txt",dtype=int,delimiter=",",skiprows=1)#将数据转换为字典形式dic1={}dic2={}foriinrange(len(data1)):   dic1[data1[i,0]]=[int(data1[i,2]),int(data1[i,3])]foriinrange(len(data2)):   dic2[data2[i,0]]=[data2[i,1],data2[i,2],data2[i,3],data2[i,4],data2[i,5],data2[i,6]]#计算连线长度defcal_length(dic2):   length=0   forkeyindic2:       foriinrange(1,5):           ifdic2[key][i]==1:               length+=abs(dic1[key][0]-dic1[key][2*i-1])+abs(dic1[key][1]-dic1[key][2*i])   returnlength#计算单元密度defcal_density(dic1,dic2,size,grid,threshold):   num=0   foriinrange(0,size[0],grid):       forjinrange(0,size[1],grid):           forkeyindic1:               ifdic1[key][0]>=ianddic1[key][0]=janddic1[key][1]=ianddic1[key][0]=janddic1[key][1]max_density:               max_density=num   returnmax_density/(grid**2)#修正模型defrevised_model(dic1,dic2,size,grid,threshold):   #初始化温度和迭代次数   T=100   max_iter=100   #随机生成初始布局   forkeyindic1:       dic1[key][0]=np.random.randint(grid,size[0]-grid)       dic1[key][1]=np.random.randint(grid,size[1]-grid)   #计算初始布局下的总连线长度   old_length=cal_length(dic2)   #开始迭代   forkinrange(max_iter):       #随机选择一个电路单元       key=np.random.choice(list(dic1.keys()))       #随机选择一个方向       direction=np.random.choice([-1,1,-grid,grid])       #计算新布局下的总连线长度       dic1[key][0]+=direction       new_length=cal_length(dic2)       #计算温度       T=0.99*T       #判断是否接受新布局       ifnp.exp((old_length-new_length)/T)>np.random.rand():           old_length=new_length       else:           dic1[key][0]-=direction   #计算最终布局下的总连线长度   new_length=cal_length(dic2)   returndic1,new_length#计算平均布线密度defcal_avg_density(dic1,dic2,size,grid):   num=0   foriinrange(0,size[0],grid):       forjinrange(0,size[1],grid):           forkeyindic1:               ifdic1[key][0]>=ianddic1[key][0]=janddic1[key][1]np.random.rand()andnew_max_density=iandnew_dic1[key][0]=jandnew_dic1[key][1]=ianddic1[key][0]=janddic1[key][1]=ianddic1[key][0]=janddic1[key][1]max_density:               max_density=num   returnmax_density/(grid**2)#修正模型defrevised_model(dic1,dic2,size,grid,threshold):   #初始化温度和迭代次数   T=100   max_iter=100   #随机生成初始布局   forkeyindic1:       dic1[key][0]=np.random.randint(grid,size[0]-grid)       dic1[key][1]=np.random.randint(grid,size[1]-grid)   #计算初始布局下的总连线长度   old_length=cal_length(dic2)   #开始迭代   forkinrange(max_iter):       #随机选择一个电路单元       key=np.random.choice(list(dic1.keys()))       #随机选择一个方向       direction=np.random.choice([-1,1,-grid,grid])       #计算新布局下的总连线长度       dic1[key][0]+=direction       new_length=cal_length(dic2)       #计算温度       T=0.99*T       #判断是否接受新布局       ifnp.exp((old_length-new_length)/T)>np.random.rand():           old_length=new_length       else:           dic1[key][0]-=direction   #计算最终布局下的总连线长度   new_length=cal_length(dic2)   returndic1,new_length#计算平均布线密度defcal_avg_density(dic1,dic2,size,grid):   num=0   foriinrange(0,size[0],grid):       forjinrange(0,size[1],grid):           forkeyindic1:               ifdic1[key][0]>=ianddic1[key][0]=janddic1[key][1]np.random.rand()andnew_max_density=iandnew_dic1[key][0]=jandnew_dic1[key][1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 23:57 , Processed in 0.783166 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表