多人工干涉算法的编程实现

发布于:2019-05-28   编辑:admin 浏览:

  提出了研究多人工干涉算法的编程实现问题的必要性,在初步分析这一部分的基础上给出了此类问题的定义及解决此类问题的一些技巧,作为一个实例,给出了基于MATLAB包的化可控规范型的通用函数源程序。

  随着科学技术的发展,许多学科的一些新理论的应用必须依靠计算机求解。对此,人们产生了两种看法。一种认为,要掌握新理论,不能好高骛远,应该从最基本的计算语言如FORTRAN、VB、VC、DELPHI等的编写入手。另一种则相反,认为学科的一些最新的理论成果均反映在国外的一些著名的商用软件上,通过学习使用这些商用软件能更快地掌握和利用这些最新的理论成果。这两种看法均有一定的道理,但实际上,由于任何一种商用软件都不可能刚好解决具体问题,在使用商用软件时,往往还必须学会在商用软件的编程环境下进行具体的二次开发,仍要用到许多具体的编程技巧。如《现代控制论》中许多理论都可以通过MATLAB软件包中控制工具箱里函数的调用来方便地实现。但MATLAB软件包并不是万能的,如化可控规范型就无现成的函数可用。要编制这一函数必须利用MATLAB语言进行编程。在多数情况下,一定的算法总可用一定的程序来实现,“只有想不到的,没有做不到的”。但在少数情况下,算法的描述更符合人的思维却很难用计算公式来表达,即有太多的“人工干涉”。在这种情况下,计算机作为“机器”的一面就暴露了出来,编制此类程序会遇到相当大的困难。本文通过一个实例,引出了多人工干涉算法的编程实现这一问题,在分析了该问题特点的基础上给出了这类问题的定义,探讨了其研究意义,提出了解决此类问题的一些技巧,最后作为实例,给出了基于MATLAB包的化可控规范型的通用函数源程序。

  化可控规范型的步骤就是:先在Wc中找出n个线形无关的列,再按此来构成相应的坐标变换阵,最后求取规范型。

  在图中假定n=6,m=4。设bi为B的第i列,先选定非零列向量b1并在表征它的A0b1格内记上“×”然后再看Ab1(即A1b1),若Ab1与b1线的格内记上“×”。如此按格栅图关于B的第1列b1继续选下去,直到发现向量Av1b1与先前的向量组{b1,Ab1,…,Av1-1b1}线中v1=3)。如果v1n,则继续对第2列b2进行类似搜索,若b2与{b1,Ab1,…Av1-1b1}线的格内记上“×”。同样,按b2继续向下搜索,直至Av2b2先前取定的所有向量为线形相关,并在格内记“○”。按此步骤继续进行,直至取到第l列,并有v1+v2+…+v1=n时结束。这样Wc中的n个线形无关的列向量即格栅图中用“×”表示的那个列向量,并可得到指数集{v1,v2,…vm}。

  可以看出,该算法并不复杂,理解起来一点也不困难。如果系统的矩阵维数不高的话,可以很快在纸上演算出结果。但如果将该算法的通用程序编出来,就会发现一些看上去含义很清楚的操作,编起程序来十分困难。具体地讲,在MATLAB语言环境下除不可控矩阵的生成、矩阵求逆及矩阵相乘可直接实现外,还要编制程序解决以下几个问题:

  ·对选定的线形无关列向量按格栅列进行分组记数,求得{v1,v2,…,vm};

  ·将抽取的特定行放置到新矩阵的特定行位置,空缺行用放置行的特定计算来填充。

  基于通用性考虑,可控系统的矩阵维数不定,线形无关列向量位置不定更增加不编程的难度。理解的容易和编程的困难共存于同一个算法,这绝非偶然,而是一类特殊的多人工干涉算法的编程实现问题的典型特点。由于类似的问题不时遇到,因而有必要对这类问题进行较深入的研究。

  上面提到的系统化可控规范型的算法是多人工干涉算法的一个典型实例。事实上将上面的算法拆开来看,各个子算法和在语言编程中常用的诸如记数、求和、冒泡法排序等小程序类似,均属于一类问题。

  这类问题的算法描述特点:符合人类的思维习惯,容易理解,但难以用明确简短的数学公式表示。

  这类问题的编程实现特点:要较多地、灵活地综合应用语言的数组定义、循环语句、判断语句及它们的复杂嵌套关系。编程难度大,但编程实现后可达到一劳永逸的目的。

  综上所述,多人工干涉算法的编程实现可近似定义为:由于某一问题的算法描述更符合人类的思维而与计算机的思维(语言编程实现)相去较远而导致编程实现的困难,这样的算法从计算机的角度考虑,称为人工干涉算法。当问题中人工干涉算法较多时,就称为多人工干涉算法。基于多人工干涉算法的计算机语言编制即多人工干涉算法的编程实现。

  除了MATLAB软件包中的二次开发外,在开发动力学仿真软件ADAMS等商用软件中,在用基本编程语言编制优化设计算法、神经网络算法、遗传算法等程序时都会遇到一些多人工干涉算法的编程实现问题。而且,从一定意义上讲,多人工干涉算法的编程实现实际上是将人的一些思维方式强加到计算机上,对这一问题的深入研究是实现计算机智能化的一条途径。因而对多人工干涉算法编程实现问题的研究具有深远的意义。

  (1)先结合例题考虑特定算法,再考虑通用算法。从特殊到一般,这里体现了归纳的思想。如前面提到的实例,可先将待算系统各矩阵维数固定,同时考虑计算中可能出现的各种情况,编制出特定算法,而后再将各矩阵维数用变量表示即可实现通用算法。最好结合一个例题进行编程,以便对计算结果进行检验。

  (2)将多人工干涉算法拆分成几个单独的人工干涉算法,针对具体目标,逐个编程实现。这也就是“化整为零”的思想。如前面提到的实例可拆解为选取线形无关列向量、从矩阵中抽取特定行等几个目标单一的小程序。为确保算法正确,应保证每个小程序都正确,最好在编程对每个小程序的计算结果都要加以显示,以便发现问题。

  (3)熟练应用数组定义、分组记数、分组求和、循环嵌套、排序等编程基本操作。这些相对简单的操作实际上是多人工干涉算法编程实现的基础。如前面提到的实例,在确定按格栅列记数、抽取矩阵特定行数、放置特定行到新矩阵的特定位置等操作中均涉及了这些基本操作。

  (4)重视指针的应用。有时除了要分组记数外,还要明确各组元素的位置和内容,这就要考虑使用指针来指向特定数据。如前面实例中要实现选出的线形无关列向量按表的列顺序排列,就得定义指针jsp(pp,js(n))来确定属于某个格栅列的列向量顺序记号。

  此外,如使用动态数组节省变量、加注释也是常用的技巧。本文给出的实例是基于MATLAB语言开发的,如用FORTRAN、VB、VC、DELPHI等语言编程实现,还要增加许多工作量。

  用同样的思想可以编制出系统化可控规范型及系统结构分解等控制工具箱中未提供的通用MATLAB程序。

  多人工干涉算法的编程实现是计算实践过程中产生的一个很重要的问题。它对于更灵活地使用各种编程语言开发实用算法(如遗传算法、BP神经网络等),得心应手地使用各种商用软件(如MATLAB、ADAMS等)具有很强的指导意义。更重要的是,从某种意义上说,通过多人工干涉算法的编程实现可以将人类的一些思想强加于计算机,从而开辟了一条实现计算机智能化的新途径。