人工智能,达尔文进化论

这是一个很大的题目。所以会很长。
此外,由于俺的 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 内容:
复制内容到剪贴板
代码:
<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>
ai.txt 用来存储 AI

sp/gobang_ai.css 为基本的 CSS, 内容略去

sp/gobang_ai.js 是本文的核心,下文分解...


3.2 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();
}
代码其实非常简单(而且不完整)。设定了一个数组 gene 用来存放 AI 的基因(mmm变量是全局的,用来存放这个基因的长度)。本文中所有的 AI 都只有一条染色体(就是一个数组),并且基因的长度是等长的。

初始化的代码很简单:
复制内容到剪贴板
代码:
function AI_m_init(){
     // 初始化
     for(var i=0; i<mmm; i++)this.gene[i]=0.5;
}
ps: 把所有基因位的初始值赋值为0.5是一个经验值,后面会在基因的表达时提到。

然后是变异繁殖的代码:
复制内容到剪贴板
代码:
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);
}
本文的所以 AI 都是无性分裂繁殖的。虽然性的引入会使得 AI 的进化的更加优化,但那对更复杂的 AI 来说也许更合适些。现在的这种简单 AI 基因只有一个表达方向(下五子棋)和一条染色体,如果利用性来交换染色体是有点高射炮打蚊子了。

aberrance_ratio是一个全局的变量,用来存放俺的世界的基因变异率--变异率高的世界进化会比较快些,但是太高的变异率反而难以产生真正有价值的 AI. (想想现实世界,如果到处都是核辐射,也许会产生多姿多彩的微生物,但是很难产生灵长类动物)
posted @ 2008-06-26 03:42  已經停更  阅读(213)  评论(0编辑  收藏  举报