2021深圳杯d题数学建模 基于一个微分对策问题的机器学习能力定量评价

基于一个微分对策问题的机器学习能力定量评价

由于用机器学习方法求解诸如最优控制、微分对策这样具有连续动作和状态的问题时,效率(效果/算力)较低,特殊的微分对策问题将是测试机器学习方法的竞争案例。

一个古老的羊-犬博弈问题:羊在半径为 R 的圆形圈内具有定常速率 v 和满足以下限制的任意转弯能力:逃逸路径上每一点与圆心的距离随时间单调不减。羊逃出圆形圈则胜。犬沿着圆周以定常速率 V 围堵以防止羊逃逸,任何时刻具有选择圆周的两个方向之一的能力。
任务:

  1. 通过运动学精确建模求解犬的最优围堵策略;
  2. 假设犬以最优策略围堵,基于精确建模求解羊可以逃逸胜出
    的条件;
  3. 假设羊理解自己的能力、限制和躲避犬围堵而逃逸的目标,
    但不具备基于运动学的最优化决策知识,假设 2 中羊可以逃
    逸的条件被满足,给出一种机器学习方法,使得羊通过学习
    训练后实现逃逸;
  4. 设计一套评价体系,定量评价 3 中给出的机器学习方法的学
    习能力;
  5. 提出并定量评价更多的羊逃逸机器学习方法

问题分析:

  对于问题一,通过对犬的运动进行分析,可以将其看作匀速圆周运动,对于羊,可以看作原理圆心的运动。通过对比羊犬的速度与场地半径之间的关系,分别建立犬的圆周运动微分方程以及羊的随机运动微分方程,通过羊全的运动范围确定犬的最优围堵方案。(需要列出具体的方程求解)。
  对于问题二,在问题一的条件下,结合羊犬的运动进行分析,分析极限情况下羊被犬抓住的概率,由此确定羊在犬的最优化策略下的胜出条件。
对于问题三,通过对羊的运动轨迹进行分析,结合犬对于羊的限制条件,结合问题一与问题二中的条件,结合随机森林算法对羊的路线进行分析,以羊的运动轨迹坐标作为数据集,建立随机森林模型,使用matlab进行求解,最终得到羊通过训练后实现逃逸的路线。
对于问题四,对羊逃逸学习的随机森林模型进行分析,对羊的运动轨迹、犬的限制以及数据集选取(随机森林模型选取部分数据进行学习)进行分析,采用模糊综合评价分析不同影响因素的判断矩阵,结合matlab得到不同影响因素的权重。并通过影响因素自身的得分得到最终的评价。
对于问题五,通过最优化模型对羊犬博弈问题进行分析,结合问题四建立的模糊综合评价模型进行评价,得到不同的机器学习方法定量评价。对比不同的评价方法,得到适合本文的评价方法。

模型的求解

通过对羊的运动轨迹进行分析,结合犬对于羊的限制条件,结合问题一与问题二中的条件,结合随机森林算法对羊的路线进行分析,以羊的运动轨迹坐标作为数据集,建立随机森林模型,使用 matlab 进行求解,最终得到羊通过训练后实现逃逸的路线。

2021深圳杯d题数学建模 基于一个微分对策问题的机器学习能力定量评价_第1张图片

部分程序如下所示:

#构造data子集及机器学习框架
'''遇到问题没人解答?小编QQ:917267119'''
import pandas as pd
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston
boston_house = load_boston()
boston_feature_name = boston_house.feature_names
boston_features = boston_house.data
boston_target = boston_house.target
rgs = RandomForestRegressor(n_estimators=15)  ##随机森林模型
rgs = rgs.fit(boston_features, boston_target)
rgs.predict(boston_features)
from sklearn import tree
rgs2 = tree.DecisionTreeRegressor()           ##决策树模型,比较两个模型的预测结果!
rgs2.fit(boston_features, boston_target)
rgs2.predict(boston_features)
#构造data子集
def get_subsample(dataSet,ratio):
    subdataSet=[]
    lenSubdata=round(len(dataSet)*ratio)
    while len(subdataSet) < lenSubdata:
        index=randrange(len(dataSet)-1)
        subdataSet.append(dataSet[index])
    #print len(subdataSet)
    return subdataSet
 
#选取任意的n个特征,在这n个特征中,选取分割时的最优特征
def get_best_spilt(dataSet,n_features):
    features=[]
    class_values=list(set(row[-1] for row in dataSet))
    b_index,b_value,b_loss,b_left,b_right=999,999,999,None,None
    while len(features) < n_features:
        index=randrange(len(dataSet[0])-1)
        if index not in features:
            features.append(index)
    #print 'features:',features
    for index in features:
        for row in dataSet:
            left,right=data_spilt(dataSet,index,row[index])
            loss=spilt_loss(left,right,class_values)
            if loss < b_loss:
                b_index,b_value,b_loss,b_left,b_right=index,row[index],loss,left,right
    #print b_loss
    #print type(b_index)
    return {'index':b_index,'value':b_value,'left':b_left,'right':b_right}

你可能感兴趣的:(深圳杯数学建模,python)