ruiaijun的头脑风暴
注册日期:
2004-9-23
上次登录:
2016-02-10 17:46:55
邮件地址:
ruiaijun@163.com
兴趣领域:
数学,物理学,人工智能,心理学
  ruiaijun的头脑风暴
ruiaijun的更多标签
规格不限的多刺激反射程序
2008-3-19 22:03:41  人工智能 
      规格不限的多刺激反射程序
  1、目标。
  在前面的三个演示程序中,反射的总数量被数组限制在三条,每条反射链上的刺激数量被限制在三个。
  当然,这些程序如果把数组指针加以扩大,也可以改变现在的状态。但是由于数组指针具有矩阵结构,在内存的浪费上就显得很大。
  我们知道,模拟反射并不是我们的目的。我们的目标是要产生“类似于人类的智能”。在那个模拟系统中,需要容纳大量建立起反射关系的数据。因此我们好摸索出一个反射链规格不限的数据结构。用它来建立并管理数据。
  本演示程序就是要解决这个问题。
2008-3-19 22:04:44
  
  2、演示程序与面向对象的关系。
  面向对象的思想是以对象为主体,把对象和操作结合为一体,封装起来。
  “反射算法”面向的有两种对象,一个对象就是计算机保存的各种数据。第二个对象是“反射算法”的核心——指针数据。
  我们这里的程序,仅仅是通过各种演示程序,摸索一个面向这些对象的通用行为(操作)。就这些程序的内容而言,它还是面向结构的。因为我们不面向这些结构。就无法知道如何处理我们将要面向的对象。
  但是这些程序显示出的操作,要应用在一个大的模拟智能软件中。在那里,操作就不再是被关注的,它们只是与自己的对象在一起,构成智能的各个层次。

2008-3-19 22:06:07
  
  3、输出信息的不必要性。
  在包括本演示实验在内的四个演示实验内,我们都用输出信息显示反射链建立的成功,显示它的联想功能的具备。
  但是,输出功能并不是“反射算法”必要的东西。那只是给人看的。也是为了调试程序的需要。
  我们为什么要强调输出的不必要性?
  因为有些弱智的人,只注意到这些演示程序,无非是输出一些联系起来的信息。这些人也就因此看不到这种演示的深远意义。如果,这些信息或这些神经部位不是字符,而是把计算机系统的各部分,通过反射链把计算机的各个部分有机的联系起来,那会是什么局面?
  这些奥妙看来只能意会不能言传了!

2008-3-19 22:12:26
  
  4、基本成功的源代码。
  这个源代码,基本运行成功。因为调试太累了,没有进行优化。
#include <iostream.h>
#include <string.h>
void main()
{
char s[20],q[200000],*t=q,*m,*l;
int b[400],*k=b,i,n,f,e=0;
b[0]=0;
for (b[0]=0;b[0]<=1999;b[0]++)
{
strcpy(t,"");t=t+1;
}
b[0]=0;t=q;
for (b[0]=0;b[0]<=39;b[0]++)
{
b[b[0]]=0;

b[4]=1;
while(b[4]=1)
{
b[0]=b[1]=n=0;l=t=q;
cout<<"请输入刺激信息"<<endl<<"输入=会终止运行"<<endl;
cin>>s;
b[4]=strcmp(s,"=");if (b[4]==0) break;
if(b[10]!=0)
{
do
{
if (b[10+b[0]]==0&&b[10+b[0]+1]==0)
{
l=m;
goto gonggu;
}
b[5]=strcmp(s,t);t=t+b[10+b[0]];b[2]=b[2]+b[10+b[0]];
b[0]++;
}
while(b[5]!=0);
t=q;
do

b[0]--;
}
while(b[10+b[0]]>0);
b[5]=0;
while(b[5]<=b[0]) 
{
t=t+b[10+b[5]];b[5]++;
}
cout<<"  显示反射(产生联想):"<<endl;
t=t+b[10+b[0]];
cout<<t;b[0]++;
do
{
t=t+b[10+b[0]];
cout<<"——"<<t;b[0]++;
}
while(b[10+b[0]+1]>0);
cout<<endl;
}
else
{
gonggu:cout<<"进入建立反射阶段"<<endl;
cout<<" 请继续输入两个刺激信息:"<<endl;
strcpy(l,s);
b[6]=strlen(l);l=l+b[6]+1;b[1]=b[0]=0;
do
{
do
{
chonglai:cout<<"请输入第"<<b[1]+2<<"个刺激信息"<<endl;
if (b[0]==0) cout<<"输入=会结束刺激信息输入"<<endl;
cin>>s;b[5]=strcmp(l,s);
b[7]=strcmp(s,"=");if (b[7]==0) break;
if (b[0]>0&&b[5]!=0)
{
cout<<"与上次不同,重输入!"<<endl;
goto chonglai;
}
strcpy(l,s);
b[6]=strlen(l);l=l+b[6]+1;b[1]++;
if (b[0]==2) b[10+b[8]+b[1]]=b[6]+1;
}
while(b[7]!=0);
if (b[0]==2) break;
chongshu:cout<<"进入巩固反射阶段"<<endl;
cout<<" 请按提示继续输入第"<<b[0]+2<<"次同样刺激信息:"<<endl;
b[1]=0;cout<<"请输入第"<<b[1]+1<<"刺激信息"<<endl;
m=l;l=t;
cin>>s;b[5]=strcmp(l,s);
if (b[5]!=0)
{
cout<<"与上次不同,重输入!"<<endl;
goto chongshu;
}
b[0]++;strcpy(l,s);
b[6]=strlen(l);l=l+b[6]+1;
if (b[0]==2) b[10+b[8]+b[1]]=b[6]+1;
}
while(b[0]!=3);
b[1]++;b[10+b[8]+b[1]]=0;e=b[1]+1;
b[3]++;cout<<b[3]<<"条反射链已经建立"<<endl;
b[8]=b[8]+e;e=0;
}
}
}
2008-3-19 22:13:35
  
  5、本演示程序试验的重点。
  A、不满意之处。
  这个程序,虽然已经调试出建立和实现不受规格限制的多刺激反射。但是它并不是很理想。特别是在对指针的检索中,显得很不方便。

2008-3-19 22:14:34
     B、大数组代替大内存。
  不过这个演示程序达到了我的预想目的。
  就是用定义大数组,控制一个内存空间。与动态分配内存相比,这种方式显得安全可靠。
  定义一个数组,实际是要求编译程序为我们申请一个内存,用变量名使用这个内存。我们把它定义的大一些,在数组内部按我们的意愿使用。这也是一种内存管理。
  但是它有很多好处:没有申请不下来的时候。没有忘记释放留下的漏洞。特别是对于我们需要常驻程序的数据时,用但数组控制一部分内存,非常有好处。
  本演示程序的实验重点,就是用C++语言做这种内存管理工作。
2008-3-19 22:15:49
     C、数据数组。
  本演示实验用了两个平行关系的数组。构成本程序的核心。
  其中字符型一维数组q[200000],又被我叫做数据数组,它负责保存各个键盘输入的刺激信息。这些数据顺序的排列在数组之中。由于每个字符串后面自动有一个′′作为结尾,因此我们不必再为这些字符串设置区别它们的隔离符号。
  一条反射链由多个刺激信息组成,那些数据组成同一反射链,在这个数据数组里不加区别。这个区别由另一个数组(指针位移数组)显示出来。
  我们就这样,用一个大的顺序存放字符型数组,保存不受规格限制的各条反射链上的各个刺激信息。

2008-3-19 22:16:59
  
  因为我使用C++语言时间不长,为了检验它容忍定义数组的尺度,我定义了一个200000字节的字符数组,实际在我们的运行实验中,很难用到这么大。但是它表明我们用定义大数组的方式,确实可以实现数组管理。
  这一点对于我们以后在“反射算法”与“自编程序算法”结合时,处理自编程序中的变量,用处很大。
  如果把类似的数组定义为全局变量,它就可以在各个函数中使用。这就为我们扩大“反射算法”的应用提供基础。让模拟大脑各种功能的部分,凭指针,共用一批数据。
2008-3-20 22:21:11
  
  D、指针位移数组。
  另一个整形数组b[400],我叫做指针位移数组。它的前十个元素用来做一些计数变量。本来不打算在加其它计数变量了。使得程序看上去简洁一些。但是十个不够用,又多定义了几个。仅使用了一个,其它几个没有用处,也没有删去。

2008-3-20 22:22:23
     指针位移数组也有它的数据结构。它也是采用顺序的方法排列存放数据。它的数据是数据数组每个字符串的长度+1。当指针变量们获得“数据数组”的指针后,它只能指向该数组的顶端,当是把它加上“指针位移数组”的一个数字,它就指向“数据数组”的下一个字符串了。

2008-3-20 22:23:37
     这样,我们就可以有这个数据的各个数据的依次相加,得到“数据数组”个个字符串的指针。然后用指针完成存取信息的工作。
  这个数组还负担区分各个反射链的任务。

登录后才可以评论,马上登录