出差归来

从成都回来了。对于成都的饮食非常适应,5天时间里吃了4顿火锅,最后一天晚上的胖妈火锅感觉最佳,不是很辣,比较对味。又一次去肖家河吃了雅安面条,一如既往的好吃。

此次没有时间瞎逛,只是周日一起去了趟新五朵金花之一的XX梅林,体会了一下成都城乡一体化建设的成果,环境很舒适,北京是没有这种离城市中心如此近的休闲地方啊。

 

从堵车想到的

因为前几天老是迟到,所以今天特意比平时早起了15分钟,但没想到遇到了堵 车,结果到公司的时间比平时还晚。个人的努力就这样被交通这个大的非线性系统给消耗殆尽了。这让我想到,历史上有很多人都很努力,想要创一番事业,不过都 被当时社会这个大系统所淹没了,没有留下一点痕迹。为什么会被淹没呢?我想是因为社会的复杂性造成的。复杂性在于组成社会的元素众多有人、自然、以及他们之间的各种 组合,这些组合我们称之为条件。这些条件或多或少都会影响你对这个社会所施加的影响也就是你个人的努力。我把个人努力当作输入施加给社会这个系统,输出呢 就是社会所给予个人的影响,包括地位、金钱、家庭等等。由于这个社会的复杂性导致社会系统本身不是线性的,你的输入和社会的输出有时不能成正比,有人把这 称之为运气,这确实不可捉摸。但是你又不能不努力,因为没有输入肯定是没有输出的,这是个颠扑不破的真理。我们希望社会成为一个线性系统,你的努力将会得 到成正比的回报。时势造英雄,英雄肯定是努力的,而当时的社会在英雄努力的方向上是线性的。那最后我要问的是我该怎么办呢?要回答这个问题我得理清一个问 题,就是个人会给系统一个输入,但是个人并没有独立于系统而存在,他本身就在这个系统里,他的输入其实就构成了系统众多条件中的一个或多个,看个人对社会的参与程度了。那么我想如果你想让系统给你的输出正比于你的输入,那么最好力争把这个系统改造成一个线性的系统,你可以,因为你是社会系统的一分子。

另外,不仅个人的输入构成了系统的众多条件,个人对于系统输出的反馈也是条件。个人与社会关系何其复杂。联想到刚刚逝去的混沌学之父所说的“亚马逊雨林的蝴蝶扇了下翅膀,导致了美国加州的龙卷风”,我想个人确实要慎重考虑给予社会的输入。

(此文为旧文,写于2年前,近期又有新的感悟,有所补充)

围棋自动提子的算法

可以仿照迷宫的算法来编制,假设是白棋提黑子:
1、以白棋当前下的点为例,遍历此白子的四个邻接子(上下左右)

2、如果此邻接子为黑子则分别向它的四个临接点做遍历;如果为白子则返回第1步取下一个邻接子
3、如果遇到白棋,则此个方向的遍历结束,此方向黑棋无气;
4、如果遇到棋盘边界,则此个方向的遍历结束,此方向黑棋无气;
5、如果遇到空(临界点处无棋子),则整个遍历结束,黑棋还有气;
6、如果遇到黑棋,则又向它的三个临接点遍历(去除掉来路的那个临接点),继续执行3-6部,直到遇到结束条件返回;

7、如果4个邻接子都遍历完则结束否则返回第1步,去下一个邻接子。

在整个遍历过程中要记住所有黑棋的位置,在整个遍历结束后,如果不是因为第四种情况结束的,则所有的黑棋将被删除。

数学笔记-我的大脑敞开了


  • 无穷多素数证明

假定有有限多个素数,A1…An,现在制造一个素数等于A1*A2*…An+1,这个数肯定是一个素数因为他被任意的素数整除都余一。因此有无穷多个素数。

  • 素数中间可以相隔无穷大

可以创造一系列的合数,可以是任意的数目,中间不含有任何的素数。例如取1000的阶乘1000!,然后制造一系列的数1000!+2……1000!+1000,这999个数全部是和数。还可以制造任意大小的数N,N!+2……N!+N,这一系列数也都是和数。

  • 柯尼斯堡七桥问题

通过某一点的路线如果是偶数个,则从这个点出和入可以不重复地行走,如果是奇数个,则只能是起点或者终点。

  • 拉姆赛定理

六 个人被邀请参加晚会总会有三个人认识或者三个人不认识,如果是四个人认识或者不认识,则需要至少18个人与会。换句话说,只要有足够的人参加,总会找到N 个人认识或者不认识的规律。更深一步说,只是事物足够复杂就一定会有某种规律存在,完全没有规律的事物是不存在的。例如在圣经中找到某种预言(或者其他的 比较大部头的作品),生命的产生,火星上的人脸。这些惊人的巧合都是对大量随机数据进行大量试验的必然结果。(参见我的大脑打开了P71)

  • 正方形的分割

一个正方形分割成多个正方形的最小个数是21个,边长为112

  • 猜奖概率

有 三扇门,其中一扇门的后面是黄金,另外两扇门后面是山羊。参与者从三扇门中任选一扇门。在参与者选完一扇门后,主持人会打开一座后面有山羊的门(不管参与 者选择得如何,都会有一座门后有山羊),这个时候参与者可以选择坚持自己的方案,也可以改变到另一扇门。换与不换的概率是不同的,我们从出错概率着手:
不换的出错概率是:2/3
换的出错概率是:2/3*1/2 = 1/3
因此应该换。

  • 实数集合比自然数集合大(康托尔证明法)

假定在0到1之间的实数和所有的自然数一一对应,
1 - 0.13493358
2 - 0.85195719
3 - 0.14159265
4 - 0.17283845
5 - 0.04146492
6 - 0.71582381
…………………
现 在取第一个数的第一位小数,第二个数的第二位小数,以此类推,换言之用表中的对角线构造一个新数,然后把这个数的每一位小数都换成另一个数,无论怎么换都 可以只要和原数不同就行(不要换成9或者0避免0.24999=0.25000这种情况出现)。这个变化后的新数与上面的任意个数都不相同,因为在对应的 N(N=1到无穷)位上与原数都不相同。


数学笔记

  • 生日悖论
当屋子里有23个人的时候,任意两个人的生日相同的概率超过了50%。可以看到23个人之间可以有22+21+…+1=23*11=253种关系。
现在来计算生日不同的概率1*364/365*363/365*……342/365=0.49
那么相同的概率就是0.51〉50%。(详见维基百科的相关说明)

  •  

  • 贝切特称重
为 了能够称量从一克到40克之间的任何整数克的重量,至少需要多少砝码?一种是1、2、4、8、16、32,一种是1、3、9、27。不管是哪一种,可以看 到重量之间有一种乘倍增长的规律性,看来一些问题是有很有规律的数字构成答案的,不应该在解决问题的一开始就设想无规律的复杂的情况,而应该设想有规律的 美妙的解答。

  •  

  • π的无穷级数表示
π=4(1/1-1/3+1/5-1/7+1/9-1/11+1/13-1/15+…)

  •  

  • 网络的欧拉公式
V+R-L=1
V:定点数
R:线围成的区域
L:连线数

  •  

  • 找到不变量
可以解决问题的本质变量和无法解决的问题的本质变量是不同的,例如奇数和偶数等无法转换的关系

  •  

  • 三人决斗问题
这个问题要分析击中对方和击不中对方两种情况对于最终结果的影响,从而的出最佳的对策。

  •  

  • 删除重复组合的问题
有三组数每组都由1到6组成,一共有6*6*6=216种组合,现在我们要找到中间含有1的所有数的组合,分三种情况:

  1. 1×6×6=36,表示从第一组中拿出一个1,然后从另两组中任选

  2. 5×1×6=30,表示从第二组中拿出一个1,从第一组中取除了1以外的另五个数,然后从第三组中任取6个

  3.  

  1. 5×5×1=25,表示从第三组中拿出一个1,从第一组中取除了1以外的另五个数,从第一组中取除了1以外的另五个数。
一共有36+30+25=91种含1的组合。


读《数学:确定性的丧失》的心得

今早刚刚在公车上读完这本书,现在把最原始的理解书写下来:
1、 我们周围的客观世界是极其复杂的,它复杂到只能服从统计规律。因此我们所发现的使 用数学方法表达的物理规律都是对它的一种简化所得到的,是对这种统计 规律的一种平均的反应,而且还需要实验的检测。那么为什么这种复杂的客观世界的某种简化会符合数学定律呢?我认为拉姆塞定理(参见费玛大定理一书)可以解 释这一切,就是当事物具有足够的复杂度时,它可以表现出任意的规律,而我们看到的就是这种规律,而对自然界的复杂度,我们只能敬仰,不能描述。
2、 数学本身是人类从实践经验总结出的,并根据自己思维的演化、推理、推演而不断丰富的。但是它的根基是不牢固的,也是无法牢固的,原因就在于自然界的复 杂我们无法描述而只能简化,就是说我们对自然界的抽象肯定会丧失掉一些东西而不能完全反应自然界。数学的基础来自于我们对自然的简化。当然数学界自身分为 逻辑主义、直觉主义、形式主义、公理化主义,但是他们都不能完全的建立数学牢固的基础。比如在集合论里不断发现的悖论,以及歌德尔定理都说明了这一点,即 我们对自然界的抽象是不完善的,因此所有的定理都不能在完备性和相容性上达到和谐一致。
3、数学的基础来自对自然界的简化可以用几何的发展作为例 证,从欧几里德几何的平行公理到非欧几何的平行公理,可以看作是人类对客观世界观察的进步,所造 成的对客观世界的简化更接近于客观世界的结果。当然从欧几里德几何到非欧几何的进步并不严格遵循这一过程,非欧几何的产生是后人持续不断的对欧式几何的平 行公理的怀疑的结果,之所以会产生这一怀疑,就在于最初的简化不是严格的反应了客观世界,就是说这种简化是在无法认识到客观世界的复杂性面目的基础上进 行的,因此无法使平行公理与其他公理和谐相处。
4、从人类在认识数学与客观世界的关系的整个历史上看,人类无疑是在进步,从客观世界无法认识都是 神在掌控--客观世界是上帝按照数学原理创造的人的任务 就是了解神的旨意--数学的基础是不牢固的为什么?--上帝是不掷谷子的--数学是对客观世界的简化客观世界服从统计规律

卡尔·萨根《魔鬼出没的世界》读后感

上个月读了卡尔·萨根的《魔鬼出没的世界》对于科学精神有了更好的认识:
1、现在的伪科学包括遭遇外星人、超能力等等都和欧洲中世纪的基督教邪说有很大的联系,有些甚至只是对于中世纪的说法进行场景变换的产物。作者通过研究这些历史问题,使读者能够对于伪科学有了透彻的认识,知道伪科学的来龙去脉对于识别新兴的伪科学是极有好处。
2、西方文明的兴起不是因为基督教的缘故,而恰恰是基督教使希腊的文明差点夭折。所以中国要学习西方的文明,绝对不能搬移所有的上层建筑,尤其是宗教。
3、 科学的精神包含两个方面:一个是要有开放的头脑,能够容纳各种学说,不因为这种学说是否与传统大相径庭,不因为对提出学说的学者的主观印象等因素而排斥。 第二是要有一个怀疑的头脑,在某个学说不能被证据所证明的时候就应该对其一直保持怀疑,不能因为主观因素比如提出学说的人的权威性而盲目相信。
4、交流思想甚或相互批判时切忌空对空,交流思想应该从最坚实的基础开始。

解决一般问题的思路

这个思路主要是在解决一般的文字性描述的问题时,应该遵循的实践法则:
1、读懂题目

2、为题目建立一个 模型,比如一个量化模型(以数字描述变量),或者是一个图形化的模型(以图形描述变量),甚至是量化和图形相结合的模型(以数字表示变量,以图形表示关系)。
在 很多时候,要想完全读懂题目必须和建立模型相结合,否则还是要处在云里雾里,不得其要旨。对于一般问题模型是对问题的一种提炼和更精确的表达,而对于复杂 的非线性问题模型是对问题的简化,我这里不针对后一种模型。注意对于一般的问题而言,如果不建立模型有时候也能找到解,但由于在思考中会有大量的非必要信 息,所以在思考比较复杂的问题时,肯定会比通过模型思考要慢得多,而且也更容易走偏。

3、对于模型中的变量或者图形,要搞清他们的关系, 也就是弄清他们的约束条件。因为这些题目的要素不可能全部相互发生关系,那将是一个具有指数复杂度的问题,基本是不可解的。所以在变量间肯定会有某种特定 的关系比较紧密,要找到他们,对于比较简单的问题,找到了这些约束关系也就解决了问题。

4、对这些关系进行变换、类比、分割,以最终解决 问题。如果是比较复杂的问题,在理清关系之后还不能够解决问题,就是说在已知条件和解之间还有障碍,因此我们需要对已知条件(约束关系)进行变换、类比、 分割(或重组),来得到一些能够得到解的充分必要条件。这一步可能是最难的。

5、解毕。

科学的革命

1、何为已知
科学的起点、基础是我们已知的东西,科学不是空中楼阁。如何去除我们已知的东西里虚假的东西?步步求证?从无疑处建立基础,类似欧氏几何的公理系统。

2、如何得知
实验、演绎推理、归纳推理(猜测)。孰重孰轻?伽利略的实验,波意尔的实验(气体的压强和体积是一常数),牛顿对于力学的演绎(牛顿光学做过一些实验例如 多棱镜分光实验,但他的实验在当时条件下不易复现),爱因斯坦对于相对论的演绎推理(爱因斯坦没做过什么实验,但是其他人有一些实验事实,洛仑兹实验,光 速不变实验)。

3、知者何用
重大的科学成果和技术成果哪个对人类的社会影响更大,推动更大?牛顿力学还是蒸汽机,麦克斯韦方程还是燃气机。科学革命,技术革命。

作者一再强调的重点,科学在可考察的近代史中没有发生革命

UNIX编程的艺术

 

花了3天的时间略读了一下UNIX编程艺术这本书,对某些概念有了了解,对某些方法有了认识。
1、软件模块之间的正交性,模块之间要做到相互无影响,也就是要尽量解耦
2、软件的透明性,我的理解就是代码的层次很清晰,层次尽量少,尽量薄
3、软件的紧凑性,按照作者的说法,就是要围绕一个中心来组织代码,比如一个强大的算法
4、程序之间的通信协议尽量采用文本数据而不是二进制数据,这样有几个好处,容易理解、扩展方便、调试方便。如果认为效率较低占用更多带宽,可以压缩。
5、 尽量避免使用多线程的方法。UNIX的工程哲学是采用多个进程,多个进程间通过管道、文本协议、标准输入输出来相互协作完成工作,就好像一条流水线。在单个进程内,可以利用select、poll这类多路复用技术避免多线程(还有就是nonblock操作)。
6、脚本语言的妙用,perl、python、ruby,可以在c/c++不擅长的领域发挥作用,有效提高生产率,还可以作为领域语言发挥作用
7、 数据驱动编程的模型。采用文本数据+领域语言+基础模块来完成工作。文本数据描述复杂任务本身,领域语言(由脚本语言编写)构成逻辑层用来解释文本数据并 将复杂任务分解为多个基础任务并调用负责完成基础任务的模块(由c/c++语言编写)。当领域逻辑较简单时也可以省略逻辑层。
8、遵循简单但不能太简单(不能简单到无法完成任务)的原则,尤其是由多个简单的模块而不是由一个复杂的模块来完成任务。
9、复杂度的分类,偶然复杂度--由开发人员的素质决定,比如偶然犯的错误,不好的编程习惯等;选择复杂度--由开发人员所选择的编程语言、建模方法、设计方法所决定;本质复杂度--由任务自身的数据结构、功能需求决定。
10、使用yacc和lex(gnu版本bison、flex)来根据BNF做解析器,对于设计标准协议、解析标准协议十分有效。
11、好好利用emacs的强大功能(今天才知道emacs可以很好的结合cvs使用)。