人工智能,达尔文进化论
这是一个很大的题目。所以会很长。
此外,由于俺的 U 盘被狗啃了,所以不得不一切重头开始写,现在预计每 2-3 天更新一次。
开始:
人工智能,达尔文进化论和五子棋
目录
1.0 前言
2.0 模型简介
2.1 进化模型
2.2 智能模型
2.20 专家系统
2.21 神经网络
3.0 Javascript 实现
3.1 一些不是很重要的背景信息
3.2 AI 类
正文
1.0 前言
本文探讨运用达尔文进化论产生人工智能的可能性。
目标是,使用Javascript为编程工具,生成一个可以进化的人工智能,用来和俺下五子棋。
2.0 模型简介
2.1 进化模型
达尔文的进化论概括来说就是“物竞天择”。扩展开来说,就是“物竞”、“天择”。
“物竞”部分,要求物种具有 遗传、变异 的能力。遗传可以产生相对稳定的种族,有利于有益基因的延续。变异可以产生多元化的种族,有利于竞争和基因演化。
“天择”部分,要求物种之间通过互相竞争,优胜劣汰,来去处不合理的基因。
综上,一个满足俺需要的AI应该具有以下特征:
a) 可遗传性:可以将自己的绝大多数特征传递给子代。
b) 可变异性:在产生子代的时候并不是全盘复制,而是产生了一些变异。
c) 可竞争性:在本文中,竞争就是 与别的 AI 下五子棋。
2.2 智能模型
2.20 专家系统
Google的解释
一般的棋类AI都离不开行为规则判断和智能库。按照一般的逻辑来说,棋类AI都会模拟人类的思路,判断下一步棋下在哪里,会造成什么后果,并由此多推算若干步下去。通常,AI都会保存一份棋谱,用来快速的推算。这份棋谱就是这个AI的知识库。
这类AI的缺陷是:需要人类首先对需要解决的问题进行抽象化,构成一种 知识库-知识表达 的逻辑,这是非常难以彻底表达的,总会存在知识库之外的情况发生。而且这种模型显然很难实现持续的进化。它所能做到的只有知识库的不断完备,可是 知识表达 的进化是很难实现的。
2.21 神经网络
Google的解释
如果我们把一个独立的AI看作一个刚出生的婴儿,那么我们该怎么教会它学习?婴儿是没有知识库的。
其实很简单,我们可以把AI婴儿学习的过程抽象成这样:给AI一个刺激(输入),AI产生一个反馈(输出),我们作出判断,婴儿记录反馈的判断结果,用来加深或削弱对这种刺激的反馈机制。
(写的过分简略了...不过本文不以普及基本知识为重点...各位凑合着看吧,有问题找google)
3.0 Javascript 实现
//---------2007.04.03 更新分割 --- Hutia ----------------//
3.1 一些不是很重要的背景信息
代码的环境: Window XP sp2, IE 6.0
文件信息: Gobang_ai.hta, ai.txt, sp/gobang_ai.css, sp/gobang_ai.js
Gobang_ai.hta 内容:
sp/gobang_ai.css 为基本的 CSS, 内容略去
sp/gobang_ai.js 是本文的核心,下文分解...
3.2 AI 类
(因为本文还没写完,所以给出的并不一定是最终代码,随着结构的展开,代码会有所变化)
初始化的代码很简单:
然后是变异繁殖的代码:
aberrance_ratio是一个全局的变量,用来存放俺的世界的基因变异率--变异率高的世界进化会比较快些,但是太高的变异率反而难以产生真正有价值的 AI. (想想现实世界,如果到处都是核辐射,也许会产生多姿多彩的微生物,但是很难产生灵长类动物)
此外,由于俺的 U 盘被狗啃了,所以不得不一切重头开始写,现在预计每 2-3 天更新一次。
开始:
人工智能,达尔文进化论和五子棋
目录
1.0 前言
2.0 模型简介
2.1 进化模型
2.2 智能模型
2.20 专家系统
2.21 神经网络
3.0 Javascript 实现
3.1 一些不是很重要的背景信息
3.2 AI 类
正文
1.0 前言
本文探讨运用达尔文进化论产生人工智能的可能性。
目标是,使用Javascript为编程工具,生成一个可以进化的人工智能,用来和俺下五子棋。
2.0 模型简介
2.1 进化模型
达尔文的进化论概括来说就是“物竞天择”。扩展开来说,就是“物竞”、“天择”。
“物竞”部分,要求物种具有 遗传、变异 的能力。遗传可以产生相对稳定的种族,有利于有益基因的延续。变异可以产生多元化的种族,有利于竞争和基因演化。
“天择”部分,要求物种之间通过互相竞争,优胜劣汰,来去处不合理的基因。
综上,一个满足俺需要的AI应该具有以下特征:
a) 可遗传性:可以将自己的绝大多数特征传递给子代。
b) 可变异性:在产生子代的时候并不是全盘复制,而是产生了一些变异。
c) 可竞争性:在本文中,竞争就是 与别的 AI 下五子棋。
2.2 智能模型
2.20 专家系统
Google的解释
一般的棋类AI都离不开行为规则判断和智能库。按照一般的逻辑来说,棋类AI都会模拟人类的思路,判断下一步棋下在哪里,会造成什么后果,并由此多推算若干步下去。通常,AI都会保存一份棋谱,用来快速的推算。这份棋谱就是这个AI的知识库。
这类AI的缺陷是:需要人类首先对需要解决的问题进行抽象化,构成一种 知识库-知识表达 的逻辑,这是非常难以彻底表达的,总会存在知识库之外的情况发生。而且这种模型显然很难实现持续的进化。它所能做到的只有知识库的不断完备,可是 知识表达 的进化是很难实现的。
2.21 神经网络
Google的解释
如果我们把一个独立的AI看作一个刚出生的婴儿,那么我们该怎么教会它学习?婴儿是没有知识库的。
其实很简单,我们可以把AI婴儿学习的过程抽象成这样:给AI一个刺激(输入),AI产生一个反馈(输出),我们作出判断,婴儿记录反馈的判断结果,用来加深或削弱对这种刺激的反馈机制。
(写的过分简略了...不过本文不以普及基本知识为重点...各位凑合着看吧,有问题找google)
3.0 Javascript 实现
//---------2007.04.03 更新分割 --- Hutia ----------------//
3.1 一些不是很重要的背景信息
代码的环境: Window XP sp2, IE 6.0
文件信息: Gobang_ai.hta, ai.txt, sp/gobang_ai.css, sp/gobang_ai.js
Gobang_ai.hta 内容:
复制内容到剪贴板
ai.txt 用来存储 AI代码:
<html>
<head>
<hta:application />
<title>Gobang Artificial Intelligency</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="sp/gobang_ai.css" />
<script type="text/javascript" src="sp/gobang_ai.js"></script>
</head>
<body></body>
</html>
sp/gobang_ai.css 为基本的 CSS, 内容略去
sp/gobang_ai.js 是本文的核心,下文分解...
3.2 AI 类
(因为本文还没写完,所以给出的并不一定是最终代码,随着结构的展开,代码会有所变化)
复制内容到剪贴板
代码其实非常简单(而且不完整)。设定了一个数组 gene 用来存放 AI 的基因(mmm变量是全局的,用来存放这个基因的长度)。本文中所有的 AI 都只有一条染色体(就是一个数组),并且基因的长度是等长的。代码:
function AI(){
// 基因
this.gene=new Array(mmm);
// 一些信息
this.count_played=0;
this.count_win=0;
this.generation=0;
this.level=0;
this.score=10;
// 遗传 & 变异
this.aberrance=AI_m_aberrance;
// 初始化
this.init=AI_m_init;
this.init();
}
初始化的代码很简单:
复制内容到剪贴板
ps: 把所有基因位的初始值赋值为0.5是一个经验值,后面会在基因的表达时提到。代码:
function AI_m_init(){
// 初始化
for(var i=0; i<mmm; i++)this.gene[i]=0.5;
}
然后是变异繁殖的代码:
复制内容到剪贴板
本文的所以 AI 都是无性分裂繁殖的。虽然性的引入会使得 AI 的进化的更加优化,但那对更复杂的 AI 来说也许更合适些。现在的这种简单 AI 基因只有一个表达方向(下五子棋)和一条染色体,如果利用性来交换染色体是有点高射炮打蚊子了。代码:
function AI_m_aberrance(){
// 遗传 & 变异
var mi, ni, n, aberranced_ai;
aberranced_ai=new AI();
// 遗传
for(var i=0; i<mmm; i++)aberranced_ai.gene[i]=this.gene[i];
mi=parseInt(mmm*aberrance_ratio);
ni=5/mi;
n=aberranced_ai.gene.length;
// 变异
for(var i=0; i<mi; i++){
if(Math.random()<ni)aberranced_ai.gene[parseInt(n*Math.random())]*=(1+(Math.random()-0.5)/5);
}
return(aberranced_ai);
}
aberrance_ratio是一个全局的变量,用来存放俺的世界的基因变异率--变异率高的世界进化会比较快些,但是太高的变异率反而难以产生真正有价值的 AI. (想想现实世界,如果到处都是核辐射,也许会产生多姿多彩的微生物,但是很难产生灵长类动物)