原本是在Coursera上随便选的课,本意是打算跟个以Python代码为作业的课来吧Python学了,顺便体验下verified certificate。不过mini-project每次的小游戏还是蛮有意思的,pylint和读别人写的instruction还是有所收获,而且既然暑假闲着,我决定开始写学习笔记~
=============================说废话的分界线================================
正式进入课程的第一部分应该是实现tic-tac-toe游戏,通俗版,bingo游戏?
数学:
probability相关,主要讲了expected value和monte carlo method。(因为这学期修了统计,所以并没有怎么听这些部分,monte carlo之前用c++写过,所以也并没有认真听)
还是从理解角度上概括一下monte carlo吧,本质就是模拟(simulation)。搭出相应的模型,输入参数,不确定部分用随机来模拟结果。理论应该是基于大数定理在很多次情况下能真实模拟出来。应用:首先想到的大概就是AI游戏算法和金融方面的量化系统。基本构成(以tic-tac-toe为例)大概是:
辅助函数:
1.单次trial(在当前状态下,按规则随机模拟双方对弈,直到分出输赢,更复杂的游戏的话还有设置局面分数,之后如果写AI学习笔记再说>.<)
2.check本次trial的结果(课程给出的打分方法是:根据当前machine方的player输赢来打分,输的话,给对方占的格子打正分,己方占的格子打负分;赢的话反过来;你平局对check没有贡献度。 我自己一开始最直观的想法还是对每个可执行的下一步模拟后看输赢,输-1,赢+1,然后看哪一步得分最高得哪个。 后者比较常规,具体哪个好,还是等AI部分查完资料再写代码比较下= =)
主体:重复trial+check(check部分的分数是累加的),选取最优策略。
python:
这一部分大概提了下object和reference。其实并不是python语句范畴的事= =这次被小游戏折磨得大概有点理解object的概念啦~
老师举的例子很形象:object是一个客观存在的人,reference就是他的名字标签,你可以给他贴一个,两个……,也可以把其中一个标签撕下来贴在另一个人身上。
list1=['a','b','c']
list2=list1
list1[1]=42
list1=[1,2,3,4,5]
最简单就是这样啦,第二行就是,再贴第二个标签,第三行是给这个人整了下容(但是登记入院啥的还是需要名字呀,所以用了reference),第四行出现了一个新的object[1,2,3,4,5],它在派出所登记了list1的标签,鉴于编程的制度,之前['a',42,'c']的list1的标签就作废了,所以最终的结果是:
list1=[1,2,3,4,5]
list2=['a',42,'c']
恩,到这里都还很easy,比较讨厌的是遇到函数(和c++的call by reference/value 差异较大),但是考虑所有的var和method都是object,然后顺着代码逻辑画reference和object之间的关系线就好,不过要记得再函数里整容的object(当然前提是可mutable的object),回到主体里还是整容后的样子,比如:
def func(list)
list[2]=100
return list
list1=[1,2,3]
list2=func(list1)
list1=>[1,2,3];
into func list1=>[1,2,100]
out func list2=>[1,2,100]
杂:
每次practice problem里都能遇到很熟悉的东西~
比如这次第一个是nim游戏= =也可以用随机模拟来选择最优策略= =然而这是个有必胜策略的游戏……抑或判断先手胜负,详情wiki都有,反证正确性~
第二个是monty hall problem……第一次知道这英文名,就是三个门一车俩羊,玩家选A,系统会开另一扇有羊的门,比如C,然后问玩家是否更换到B。 问题是switch是否对玩家有优势= =我一直是坚定的half党,认为对于已经知道C后情况,剩余两扇门都一样……然后模拟出来的结果居然真的是1:2的比例(switch有利),论证过程是:A门概率仍为1/3未变,而合为1所以switch后的概率是2/3。并无法理解逻辑上哪个有错,总之是小小地颠覆了一下三观。
==============================TO BE CONTINUED============================