2022年江西省研究生数学建模竞赛冰壶运动求解全过程文档及程序

发布于:2022-12-10 ⋅ 阅读:(731) ⋅ 点赞:(0)

2022年江西省研究生数学建模竞赛

冰壶运动

原题再现:

  2022年2月4日至20日我国成功举办了北京冬季奥运会,北京成为全球首个举办过夏季奥运会和冬季奥运会的“双奥之城”。北京冬奥会共设置了7个大项,15个分项,109个小项,其中冰壶运动由于其趣味性,观赏性,技术性和协作性成为广受欢迎和关注的一个项目。冰壶是一种冰上投掷性运动项目,它起源于14世纪的苏格兰,1924年作为表演项目被纳入第一届冬奥会,1998年被列为冬奥会的正式比赛项目。
  冰壶由三个部分组成:壶体、手柄和螺栓。冰壶圆周约为91.44厘米,高度约为11.43厘米,质量约为19.96千克。比赛的标准场地长44.5米,宽4.32米,其中一端为本垒,画有一个直径为1.83米的圆作为球员的发球区;另一端为营垒,由4个直径分别为0.15米、0.61米、1.22米和1.83米的同心圆组成。场地前后两端各有一条蓝色的实线,分别称为前卫线和后卫线。冰壶掷出后,如果未通过前卫线或者超过后卫线都视作无效,将被清出场外。
  每场比赛两队参加,各派4个队员上场,分为一垒、二垒、三垒、四垒,按顺序依次交叉投壶,每局16壶,共进行10局。一名队员投壶时,本队两名同伴可以在冰壶滑行前方用冰刷快速擦刷冰面,以控制冰壶的前进方向和速度。投壶方在力求将冰壶滑向圆心的同时,也可用冰壶将对方的冰壶撞出营垒或将场上本方的冰壶撞向营垒圆心。冰壶越过圆心线后,双方仅有一名队员可为己方的冰壶刷冰,且仅有主将可为对方的冰壶刷冰,以破坏对方战术。
  请建立数学模型,完成以下任务:
  问题1 :在不刷冰的情况下,分别采取何种策略,实现以下目标:
  (1)当营垒中没有冰壶时,使得冰壶停在营垒中。
  (2)当营垒中有一个对方的冰壶时,将对方的冰壶撞出营垒,自己的冰壶停在营垒中。
  (3)当营垒中有一个对方的冰壶时,将对方的冰壶撞出营垒,同时自己的冰壶一起出营垒。
  (4)当营垒中有两个对方的冰壶时,将对方的两个冰壶都撞出营垒,自己停在营垒中。
  (5)当营垒中有对方的冰壶,也有己方的冰壶时,将对方的冰壶撞出营垒,而己方的冰壶仍留在营垒中。
  问题2:考虑刷冰的情况,回答问题1中的几个问题。
  问题3:如果营垒前方已有冰壶,重新研究问题1和问题2。

问题背景:

  冰壶(Curling)被誉为“冰上的国际象棋”, 起源于 16 世纪的苏格兰冰上投掷性运动, 迄今为止有约 500 年的历史, 由于其趣味性, 观赏性, 技术性和协作性成为本次北京冬季奥运会广受欢迎和关注的一个项目。

模型的建立与求解:

  问题1要求在不考虑刷冰的情况下,确定能够实现问题中多个目标的扔壶策略。为了描述卷曲的运动轨迹,建立了卷曲的进动模型、碰撞模型和均匀减速模型。然后,将问题中描述的情况分为多种投手投掷技术,并假设情况与问题描述相符。求解了假设条件下投手投掷的卷曲运动轨迹和初始位置、速度和角速度,并在四至五个问题中对投手投球位置进行了优化,使策略更加合理。

非旋转匀减速直线模型

  当赛道中没有其他冰壶运动时,考虑到冰壶运动没有旋转的理想情况,冰壶运动可以简化为均匀减速模型。卷曲不旋转时卷曲底部的平均摩擦系数为µa,因此卷曲运动阻力为:在这里插入图片描述

全部论文缩略图:

在这里插入图片描述

程序代码:

clc;
clear;
close all;
%% load obs
obs = load('obsdata.txt');
numofobs = length(obs(:,1));
%% set up color map for display 
cmap = [1 1 1; ...% 1 - white - 空地
        0 0 0; ...% 2 - black - 障碍 
        1 0 0; ...% 3 - red - 已搜索过的地方
        0 0 1; ...% 4 - blue - 下次搜索备选中心 
        0 1 0; ...% 5 - green - 起始点
        1 1 0];...% 6 - yellow -  到目标点的路径 
colormap(cmap); 
map = zeros(25); 
% 设置障碍
for j=1:numofobs
    xobs(j) = obs(j,1);
    yobs(j) = obs(j,2);
    map(xobs(j),yobs(j)) = 2;
end
map(1,25) = 5; % 起始点
map(25,1) = 6; % 目标点
image(1.5,1.5,map);
grid on;
axis image;
%% 
nrows = 25; 
ncols = 25; 
start_node = sub2ind(size(map), 1, 25); 
dest_node = sub2ind(size(map), 25, 1); 
% Initialize distance array 
distanceFromStart = Inf(nrows,ncols); 
distanceFromStart(start_node) = 0; 
% For each grid cell this array holds the index of its parent 
parent = zeros(nrows,ncols); 
t0=clock;
% Main Loop 
while true 
 % Draw current map 
 map(start_node) = 5; 
 map(dest_node) = 6; 
 image(1.5, 1.5, map); 
 grid on; 
 axis image; 
 drawnow; 
  % Find the node with the minimum distance 
 [min_dist, current] = min(distanceFromStart(:)); 
  if ((current == dest_node) || isinf(min_dist)) 
       break; 
  end; 

 map(current) = 3; 
 distanceFromStart(current) = Inf; 
 [i, j] = ind2sub(size(distanceFromStart), current);
 neighbor = [i-1,j;... 
            i+1,j;... 
            i,j+1;... 
            i,j-1] 
outRangetest = (neighbor(:,1)<1) + (neighbor(:,1)>nrows) +...
                   (neighbor(:,2)<1) + (neighbor(:,2)>ncols ) 
locate = find(outRangetest>0); 
neighbor(locate,:)=[] 
neighborIndex = sub2ind(size(map),neighbor(:,1),neighbor(:,2)) 
for i=1:length(neighborIndex) 
if (map(neighborIndex(i))~=2) && (map(neighborIndex(i))~=3 && map(neighborIndex(i))~= 5) 
    map(neighborIndex(i)) = 4; 
  if distanceFromStart(neighborIndex(i))> min_dist + 1      distanceFromStart(neighborIndex(i)) = min_dist+1; 
        parent(neighborIndex(i)) = current; 
  end 
 end 
end 
end
TimeCost=etime(clock,t0)
%%
if (isinf(distanceFromStart(dest_node))) 
    route = []; 
else 
    %提取路线坐标
   route = [dest_node]; 
      while (parent(route(1)) ~= 0) 
              route = [parent(route(1)), route]; 
       end 
  % 动态显示出路线     
        for k = 2:length(route) - 1 
          map(route(k)) = 7; 
                pause(0.1); 
                image(1.5, 1.5, map); 
              grid on; 
              axis image; 
              end 
end
axis off;  
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可
本文含有隐藏内容,请 开通VIP 后查看