2020年美国大学生数学建模竞赛D题团队策略解题全过程文档及程序

2020年美国大学生数学建模竞赛

D题 团队策略

原题再现:

  随着社会之间的联系越来越紧密,它们面临的一系列挑战也越来越复杂。我们依靠具有不同专业知识和不同观点的跨学科团队来解决许多最具挑战性的问题。在过去50多年里,我们对团队成功的概念性理解有了显著的进步,使得更好的科学、创新或物理团队能够解决这些复杂的问题。研究人员已经报告了组建团队的最佳策略、团队成员之间的最佳互动以及理想的领导风格。跨部门和领域的强大团队能够执行复杂的任务,无论是通过个人努力还是通过团队成员的一系列额外贡献都无法实现。
  探索团队过程的信息量最大的设置之一是在竞技团队运动中。团队运动必须遵守严格的规则,这些规则可能包括但不限于球员的数量、他们的角色、球员之间允许的接触、他们的位置和运动、获得的分数以及违规的后果。团队的成功不仅仅是个人能力的总和。相反,这是基于许多其他因素,涉及到如何发挥队友在一起。这些因素可能包括团队是否拥有多种技能(一个人可能速度快,而另一个人则精确),团队在个人和集体表现之间的平衡程度(明星球员可能有助于利用所有队友的技能),以及球队在一段时间内有效协调的能力(当一名球员从对手手中抢走球时,另一名球员准备进攻)。
  根据你的造型技巧,Huskies队,你的家乡足球队(在欧洲和其他地方被称为足球队)的教练,已经要求你的公司,无畏冠军造型(ICM),帮助了解球队的动态。特别是,教练让你去探索场上球员之间复杂的互动如何影响他们的成功。我们的目标不仅是研究直接导致得分的互动,而且是探索整个比赛和整个赛季的团队动态,帮助确定可以在下个赛季提高团队合作的具体策略。教练要求ICM量化和形式化团队成功(和失败)的结构和动态特征。Huskies队提供了上个赛季的详细资料,包括他们与19名对手的38场比赛(每队打两次)。总的来说,数据涵盖了366名球员(30名Huskies球员,336名对手球员)之间的23429次传球,以及59271个比赛项目。
  为了响应Huskie coach的请求,ICM的团队应该使用提供的数据来解决以下问题:
   为球员之间的传球创建一个网络,每个球员都是一个节点,每个传球都构成球员之间的链接。使用你的传递网络来识别网络模式,如二元和三元结构以及团队队形。同时考虑其他结构指标和整个奥运会的网络属性。你应该探索多种尺度,例如,但不限于,微观(成对)到宏观(所有玩家)的互动,以及时间,例如短(分钟到分钟)到长(整个游戏或整个赛季)。
  确定反映成功团队合作的绩效指标(除了分数或胜利),例如游戏类型的多样性、玩家之间的协调或贡献的分配。您还可以考虑其他团队级流程,例如适应性,灵活性、节奏或流动。澄清战略是否普遍有效或取决于对手的反战略可能很重要。使用您确定的绩效指标和团队级流程创建一个模型,该模型捕获团队合作
的结构、配置和动态方面。
  利用从团队合作模式中获得的洞察力,告知教练什么样的结构策略对Huskies有效。告诉教练网络分析表明他们应该在下个赛季做出哪些改变来提高球队的成功
率。
  你对Huskies的分析让你可以在团队运动的受控环境中考虑群体动力学。了解使某些群体比其他群体表现更好的一系列复杂因素,对于社会如何发展和创新至关重要。当我们的社会越来越多地解决涉及团队的问题时,你能概括一下你的发现来说明如何设计更有效的团队吗?开发团队绩效的通用模型还需要了解团队合作的哪些方面?

整体求解过程概述(摘要)

  我们创建了无向加权传球网络来描述足球比赛中的团队行为。在传球网络中,节点是参与比赛的玩家,边的权重等于这两个玩家之间的传球次数。基于构建的网络,我们成功地识别了一些网络模式。此外,我们考虑了一些定量指标来表征网络。为了捕获短期属性,我们将基本模型修改为l-pass网络,并研究结构指标的演变。为了捕捉整个季节的长期特征,我们提出了一个马尔可夫链模型,该模型可以看作是有向加权网络模型。
  为了评估团队合作的成功,我们设计了一个绩效指标。该指标由三个指标组成:结构指标、配置指标和时空指标。统计 χ2 检验证实指示符是信息丰富的。然后,我们计算每场比赛的指标,并分析哈士奇队赢或输的原因。此外,我们还进行了敏感性分析,以证明绩效指标是稳健的。
  基于这些指标,我们向哈士奇犬提供了未来如何改善团队合作的建议。对于三个不同的教练,我们给出了不同的建议。我们还发现哈士奇队在主场比赛和客场比赛中的表现不同。因此,我们提供一些针对主客场比赛的建议。
  最后,我们讨论如何将这些方法推广到其他团队活动中。我们认为,这些方法可以扩展到篮球和排球等运动,但不能用于冰壶和体操等其他运动。以棒球为例,指出如何根据篮球比赛的特点调整模型。我们进一步探讨了将这些方法应用于一般社会活动的可能性。

模型假设:

  我们的模型依赖于以下假设:
  所有记录的数据都是准确的,包括赛事时间、玩家参加的每项活动、玩家之间的协调情况等。虽然这个假设可能由于测量误差,在实践中过于严格,我们可以放宽地假设记录是公正的。
  比赛期间发生的所有重要事件都被记录下来,没有遗漏。此外,记录的所有事件都真实发生过。
  天气、足球场条件等外部因素的影响可以忽略不计。
  比赛是公平的,也就是说,裁判对任何参赛球队都没有个人判断。
  球员的生理功能、健康状况和情绪状态在游戏中没有显着变化。
  哈士奇队在赛季中保持着相同水平的团队凝聚力。

问题重述:

  为球员之间的传球创建一个网络,并使用传球网络来识别网络模式。考虑其他结构指标和网络属性。讨论短期和长期动态。
  确定反映成功团队合作的绩效指标。明确这些策略是普遍有效的还是取决于对手的反策略。使用绩效指标创建一个模型,该模型捕获团队合作的结构、配置和动态方面。
  根据网络分析,建议教练下赛季应该做出哪些改变,以提高球队的成功率。
  讨论如何将发现和模型推广到其他团队活动。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.patches as mpathes
def InitG(data):
 G = nx.DiGraph()
 ET = np.array(data['EventTime'])
 i=0
 while(ET[i] < 900):
 i+=1
 length = i #未来的 front
 
 Weight = np.ones(length, dtype=int)
 Ori = np.array(data['OriginPlayerID'])
 Des = np.array(data['DestinationPlayerID'])
 for j in range(0,length):
 if(G.has_node(Ori[j])&(G.has_node(Des[j]))):
 if(G.has_edge(Ori[j],Des[j])):
 G[Ori[j]][Des[j]]['weight']+=1
 else:
 G.add_edge(Ori[j],Des[j],weight=Weight[j])
 else:
 G.add_edge(Ori[j],Des[j],weight=Weight[j]) #边的起点,终点,权重
# #pos = nx.circular_layout(G)
# #print(G.edges(data=True))
# 
#nx.draw_networkx_edges(G,pos,with_labels=True,edge_color='black',alpha=1,font_size=10,width=
[float(v['weight']*0.5) for (r,c,v) in G.edges(data=True)])
# #nx.draw_networkx_nodes(G,pos,with_labels=True)
# nx.draw(G,pos,alpha = 0.8,with_labels=True,font_size=10,width=[float(v['weight']*1) for 
(r,c,v) in G.edges(data=True)])
# plt.show()
 data = data[(data['MatchPeriod']=='1H')]
return G,length,np.array(data['EventTime'])[len(data['EventTime'])-1]
def Calc1(String1,String2,MatchID):
 data = pd.read_excel('gogofootball.xlsx',sheet_name='Sheet1')
 data = data[(data['TeamID']==String1)&(data['MatchID']==MatchID)]
 G,edgeNum,last1H = InitG(data)
 # 时间数据处理
 data['EventTime'][(data['MatchPeriod']=='2H')]+=last1H
 front = edgeNum # 前指针
 rear =0 # 后指针
 zongchang = len(data['TeamID'])
 #Degree = [] # 图的密度
 #Clustering = [] # 图或网络中节点的聚类系数
 Transitivity = [] # 图或网络的传递性
 T1 = [] # 时间轴
 Triangles = []
 Triads = []
 Anc = []
 
 ET = np.array(data['EventTime'])
 Ori = np.array(data['OriginPlayerID'])
 Des = np.array(data['DestinationPlayerID'])
 while(front<zongchang):
 t = ET[front]
 T1.append(t)
 # 删东西
 while(ET[front] - ET[rear] > 900):
 if(ET[front] - ET[rear] < 900):
 break
 if(G[Ori[rear]][Des[rear]]['weight']>1):
 G[Ori[rear]][Des[rear]]['weight']-=1
 else:
 G.remove_edge(Ori[rear],Des[rear])
 if(G.degree(Ori[rear])==0): G.remove_node(Ori[rear])
 if(G.degree(Des[rear])==0): G.remove_node(Des[rear])
 rear+=1
 # 加东西
 if(G.has_node(Ori[front])&(G.has_node(Des[front]))):
 if(G.has_edge(Ori[front],Des[front])):
 G[Ori[front]][Des[front]]['weight']+=1
 else:
 G.add_edge(Ori[front],Des[front],weight=1)
 else:
 G.add_edge(Ori[front],Des[front],weight=1)
# 计算并附加
 #Degree.append(nx.degree(G))
 #Clustering.append(nx.clustering(G))
 
 
# tri = np.sum(list(nx.triangles(G).values()))/3
# triads = (tri*3)/nx.transitivity(G)
# Transitivity.append(tri + triads)
 
 Anc.append(nx.average_node_connectivity(G))
 # 步长
 front+=1
# return T1,Transitivity
return T1,Anc
def Calc2(String1,String2,MatchID):
 data = pd.read_excel('gogofootball.xlsx',sheet_name='Sheet1')
 data = data[(data['TeamID']==String2)&(data['MatchID']==MatchID)]
 G,edgeNum,last1H = InitG(data)
 # 时间数据处理
 data['EventTime'][(data['MatchPeriod']=='2H')]+=last1H
 front = edgeNum # 前指针
 rear =0 # 后指针
 zongchang = len(data['TeamID'])
# Degree = [] # 图的密度
# Clustering = [] # 图或网络中节点的聚类系数
 Transitivity2 = [] # 图或网络的传递性
 T2 = [] # 时间轴
 Triangles = []
 Triads = []
 Anc = []
 ET = np.array(data['EventTime'])
 Ori = np.array(data['OriginPlayerID'])
 Des = np.array(data['DestinationPlayerID'])
 while(front<zongchang):
 t = ET[front]
 T2.append(t)
 # 删东西
 while(ET[front] - ET[rear] > 900):
 if(ET[front] - ET[rear] < 900):
 break
 if(G[Ori[rear]][Des[rear]]['weight']>1):
 G[Ori[rear]][Des[rear]]['weight']-=1
 else:
 G.remove_edge(Ori[rear],Des[rear])
 if(G.degree(Ori[rear])==0): G.remove_node(Ori[rear])
 if(G.degree(Des[rear])==0): G.remove_node(Des[rear])
 rear+=1
 # 加东西
 if(G.has_node(Ori[front])&(G.has_node(Des[front]))):
 if(G.has_edge(Ori[front],Des[front])):
 G[Ori[front]][Des[front]]['weight']+=1
 else:
 G.add_edge(Ori[front],Des[front],weight=1)
 else:
 G.add_edge(Ori[front],Des[front],weight=1)
 # 计算并附加
 #Degree.append(nx.degree(G))
 #Clustering.append(nx.clustering(G))
 
 
# tri = np.sum(list(nx.triangles(G).values()))/3
# triads = (tri*3)/nx.transitivity(G)
# Transitivity2.append(tri + triads)
 
 
 Anc.append(nx.average_node_connectivity(G))
 # 步长
 front+=1
# return T2,Transitivity2
return T2,Anc
def Calc(String1,String2,MatchID):
# T1,Transitivity = Calc1(String1,String2,MatchID)
# T2,Transitivity2 = Calc2(String1,String2,MatchID)
 T1,Anc1 = Calc1(String1,String2,MatchID)
 T2,Anc2 = Calc2(String1,String2,MatchID)
# return T1,T2,Transitivity,Transitivity2
return T1,T2,Anc1,Anc2
# Main Program
String1 = 'Huskies'
String2 = 'Opponent18'
MatchID = 18
#T1,T2,Transitivity,Transitivity2 = Calc(String1,String2,MatchID)
T1,T2,Anc1,Anc2 = Calc(String1,String2,MatchID)
plt.figure(figsize=(15, 6))
# 线条颜色 black, 线宽 2, 标记大小 13, 标记填充颜色从网上找 16 进制好看的颜色
plt.plot(T1, Anc1, '-o', color='black', markersize=13, markerfacecolor='#44cef6', linewidth=2, 
label=String1)
# plt.plot(T2, Anc2, '-o', color='black', markersize=13, markerfacecolor='#e29c45', linewidth=2, 
label=String2)
plt.plot(T2, Anc2, '-o', color='black', markersize=13, markerfacecolor='#9cef43', linewidth=2, 
label=String2)
font = {
    
    'family': 'Times New Roman', 'weight': 'normal', 'size': 15}
plt.legend(prop=font)
# 字体设置: 字体名称 Times New Roman, 字体大小 34
font_format = {
    
    'family':'Times New Roman', 'size':25}
plt.xlabel('Time (s)', font_format)
#plt.ylabel('Transitivity', font_format)
plt.ylabel('Average Node Connectivity', font_format)
# 设置坐标轴 x 范围 0~3*pi, y 范围-1.2~1.2
#plt.axis([0, 3*np.pi, -1.2, 1.2])
# 横纵坐标上的字体大小与类型(不是 xlabel, 是 xticks)
plt.xticks(fontproperties='Times New Roman', size=25)
plt.yticks(fontproperties='Times New Roman', size=25)
# 整个图像与展示框的相对位置
plt.subplots_adjust(left=0.19,right=0.94, bottom=0.13)
# 调整上下左右四个边框的线宽为 2
ax=plt.gca()
ax.spines['bottom'].set_linewidth(2)
ax.spines['left'].set_linewidth(2)
ax.spines['right'].set_linewidth(2)
ax.spines['top'].set_linewidth(2)
# rect1 = mpathes.Rectangle((1550,0),700,400,color='wheat')
# ax.add_patch(rect1)
# # plt.text(1800,350,'Opponent4’s highlight 
performance',fontsize=15,verticalalignment="center",horizontalalignment="center")
# rect2 = mpathes.Rectangle((4000,0),1300,400,color='wheat')
# ax.add_patch(rect2)
# rect1 = mpathes.Rectangle((1750,0),300,3.1,color='lightgreen')
# ax.add_patch(rect1)
# rect2 = mpathes.Rectangle((2900,0),500,3.1,color='lightblue')
# ax.add_patch(rect2)
# rect3 = mpathes.Rectangle((3400,0),400,3.1,color='lightgreen')
# ax.add_patch(rect3)
# rect4 = mpathes.Rectangle((3800,0),200,3.1,color='lightblue')
# ax.add_patch(rect4)
# rect5 = mpathes.Rectangle((5200,0),550,3.1,color='lightblue')
# ax.add_patch(rect5)
plt.show()
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

猜你喜欢

转载自blog.csdn.net/weixin_43292788/article/details/131823495