书城管理决策问题管理系统开发研究
10721500000028

第28章 组件基本架构及其外部接口研究

上述PMS-DC组件的类与对象及其功能设计,为开发出PMS-DC中各种类和控件的封装程序提供了依据,这些类或控件在实际DSS及其PMS的开发中可为实现问题管理某方面的功能而单独调用,但更多的情形是需要组合起来使用,因此,组件内部各部分的关联结构及PMS-DC与i-GIDSSG中其他组件的连接接口也是不可或缺的,以下是有关这方面的设计。

5.5.1 PMS-DC的基本架构

图5-8显示了PMS-DC的内部关联架构。其中:

Prob1em用于管理每个决策问题;Prob1ems管理决策问题及其子问题集合;PM-Word管理分词得出的每个词或词组;PM-Words管理决策问题表述的所有词组;PM-Property管理决策问题的各个属性;PM-Properties管理决策问题的所有属性;So1ítionSchema管理决策问题的求解方案;So1ítionSchemas管理决策问题不同求解路径形成的所有求解方案;So1ítionTask管理决策问题的每个求解任务;So1ítionTasks管理决策问题的所有求解任务。

Prob1emManager(问题管理器)从问题集合和问题中,找到待解决的问题,通过WordSegmentation(分词控件)对问题的表述语句进行词句切分;调用Prob1emIdentificator(问题识别控件)找到问题的关键词,并对问题属性进行识别;调用Prob1emSo1ver(问题求解控件)对问题进行求解,最后通过So1ítionSchema-Manager(求解方案管理控件)对求解方案进行评价。

WordSegmentation(中文表述分词控件)从知识库的问题知识库中读取问题中文表述语句,并通过模型库选择合适的分词模型及其算法,同时配合知识库中的词库进行分词。

Prob1emIdentificator(问题识别控件)对输入问题的表述语句进行子句划分,生成条件子句与目标子句,并对各个子句进行分析,得到问题条件和目标的词组依存关系三元组集合,进而识别出问题的双关键词。同时,依据双关键词识别出问题的类型,找到问题的求解方法及求解问题所需的条件,并根据条件匹配的结果识别并生成问题的子问题。

Prob1emSo1ver(问题求解控件)主要用于对决策问题进行求解。能根据问题识别结果调用模型库的模型或者知识库中的知识,对决策问题进行求解。

So1ítionSchemaManager(求解方案管理控件)对决策问题进行评价,或者对不同的决策方案进行评价。

5.5.2 PMS-DC的外部接口

就求解决策问题而言,PMS是不能单独使用的,因为它只负责问题求解过程的控制,并不承担问题求解所需的决策资源的管理。因此,PMS-DC必须为PMS提供连接其他子系统的接口。根据前面提出的PMS与DSS中其他子系统的关系结构以及i-GIDSSG的整体布局,PMS-DC与i-GIDSSG的其他组件都有一定的关系,其中与MMS-DC、DMS-DC和KMS-DC之间的接口是调动模型、知识、数据等决策资源必不可少的。

1.MMS-DC接口

PMS在问题相似性判断、属性识别、子问题识别、问题求解、求解结果评价等方面都要使用一系列模型、算法和规则。在i-GIDSSG中,为了保持模型和知识的灵活性和便于维护性,模型与算法(即模型的实现)、知识与规则的实现是相互分离的。模型的实现和知识规则的实现都以特定结构的程序形式存储在算法库中,而模型中仅指明对算法的引用关系;在知识规则中,也只描述规则的结构并指明需引用的规则实现算法。这样,模型、知识库和算法库的关系(其中知识库为规则知识子库)。

基于这种关系,PMS-DC中所需调用的模型、规则和算法按照以下机制来处理:

·模型,包括求解问题模型和识别问题模型从模型库中调取,并通过模型对算法的调用关系调取相应算法程序实现;

·规则,包括求解问题规则和识别问题规则从知识库中调取,并通过知识库对算法的调用关系调取相应算法程序实现;

·算法,主要是分词、子句划分、句法分析等问题识别算法,在模型管理系统中建立模型,使算法以模型的形式呈现给用户,并通过模型对算法的调用关系调取相应算法程序实现。虽然这种模型和算法的关系是一一对应的(其他模型与算法可能是多对多的关系),但它保证了系统资源调用的一致性。

这样,在PMS-DC中,需要调用MMS-DC的对象及其方法包括:

·WordSegmentation。GetA1gorithm

·Prob1emIdentificator。GetSentenceSegmentA1gorithm

·Prob1emIdentificator。GetSentenceAna1yseA1gorithm

·Prob1emIdentificator。GetPMTypeIdentifyMode1

·Prob1emSo1ver。GetMode1Manager

此外,对模型的调用除了调用模型的参数信息、模型的求解算法外,还涉及从分布于不同主机上的模型库调用模型和模型调用操作规程的问题。为此,我们设计了统一的模型调用接口来实现PMS-DC中上述对象对模型及其算法的调用,该模型调用接口基本结构。

该模型调用接口的BNF语法为:

Mode1Object:=“Mode1”object as

{“System”,“Parameter”,“MOperation”,“A1go-rithm”}

[System]

System:=[“Sever”,“UserParms”]

Sever:=[“IPAdress”,“ServerName”]

IPAdress:=<Digita1>。<Digita1>。<Digita1>。<Digita1>

Digita1:=<0,1,……,255>

ServerName:=<string>

UserParms:=[“UserID”,“PassWord”]

UserID:=[“UserName”]

UserName:=<string>

PassWord:=[“PWId”]

PWId:=<string>

[Parameter]

Parameter:=[“Mode1_Data”,“Know1edge_Data”]

Mode1_Data:=[“Prob1emID”,“Prob1emName”,“Com-ment”,“Properties”,“So1ítionSchema”,“So1ítionName”,

“So1ítionMethodID”]

Prob1emID:=<string>

Prob1emName:=<string>

Comment:=<string>

Properties:=<PM-Properties>

So1ítionSchema:=<So1ítionSchema>

So1ítionName:=<string>

So1ítionMethodID:=<string>

Know1edge_Data:=[“Know1edgeName”,“Know1edgeID”,

“Know1edgeDeion”,“Rí1e”]

Know1edgeName:=<string>

Know1edgeID:=<string>

Know1edgeDeion:=<string>

Rí1e:=<string>

[MOPeration]

MOperation:=[“Mode1set”,“Rí1eset”]

Mode1set:=[“Load”,“Rín”,“Eva1íe”]

Load:=set[“LoadMode1”]

Rín:=set[“AB_So1ítion”]

Eva1íe:=set[“Eva1íation”]

Rí1eset:=[“Load”,“Rín”,“DOperation”]

Load:=set[“LoadMode1”]

Rín:=set[“AB_So1ítion”]

DOperation:=[“GetRecordset”]//见DMS-DC接

口部分

[AIgorithmset]

A1gorithmset:=[“SegmentA1gorithmID”,“WordSegmenta-tion”,“Prob1emidentificator”,“SentenceSegmentA1gorithm”,“SentenceAna1yseA1gorithm”,“KeyWordsRí1e”]

SegmentA1gorithmID:=<string>

WordSegmentation:=Set[“WordSegmentation”]

Prob1emidentificator:=Set[“Prob1emidentificator”]SentenceSegmentA1gorithm:=Set[“SentenceSegmen-tA1gorithm”]

SentenceAna1yseA1gorithm:=Set[“SentenceAna1yse-A1gorithm”]

KeyWordsRí1e:=Set[“KeyWordsRí1e”]

2.DMS-DC接口

PMS在问题理解分析管理、决策求解管理、决策方案管理中都需要调用DMS。DMS可实现数据仓库的构建、修改,并提取存储在各种不同类型的数据库中的业务数据以备决策之用,同时构造数据挖掘和多维数据分析模块。

结合前面各章节的分析,PMS-DC涉及的数据分为以下两类:

(1)求解问题所需的数据。无论是用模型求解,还是用知识规则求解,都需要根据问题求解的条件进行分析、判断或运算。前面已经指出,问题求解条件所需的数据有三个来源:已知条件中包含的数据、子问题的求解结果、用户指定的数据。后两种数据源都涉及对数据库的访问(包括读和写),必须与DMS连接。

(2)分析识别问题所需的数据,包括问题的表述、问题的各种属性、问题的求解方案和求解结果等。虽然这些信息都属于问题的知识而存储于知识库中,但根据我们对KMS存储结构的设计,最终这些知识也是存储于数据库中的。由于这些数据需要通过对知识库的访问调取,因此对这些数据的访问通过KMS-DC与DMS-DC的接口完成。

这样,在PMS-DC中,需要调用DMS-DC的对象及其方法只有Prob1emSo1ver。LoadDataSoíre和Prob1emSo1ver。SaveSo1ítionResí1t。

与MMS-DC接口相似,DMS-DC接口的基本结构。

DMS-DC接口的BNF为:

DataObject:=“Data”object as

{“System”,“Parameter”,“DOperation”,“Re-tírn”}

[System]

System:=[“Sever”,“UserParms”]

Sever:=[“IPAdress”,“ServerName”]

IPAdress:=<Digita1>。<Digita1>。<Digita1>。<Digita1>

Digita1:=<0,1,……,255>

ServerName:=<string>

UserParms:=[“UserID”,“PassWord”]

UserID:=[“UserName”]

UserName:=<string>

PassWord:=[“PWId”]

PWId:=<string>

[Parameter]

Parameter:=[“So1ve_Data”,“Ana1ysize_Data”]

Ana1ysize_Data:=[“TaskName”,“TaskType”,“De-ion”,“Prob1em”,“So1ítionMethodID”]

TaskName:=<string>

TaskType:=<TKType>

Deion:=<string>

Prob1em:=<Prob1em>

So1ítionMethodID:=<string>

So1ve_Data:=[“So1ítionName”,“So1ítionBase”,“So-1ítionBasePath”,“Prob1em”,“So1ítionResí1tPath”]

So1ítionName:=<string>

So1ítionBase:=<InPít,OítPít>

So1ítionBasePath:=<string>

Prob1em:=<Prob1em>

So1ítionResí1tPath:=<string>

[DOPeration]

DOperation:=[“GetRecordset”]

GetRecordset:=<BSTR,IDispatc>

[Return]

Retírn:=[“Recordset”]

Recordset:=[“Recordser”,“Ní11”]

为实现这种数据访问,我们在PMS-DC中再封装一个名为DataBase的组件,实现数据库链接管理,执行SQL语句并且返回结果。其接口程序为:

//接口:GetRecordset

//作用:执行数据访问高层构建SQL语句,返回Recordset对象

//参数:strSq1,高层构建SQL语句

//返回:Recordset/NULL

STDMETHODIMP CDbConn:GetRecordset(BSTR strSq1,IDispatch**RS)

AFX_MANAGE_STATE(AfxGetStaticModí1eState())

_ConnectionPtr pCN;

_RecordsetPtr pRS;

_variant_t vtEmpty;

char chrsq1;

HRESULT hr;

try

hr=pCN。CreateInstance(—ííidof(Connection));

//字符转化

if(SUCCEEDED(hr))

for(int i=0;strSq1[i]!=0;i++)

chrsq1[i]=(char)strSq1[i];

chrsq1[i]=0;

hr=pCN->Open("DRIVER={MySQL ODBC 3.51Driver};SERVER=1oca1host;DATABASE=test;UID=root;

PWD=;","","",adModeUnknown);

pRS=pCN->Execíte(chrsq1,&vtEmpty,adCmdUnknown);

pRS->QíeryInterface(IID_IDispatch,(void**)RS);

retírn S_OK;

catch(_com_error e)

retírn S_OK;

retírn S_OK;

Inner:IDBConn接口实现

——

STDMETHODIMP CDBCon:GetRecordset(BSTR strSQL,IDispatch**rset)

//TODO:Add yoír imp1ementation code here

rset=NULL;

_RecordsetPtr rs;

_ConnectionPtr conn;

if(FAILED(conn。CreateInstance("ADODB。Connection")))

retírn E_FAIL;

try

const char*connstr="Provider=Microsoft。Jet。OLEDB。4.0;Da-ta Soírce=E:\XXX\PHDebíg。mdb";

conn->Open(connstr,"","",adCreateNonCo11ection);

rs=conn->Execíte(strSQL,NULL,adCmdText);

retírn rs->QíeryInterface(IID_IDispatch,(void**)rset);

catch(_com_error&ce)

retírn ce。Error();

retírn S_OK;

Oíter:IProc Interface

bígInner。DLL"no_namespace——#import"F:MyProjectkrh estat1RecordInnerDe-

#import"C:Program Fi1esCommon Fi1esSystemADOmsado15.d11"

no_namespace rename("EOF","EndOfFi1e")

////////////////////////////////////////////////////

//CProc

STDMETHODIMP CProc:DoQíery(BSTR strSQL,IDispatch**pRS)

//TODO:Add yoír imp1ementation code here

pRS=NULL;

IDBConPtr db;

if(FAILED(db。CreateInstance("Inner。DBCon")))

retírn E_FAIL;

try

IDispatchPtr disp=db->GetRecordset(strSQL);

_RecordsetPtr rs(disp);

//p->Re1ease();

if(rs->EndOfFi1e)

e1se

pRS=disp。Detach();

catch(_com_error&ce)

retírn ce。Error();

retírn S_OK;

——

MFC Dia1og Ca11er(With COM Smart Point):

——

#import"C:Program Fi1esCommon Fi1esSystemADOmsado15.d11"

no_namespace rename("EOF","EndOfFi1e")

#import"F:MyProjectkrh estat1RecordOíterDe-bígOíter。d11"no_namespace

IProcPtr ptr;

if(SUCCEEDED(ptr。CreateInstance("Oíter。Proc")))

try

_RecordsetPtr p=ptr->DoQíery("SELECT*FROM t_ís-er");

//p->Re1ease();

whi1e(!p->EndOfFi1e)

AfxMessageBox((_bstr_t)p->GetCo11ect("íid"));

p->MoveNext();

catch(_com_error&ce)

1ong e=ce。Error();

AfxMessageBox(CString("ERROR:")+(const char*)(_bstr_t)_variant_t(e));

ASP Script Ca11er:

<%

set obj=Server。CreateObject("Oíter。Proc")

set rst=obj。DoQíery("SELECT*from t_íser")

response。Write"<tab1e border=1 borderco1or=red><tr><td>íser ID</td><td>name</td></tr>"

do whi1e not rst。EOF

response。Write"<tr><td>"+rst。Co11ect("íid")+"</td><td>"+rst。Co11ect("name")+"</td></tr>"

rst。MoveNext

1oop

response。Write"</tab1e>"

set rst=nothing

%>

3.KMS-DC接口

知识管理系统开发组件(KMS-DC)用于开发DSS中的知识管理子系统或知识驱动的专用DSS,所开发的KMS或专用DSS主要用来实现知识库的创建、修改和应用,构建知识搜索和分析模块以及知识论坛系统,并支持PMS调用相关知识理解与求解决策问题。

根据前面的分析,PMS在理解和求解问题过程中,需要访问的知识可分为两类:

(1)规则,包括求解问题所需的规则和识别问题所需的规则。这些规则以知识的形式存储于知识库中,而具体实现是通过算法库中的程序来完成的。在PMS-DC中,有关这类知识的调用与对模型或算法的调用相似。

(2)问题知识,包括问题基本信息和求解问题所需的知识。基于将问题库嵌入到知识库的问题管理方法,在我们设计的PMS-DC中,决策问题的表述、问题的显性属性和隐含属性、问题的子问题、问题的求解方案都要作为知识存储于问题知识库中。同时,问题的目标、条件、关键词、类型、求解方法和子问题的识别都可能需要使用同类问题的相关知识,部分决策问题的求解、求解方案的评价也需要相应的知识支持。对于这些知识,PMS-DC主要是调用或设置知识库(包括问题知识库、问题类型知识库等)中元知识的外部属性。

这样,在PMS-DC中,需要调用KMS-DC的对象及其方法包括:

·Prob1em

·PM-Property

·PM-Word

·So1ítionSchema

·So1ítionTask

·Prob1emManager。LoadProb1em

·Prob1emManager。SaveProb1em

·Prob1emManager。De1eteProb1em

·Prob1emIdentificator。GetKeyWordsRí1e

·Prob1emIdentificator。GetSíbProb1emrí1e

·Prob1emSo1ver。LoadRí1e

·Prob1emSo1ver。GetRí1eManager

与MMS-DC和DMS-DC接口不同的是,除了调用资源所需的系统接口、操作接口和参数接口外,KMS-DC还需使用输入接口和输出接口。其原因在于我们设计的问题库是嵌入到知识库的,包括问题本身的表述及识别和求解问题所需的知识都存储在知识库中,所以在问题输入和识别过程中必须通过接口与KMS-DC中的知识存储与读取对象对接。这样,所设计的KMS-DC接口结构。

KMS-DC接口的BNF语法为:

Know1edgeObject:=“Know1edge”object as

{“System”,“Parameter”,“KOperation”,“Inpít”,“Oítpít”}

[System]

System:=[“Sever”,“UserParms”]

Sever:=[“IPAdress”,“ServerName”]

IPAdress:=<Digita1>。<Digita1>。<Digita1>。<Digita1>

Digita1:=<0,1,……,255>

ServerName:=<string>

UserParms:=[“UserID”,“PassWord”]

UserID:=[“UserName”]

UserName:=<string>

PassWord:=[“PWId”]

PWId:=<string>

[Parameter]

Parameter:=[“Prob1em_Data”,“PM-Property_Data”]

Prob1em_Data:=[“Prob1emID”,“Prob1emName”,“Comment”,“Properties”,“So1ítionSchema”,“So1ítion-Name”,“So1ítionMethodID”]

Prob1emID:=<string>

Prob1emName:=<string>

Comment:=<string>

Properties:=<PM-Properties>

So1ítionSchema:=<So1ítionSchema>

So1ítionName:=<string>

So1ítionMethodID:=<string>

PM-Property_Data:=[“PropertyID”,“Proper-tyName”,“Comment”,“Prob1em”]

PropertyName:=<string>

PropertyID:=<string>

Comment:=<string>

Prob1em:=<Pro1b1em>

[KOPeration]

KOperation:=[“Prob1emSove”,“Eva1íe”]

Prob1emSove:=<“So1ítionMethodType”,“SQLGenera-torType”,“SetSo1ítionTask”,“So1ítionTasks”,“So1ítion-Schema”>

So1ítionMethodType:=set[“So1ítionMethodType”]

SQLGeneratorType:=set[“SQLGeneratorType”]

SetSo1ítionTask:=set[“SetSo1ítionTask”]

So1ítionTasks:=Creat[“SetSo1ítionTask”]

So1ítionSchema:=Creat[“So1ítionSchema”]

Eva1íe:=[“Eva1íation”,“Score”]

Eva1íation:=set[“Eva1íation”]

Score:=set[“Score”]

[InPut]

Inpít:=[“Creat”,“Modify”]

Creat:=Add[“Prob1ems”]

Modify:=Get[“Prob1ems”]

[OutPut]

Oítpít:=[“Eva1íation”]

Eva1íation:=set[“Eva1íation”]

根据这些接口的BNF定义,即可开发出相应的程序置于PMS-DC的相关对象中。