2020 年アメリカ大学モデリング数学コンテスト D 質問チーム戦略、問題解決プロセスの文書と手順

2020 年アメリカ大学モデリング数学コンテスト

質問Dチームの戦略

原題の転載:

  社会の相互接続が進むにつれて、社会が直面する一連の課題はより複雑になります。私たちは、最も困難な問題の多くを解決するために、多様な専門知識と視点を備えた学際的なチームに依存しています。過去 50 年以上にわたって、チームの成功に関する概念的な理解は劇的に進歩し、より優れた科学的、革新的、または物理的なチームがこれらの複雑な問題に取り組むことができるようになりました。研究者たちは、チームを形成するための最良の戦略、チームメンバー間の最良の相互作用、および理想的なリーダーシップのスタイルについて報告しています。部門やドメインを超えた強力なチームは、個人の努力やチームメンバーの一連の追加貢献によっては達成できない複雑なタスクを実行できます。
  チーム プロセスを探索するための最も有益な設定の 1 つは、競争の激しいチーム スポーツです。チームスポーツには、プレーヤーの数、役割、プレーヤー間で許可される接触、位置と動き、獲得ポイント、違反の結果などを含むがこれらに限定されない厳格なルールが適用されます。チームの成功は個人の能力の合計以上のものです。代わりに、チームメイトがどのように一緒にプレイするかに関連する他の多くの要因に基づいています。これらの要因には、チームが複数のスキルを持っているかどうか (ある人は速く、別の人は正確である場合があります)、チームが個人と全体のパフォーマンスのバランスがどの程度取れているか (スター選手はチームメイト全員のスキルを活用するのに役立つ場合があります)、一定期間にわたって効果的に連携するチームの能力(あるプレーヤーが相手からボールを​​奪うと、別のプレーヤーが攻撃の準備をする)。
  あなたのモデリング スキルに基づいて、あなたの地元のサッカー チーム (ヨーロッパなどで知られている) のコーチである Team Huskies が、チームのダイナミクスを理解するためにあなたの会社である Intrepid Champion Modeling (ICM) に依頼しました。特に、コーチでは、フィールド上のプレーヤー間の複雑な相互作用が成功にどのように影響するかを調査できます。私たちの目標は、得点に直接つながる相互作用を研究することだけではなく、試合やシーズンを通してチームのダイナミクスを調査し、来シーズンのチームワークを改善できる具体的な戦略を特定するのに役立つことです。コーチは ICM に、チームの成功 (および失敗) の構造的および動的特性を定量化して形式化するよう依頼します。ハスキーズは、19の対戦相手(各2試合)との38試合を含む昨シーズンの詳細を提供した。合計すると、データは 366 人のプレーヤー (ハスキーズのプレーヤー 30 人、敵対プレーヤー 336 人) 間の 23,429 のパスと 59,271 の試合イベントをカバーしています。
  ハスキーコーチの要求に応えて、ICM のチームは提供されたデータを使用して次の問題を解決する必要があります。
  プレーヤー間のパスのネットワークを作成します。各プレーヤーはノードであり、各パスはプレーヤー間のリンクを構成します。転送ネットワークを使用して、二元構造、三元構造、チーム編成などのネットワーク パターンを特定します。また、他の構造指標やオリンピック全体のネットワーク特性も考慮してください。ミクロ (ペア) からマクロ (全プレイヤー) のインタラクションや、短期 (分から分) から長期 (ゲーム全体またはシーズン全体) などの時間など、複数のスケールを検討する必要がありますが、これらに限定されません。
  ゲームタイプの多様性、プレーヤー間の調整、貢献度の配分など、成功したチームワークを反映するパフォーマンス指標を (ポイントや勝利に加えて) 特定します。適応性、柔軟性、リズム、フローなど、他のチームレベルのプロセスを考慮することもできます。戦略が普遍的に有効なのか、それとも相手の対抗戦略に依存するのかを明確にすることが重要かもしれません。特定したパフォーマンス指標とチームレベルのプロセスを使用して、チームワークの構造、構成、および動的な側面を捉えるモデルを作成します

  チームワーク モデルから得られた洞察を使用して、ハスキー犬にとってどのような構造戦略が効果的であるかをコーチに知らせます。ネットワーク分析により、チームの成功を向上させるために来シーズンにどのような変更を加える必要があるかがわかるとコーチに伝えてください

  ハスキー犬の分析により、チーム スポーツの管理された環境におけるグループのダイナミクスを考慮することができます。一部のグループが他のグループよりも優れたパフォーマンスを発揮する一連の複雑な要因を理解することは、社会がどのように発展し、革新されるかにとって非常に重要です。私たちの社会では、チームが関与する問題がますます解決されていますが、より効果的なチームを設計する方法を説明するために、調査結果を一般化できますか? チームパフォーマンスの一般的なモデルを作成するには、チームワークの他のどのような側面を理解する必要がありますか?

ソリューションプロセス全体の概要 (要約)

  サッカーの試合でのチームの行動を記述するために、方向性のない加重パス ネットワークを作成します。パッシング ネットワークでは、ノードはゲームに参加しているプレーヤーであり、エッジの重みはこれら 2 人のプレーヤー間のパスの数に等しくなります。構築したネットワークに基づいて、いくつかのネットワークパターンを特定することに成功しました。さらに、ネットワークを特徴付けるためにいくつかの定量的な指標を考慮します。短期特性を捉えるために、基本モデルを l パス ネットワークに変更し、構造指標の進化を研究します。季節全体の長期的な特性を捉えるために、有向重み付きネットワーク モデルとみなすことができるマルコフ連鎖モデルを提案します。
  チームワークの成功を評価するために、私たちはパフォーマンス指標を考案しました。この指標は、構造指標、構成指標、時空指標の 3 つの指標で構成されます。統計的な χ2 検定により、指標が有益であることが確認されました。次に、各試合の指標を計算し、ハスキーズが勝った理由、負けた理由を分析します。さらに、感度分析を実行して、パフォーマンス測定が堅牢であることを実証しました。
  これらの指標に基づいて、将来のチームワークを向上させる方法に関する推奨事項をハスキー犬に提供しました。3人の異なるコーチに対して、私たちは異なるアドバイスをしました。また、ハスキーズのホームゲームとアウェイゲームでパフォーマンスが異なることもわかりました。したがって、ホームゲームとアウェイゲームについていくつかの提案を提供します。
  最後に、これらの方法を他のチームのアクティビティに一般化する方法について説明します。これらの方法は、バスケットボールやバレーボールなどのスポーツには拡張可能ですが、カーリングや体操などの他のスポーツには拡張できないと考えています。野球を例として、バスケットボールの試合の特性にモデルを適応させる方法を示します。さらに、これらの手法を社会活動全般に応用できる可能性を検討しました。

モデルの仮定:

  私たちのモデルは、イベント時間、プレーヤーが参加するすべてのアクティビティ、プレーヤー間の調整などを含む、記録されたすべてのデータが正確であるという前提に依存しています。
  この仮定は実際には測定誤差のため制限的すぎるかもしれませんが、記録には偏りがないと仮定することで緩和できます。
  試合中に起こった重要な出来事はすべて記録され、見逃されるものは何もありませんでした。さらに、記録されているすべての出来事は実際に起こったものです。
  天候、サッカー場の状況などの外部要因の影響は無視できます。
  ゲームは公平です。つまり、審判は参加チームに対して個人的な判断を下しません。
  選手の身体機能、健康状態、感情状態は試合中に大きく変化しませんでした。
  ハスキーズはシーズンを通して同じレベルのチームの結束力を維持しました。

質問の再説明:

  プレーヤー間の受け渡し用のネットワークを作成し、受け渡しネットワークを使用してネットワーク パターンを特定します。他の構造指標とネットワークのプロパティを考慮してください。短期的および長期的なダイナミクスについて話し合います。
  成功したチームワークを反映するパフォーマンス指標を特定します。これらの戦略が一般的に効果的であるか、それとも相手の対抗戦略に依存するかを特定します。パフォーマンス メトリクスを使用して、チームワークの構造、構成、および動的な側面を捉えるモデルを作成します。
  ネットワーク分析に基づいて、チームの成功を向上させるためにコーチが来シーズンに行うべき変更を提案します。
  調査結果とモデルを他のチームの活動にどのように一般化できるかについて話し合います。

モデルの確立と解決策 論文全体のサムネイル

ここに画像の説明を挿入
ここに画像の説明を挿入

すべての論文については、以下の「QQ 名刺のモデリングのみ」を参照してください。 QQ 名刺をクリックしてください

プログラム コードの一部: (コードとドキュメントは無料ではありません)

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