书接上文,这个事得分析哪些机器学习方法可以使用。
首先是最常见的监督学习,我需要收集训练数据,优化模型参数。更重要的是,得手写一个训练框架和识别框架。毕竟是专用场景,真要应用就得上。虽然说可以做一些数据接口把数据接出来,然后用成熟的框架来学习,但是以后识别的过程也要用外部服务,挺麻烦,不利推广。
数据:入射速度,出射速度
标签:球拍速度,球拍角度
然后是最近比较火的强化学习,我专门去查了一些资料,主要有三个模块,状态编码,行为决策,观察反馈。不需要训练数据,所有的训练过程都是模型根据决策后的反馈来学习的。但是行为和反馈需要时间,我不确定学习出效果需要多久。还有学习到的东西怎么存储我没看懂,是存一个状态和正确决策的对应表吗?那状态空间爆炸的时候是不是就惨了。
根据我的经验,这个场景用强化学习比较合适,
状态:入射速度,预期出射速度
决策:球拍速度,球拍角度。
反馈:实际出射速度与预期出射速度的差。
我看看能不能尽量都做一做,也是自己学习。
接下来可能更的比较慢甚至断更了。主要现在把好好的技术问题转化成学术问题了,怕劝退好多人。
先列一些学习资料,看看能不能有简单好理解的办法。
https://baike.baidu.com/item/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/2971075?fr=aladdin
https://www.cnblogs.com/jsfantasy/p/12177216.html
https://blog.csdn.net/CaiDaoqing/article/details/92969238
https://blog.csdn.net/qq_39388410/article/details/88795124
-----------------------分割线,以下内容没有用------------------------------------------------------
突然想到如果真的建立一张状态决策表的话,先不考虑状态空间问题,难度会小很多。ps:学术问题拉回到技术问题
先顺手写一个范围试试
入射速度取值范围,x(-100,100),y(-100,100),z(0,100),取整,步长为1
出射速度取值范围,x(-100,100),y(-100,100),z(0,100),取整,步长为1
决策取值范围,vx(-100,100),vy(-100,100),vz(-100,100),取整,步长为1
dx(-90,90),dy(-90,90),dz(0,0),取整,步长为1
把所有状态和决策跑一遍自然得到入射速度和决策与出射速度的对应关系。
组合数量(200*200*100)*(200*200*200*180*180)=1,036,800,000,000,000,000
还是算了吧
实测一个合理范围,再试试
Debug.Log( calcLine(1, 0.5f, 1.5f, 1, 0, -0.1f, 0.3f));
Debug.Log(calcLine(1, 0.5f, 1.5f, 0, 0, -1.5f, 0.3f));
Debug.Log(calcLine(1, 0.5f, 1.5f, -1, 0, -1.5f, 0.3f));
Debug.Log(calcLine(1, 0.5f, 1.5f, 1, 0, -0.1f, 1f));
Debug.Log(calcLine(1, 0.5f, 1.5f, 0, 0, -1.5f, 2f));
Debug.Log(calcLine(1, 0.5f, 1.5f, -1, 0, -1.5f, 2f));
Debug.Log(calcSpeed(0.2f, 0.0025f, Vector3.zero,calcLine(1, 0.5f, 1.5f, 1, 0, -0.1f, 0.3f)));
Debug.Log(calcSpeed(0.2f, 0.0025f, Vector3.zero, calcLine(1, 0.5f, 1.5f, 0, 0, -1.5f, 0.3f)));
Debug.Log(calcSpeed(0.2f, 0.0025f, Vector3.zero, calcLine(1, 0.5f, 1.5f, -1, 0, -1.5f, 0.3f)));
Debug.Log(calcSpeed(0.2f, 0.0025f, Vector3.zero, calcLine(1, 0.5f, 1.5f, 1, 0, -0.1f, 1f)));
Debug.Log(calcSpeed(0.2f, 0.0025f, Vector3.zero, calcLine(1, 0.5f, 1.5f, 0, 0, -1.5f, 2f)));
Debug.Log(calcSpeed(0.2f, 0.0025f, Vector3.zero, calcLine(1, 0.5f, 1.5f, -1, 0, -1.5f, 2f)));
(0.0, 5.3, 1.5)
(1.4, 3.5, 4.2)
(2.8, 3.5, 4.2)
(0.0, 9.3, 0.8)
(0.8, 6.3, 2.3)
(1.6, 6.3, 2.3)
(0.0, 2.7, 0.8)
(0.7, 1.8, 2.1)
(1.4, 1.8, 2.1)
(0.0, 4.7, 0.4)
(0.4, 3.2, 1.2)
(0.8, 3.2, 1.2)
速度(不分出入)取值范围,x(-2.8,2.8),y(0,9.3),z(0,4.2),步长为0.1
决策取值范围,vx(-1.4,1.4),vy(0,4.7),vz(0,2.1),步长为0.1
dx(-45,45),dy(-45,45),dz(0,0),步长为1
把所有状态和决策跑一遍自然得到入射速度和决策与出射速度的对应关系。
组合数量 56*93*42*28*47*21*90*90=48,964,403,577,600
其实还做了很多减少状态空间的操作,但是看样子再怎么减也是够呛。
-----------------------没有用也有人看------------------------------------------------------
结论:还得踏踏实实写学习算法。先学习