我们需要数学的理由

来源:互联网 发布:青岛市淘宝运营招聘 编辑:程序博客网 时间:2024/05/22 08:09

我们需要数学的理由

程序员需不需要数学,几乎只要做过程序员的人都会低下头来想上一段时间才能回答,不要因为认为你必须足够酷而回答说我们需要,因为很多程序员可能不会用上,因为我们有足够多的组件、库和框架,平台等提供了很多方法,以至与我们和数学脱钩。在大学本科生和研究生教育的过程中,老师和导师不止一次地说过:“我们需要一个数学模型“(model)。因为发表论文有了一个数学模型则发表的可能性则多了5%(此数据不可靠:))。

好的,于是乎我们把各种模型都翻了个底朝天,翻箱倒柜找数学。好的,我找到了,把一大堆推论的数学公式搬上银幕,嗯,终于放了一点心。凭心而论,很多数学公式我需要翻书后重新推导一遍才知道怎么回事。当老师看不懂我们的模型时,他们也放心了:)。

简单篇:

但是数学模型不是高深的让人不着边际的公式,也不是故意让人看不懂则是成功,我们来看个最为普通而简单的例子好了:

我的一个朋友在写一个工业控制的东西,他需要一个进度条,进度条的显示是为了配合时间而来的,因为没有足够多的经验(我的朋友一边看例子一边做软件),进度总刻度被定在了120,而60秒钟的显示很简单就可以知道,我们需要每秒钟进度2格。因此他在程序中的定时器每秒的间隔中这样定义了:

Position=Positon+2;

我看了他的程序说:这样可以,但是不够好,因为这个2不知道从哪里来,也不会知道这个2和几个参变量有关,基本情况是和1刻度,2总时间,3定时器的间隔有关。接下去大家都知道他要问为什么,于是我回答说,如果刻度或者时间或者定时器间隔需要改变,程序必须被修改。他点了点头。

我们可以这样修改:

All_P=进度条总刻度;

All_T=时间估计值;

RUN_T=相对已逝时间;

Position=(All_P/All_T)*RUN_T

这样一来,我们制作了一个模型,程序运行时总能探测总刻度ALL_P和时间All_T,我们知道这样运行时已经和1刻度,2总时间,3定时器的间隔已经无关,这时无论在运行程序前设计和运行后改变All_PALL_T,程序仍然能正确运行,这就是模型的威力。

这个例子极为简单明了,告诉我们需要数学和数学逻辑,但是我们不需要牵强附会并且故意“高深莫测“的数学公式。

加点修饰:

  加密算法:  如果你的程序算法不打算加密,很可能不够专业或者不够安全,怎么样简单的加密?这个足够简单,如果使用MD5算法的确可能解决问题,当然MD5有他的缺陷,有时候用不上。好了,不用写那么多,我只需要一个异或来和异或去的代码,这样我可以加密并且解密得到原文。但是我们不打算异或,我们可能会用上一个数学公式来解决加密的问题,假设我的用户名为qianbo,我的权限是administraor(管理员),原始密码是123456,我的验证值是int(qianbo)+int(administrator)+int123456,ok,如此线性的值让我感觉密码太过脆弱,a*int(qianbo)+b*int(administrator)+c*int(原始密码),abc可要保密了。你可以多用几个数学公式,两两加密,只要有一个公式产生的验证不对,那就准备放弃登陆吧。

上面是个牵强附会的Trick,真正的数学也许离不开插值算法:

这里是图形学算法中的采样插值:

要将图像缩小,也许最终得到的是看不清的斑点,但是如果将图像放大,过于失真让人恼火,在图像小而多边形片元大的情况下,采样比率将小于1,这时候得到的样本值都为浮点数。采样插值将采样点截尾,得到整数值。这样,效果出来了,在放大的情况下,你会看到很多马赛诸赛的朋友纷纷登陆:)。

如果我们这样做:

ix=intxt*u%;         (1)

fx=(float)(xt*u%-xx);          (2)

Resultx=ix*fx+(ix+1)*(1-fx)    (3)

其中(1)式中xtx轴采样点次数,ix为取x轴样本数整数,式(1)为取x轴样本数浮点数,式(3)为真正的混合插值函数。同样对y值也作同样处理,对后你知道要干什么,对xy再做一次。这就是双线性插值。

再稍加修饰:

 矩阵是一个强有力的工具,我们可以在各个方面看到他那强壮而优美的身体,我们对3D世界尤为感兴趣。看下面这个矩阵平移:

好了,看了这个矩阵乘法,大家都会说,不要骗我了,只是这样而已:

x=x+dx;(1

y=y+dy;(2

z=z+dz;3

 

难道这就是矩阵的概念?不是的:

我们来看物体移动过程:

上述图中:物体从A旋转到B,经过的步骤为平移到原点,在原点旋转,再平移到B,这样的过程必须用简单清晰的数学来描述,为了简化,才把过程复杂,可能矛盾,但是看下面这几句:

3D世界中的主要变换有平移,缩放,和旋转变换,为了使用同样的方法来处理变换并实现变换之间的复合,就引入了齐次坐标系,这样通过加法实现的变化同样经过矩阵处理,图形学中线性变换的形式就有了统一的形式。下面是旋转矩阵:

    好了,现在我们明白了简单和复杂的关系,把平移矩阵*旋转矩阵*平移矩阵,你完成了一项很平常的事情,但是在计算机的世界里面,可能复杂就是简单的化身。刚开始你觉得简单,然后你觉得复杂,最后你又感觉:只有这样做才够简单。这就是数学的魅力。

 

 

 

有点难度:

也许矩阵不让你着迷,但是编写游戏的过程中任务复杂而道远。除了矩阵我们还有很多感兴趣的话题,这回是神经网络,不用害怕,神经网络没有什么大不了的,怎么设计一个神经网络的输入输出才会是令人思考得主题。

网络的结构永远那么单调,用的最多的仍然是BP(多层前馈神经网络)。

来看一个交通工程上的一个具体的例子:占有率则是一种比例,意思为本来的路上可以有多少辆车而现在占的比例是多少,各个交通要道上有检测器,可以随时测到这个值,我们不必理会他,因为这部分的数学别人做了,我们现在必须拿来用:

很奇怪的是,经过这样一个过程我们真的能得到道路上是否发生车祸了?答案是“是的”,完全可以,但是必须要有足够多的经验值而计算得到各个节点之间的权重,这也是输入和输出的一种比例,ok,可能太复杂了,我们来看一个公式:

Y= a*x*x+b*x+c;

这个是个简单的公式,Y的可能输入值是x,输出是一个数,好了,这个和上面的神经网络有着异曲同工之妙,什么?真的是这样,是真的,在上面的这个网络中输入的各个值总有一个对应的输出值,我们的神经网络也能做到这一点,在上面的图中,输出要么是00.001),要么是1(0.999),但是没有一个具体的公式能让我们做到这一点,所以必须有足够的节点和层次来估计这个公式,节点和节点之间连接必须有权重。我们必须有足够的经验值来训练它,好了,我们不要车祸了,我们来点轻松的,来个坦克大战好了。

很抱歉用了如此拙劣的图片:(,图中的坦克要打到对方必须使用不同的炮筒角度,游戏可以参看《人工智能游戏编程真言》,那么仔细分析这个神经网络,它必须包含风向和速度,目标坦克和源坦克的距离,和相对海拔距离,如果用简单的数学公式,可能会计算很多东西,而且过于精确,你可以用神经网络来解决这个问题,在用几个输入(风速,距离,海拔)最后的输出就用炮筒的角度。好了,参考《人工智能游戏编程真言》上的神经网络,你会得到更多。它没有使用BP反馈,只是用了MLP(多层感知器)。值得注意的数学是他的sigmoid函数和很多个大量的乘法,也许开头对你来说是个惩罚。但是你一旦掌握,就知道它的魔力强悍无比,这是个用数学搭建的天堂。

说到这里,我相信你认为数学是重要的,但是数学是一个简单化工具,而非复杂化工具。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
原创粉丝点击