📄 intelligence.cpp
字号:
//-------------------------------------------------------------------------------------------------
//-------人工智能问题的实现文件 作者:申徐洲 日期:2004年5月22日 AllRightsReserve
//-------------------------------------------------------------------------------------------------
#include "StdAfx.h"
#include ".\Intelligence.h"
//-------------------------------------------构造函数----------------------------------------------
CIntelligence::CIntelligence(void)
{
m_pConnection.CreateInstance( __uuidof( Connection ) );
m_pConnection->Open("AI","","",16);
m_pRecordSet.CreateInstance( __uuidof( Recordset ) );
m_pResult = NULL;
m_pInitAi = NULL;
m_pExitAi = NULL;
}
//----------------------------------------虚拟析构函数---------------------------------------------
CIntelligence::~CIntelligence(void)
{
m_pRecordSet->Open( "select * from Destination", "AI", adOpenDynamic, adLockOptimistic, adCmdUnknown );
if ( !m_pRecordSet->AdoEof )
m_pRecordSet->MoveFirst();
while ( !m_pRecordSet->AdoEof )
{
m_pRecordSet->Delete( adAffectCurrent );
m_pRecordSet->MoveNext();
}
m_pRecordSet->Close();
//m_pConnection->Close();
TIntelligencePtr i_pIntelligence; TInitAiPtr i_pInitAi; TExitAiPtr i_pExitAi;
while ( m_pResult )
{
i_pIntelligence = m_pResult;
m_pResult = m_pResult->pNext;
delete( i_pIntelligence );
}
while ( m_pInitAi )
{
i_pInitAi = m_pInitAi;
m_pInitAi = m_pInitAi->pNext;
delete( i_pInitAi );
}
while ( m_pExitAi )
{
i_pExitAi = m_pExitAi;
m_pExitAi= m_pExitAi->pNext;
delete( i_pExitAi );
}
}
//--------------------------------------------初始化--------------------------------------------------
bool CIntelligence::initIntelligence(CString strSource, CString strDestination)
{
if( isValid( strSource, strDestination ) )
{
m_strSource = strSource;
m_strDestination = strDestination;
m_nTotalNum = 1; // 总结点数量是1
m_nDepth = 1; // 深度是1
_variant_t i_strSql = "select * from Destination";
FieldsPtr i_pFields;
FieldPtr i_pField;
m_pRecordSet->Open( i_strSql, "AI", adOpenDynamic, adLockOptimistic, adCmdUnknown );
if ( !m_pRecordSet->AdoEof )
m_pRecordSet->MoveFirst();
while ( !m_pRecordSet->AdoEof )
{
m_pRecordSet->Delete( adAffectCurrent );
m_pRecordSet->MoveNext();
}
i_pFields = m_pRecordSet->Fields;
m_pRecordSet->AddNew();
i_pField = i_pFields->Item["Source"]; i_pField->PutValue( (_bstr_t)"" );
i_pField = i_pFields->Item["Destination"]; i_pField->PutValue( (_bstr_t)strSource );
i_pField = i_pFields->Item["Weight"]; i_pField->PutValue( 0 );
i_pField = i_pFields->Item["Depth"]; i_pField->PutValue( 1 );
i_pField = i_pFields->Item["Breadth"]; i_pField->PutValue( 1 );
i_pField = i_pFields->Item["IsMinValue"]; i_pField->PutValue( true );
i_pField = i_pFields->Item["IsVisited"]; i_pField->PutValue( false );
i_pField = i_pFields->Item["IsSolution"]; i_pField->PutValue( false );
i_pField = i_pFields->Item["Sort"]; i_pField->PutValue( 1 );
m_pRecordSet->Update();
m_pRecordSet->Close();
return true;
}
else
return false;
}
//-----------------------------------A*算法搜索人工智能问题------------------------------------------
bool CIntelligence::searchByAlgorithm(void)
{
CString i_strCurrent;
for ( ; ; )
{
i_strCurrent = findMinCost();
if ( isGoal( i_strCurrent ) )
{
findAnswer();
return true;
}
if ( i_strCurrent=="" )
return false;
newIntelligence( i_strCurrent );
}
}
//------------------------------------------获取初始化结点---------------------------------------
TInitAiPtr CIntelligence::getInitAi(bool bSrcOrDst)
{
TInitAiPtr i_pNew, i_pTail;
_bstr_t i_strSql;
FieldsPtr i_pFields; FieldPtr i_pField;
int i_nFlag = 0; bool i_bIsExist;
while ( m_pInitAi )
{
i_pTail = m_pInitAi;
m_pInitAi = m_pInitAi->pNext;
delete( i_pTail );
}
if ( bSrcOrDst )
i_strSql = "select Source from Source order by Source";
else
i_strSql = "select Destination from Source order by Destination";
m_pRecordSet->Open( i_strSql, "AI", adOpenDynamic, adLockReadOnly, adCmdUnknown );
if ( !m_pRecordSet->AdoEof )
m_pRecordSet->MoveFirst();
i_pFields = m_pRecordSet->Fields;
while ( !m_pRecordSet->AdoEof)
{
i_nFlag++;
if ( bSrcOrDst )
i_pField = i_pFields->Item["Source"];
else
i_pField = i_pFields->Item["Destination"];
i_bIsExist = false;
i_pNew = m_pInitAi;
while ( i_pNew )
{
if ( i_pNew->strNode == (CString)i_pField->Value )
{
i_bIsExist = true;
break;
}
i_pNew = i_pNew->pNext;
}
if ( !i_bIsExist )
{
i_pNew = new TInitAi;
i_pNew->strNode = i_pField->Value;
i_pNew->pNext = NULL;
if ( i_nFlag==1 )
{
m_pInitAi = i_pNew;
i_pTail = i_pNew;
}
else
{
i_pTail->pNext = i_pNew;
i_pTail = i_pNew;
}
}
m_pRecordSet->MoveNext();
}
m_pRecordSet->Close();
return m_pInitAi;
}
//-------------------------------------------获取结果结点----------------------------------------
TExitAiPtr CIntelligence::getExitAi(CString strNode)
{
TExitAiPtr i_pNew, i_pTail;
_bstr_t i_strSql;
FieldsPtr i_pFields; FieldPtr i_pField;
int i_nFlag = 0;
while ( m_pExitAi )
{
i_pTail = m_pExitAi;
m_pExitAi = m_pExitAi->pNext;
delete( i_pTail );
}
if ( strNode=="" )
i_strSql = "select * from Destination order by Destination,Sort";
else
i_strSql = "select * from Destination where Destination='"+strNode+"' order by Destination,Sort";
m_pRecordSet->Open( i_strSql, "AI", adOpenDynamic, adLockReadOnly, adCmdUnknown );
if ( !m_pRecordSet->AdoEof )
m_pRecordSet->MoveFirst();
i_pFields = m_pRecordSet->Fields;
while ( !m_pRecordSet->AdoEof )
{
i_nFlag++;
i_pNew = new TExitAi;
i_pField = i_pFields->Item["Source"]; i_pNew->strSource = i_pField->Value;
i_pField = i_pFields->Item["Destination"]; i_pNew->strDestination = i_pField->Value;
i_pField = i_pFields->Item["Sort"]; i_pNew->strOrder = i_pField->Value;
i_pField = i_pFields->Item["Weight"]; i_pNew->strWeight = i_pField->Value;
i_pNew->pNext = NULL;
if ( i_nFlag == 1 )
{
m_pExitAi = i_pNew;
i_pTail = i_pNew;
}
else
{
i_pTail->pNext = i_pNew;
i_pTail = i_pNew;
}
m_pRecordSet->MoveNext();
}
m_pRecordSet->Close();
return m_pExitAi;
}
//-------------------------------------------获取结果链表----------------------------------------
TIntelligencePtr CIntelligence::getResultList(void)
{
return m_pResult;
}
//----------------------------------------获取结果总结点数量-------------------------------------
int CIntelligence::getResultNum(void)
{
return m_nTotalNum;
}
//-------------------------------------------获取结果深度----------------------------------------
int CIntelligence::getResultDepth(void)
{
return m_nDepth;
}
//----------------------------------显示A*算法的结果树控件------------------------------------------
void CIntelligence::showTree(CTreeCtrl* pThisTree, UINT nID, UINT nID_, TIntelligencePtr pIntelligence)
{
if ( !pIntelligence )
return;
CImageList* i_pImageList; CBitmap i_cBitmap, i_cBitmap_;
TV_INSERTSTRUCT structInsert; HTREEITEM hTree;
_bstr_t i_strSource;
pThisTree->SetTextColor(RGB(0,0,255));
i_pImageList = new CImageList();
i_pImageList->Create( 16, 16, ILC_COLOR16, 2, 4);
i_cBitmap.LoadBitmap( nID );
i_pImageList->Add( &i_cBitmap, (COLORREF)0x000000 );
i_cBitmap_.LoadBitmap( nID_ );
i_pImageList->Add( &i_cBitmap_, (COLORREF)0x000000 );
i_cBitmap.DeleteObject(); i_cBitmap_.DeleteObject();
pThisTree->SetImageList( i_pImageList, TVSIL_NORMAL );
while ( pIntelligence )
{
if ( pIntelligence->pParent )
structInsert.hParent = pIntelligence->pParent->hTree;
else
structInsert.hParent = NULL;
structInsert.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
i_strSource = ( _bstr_t )pIntelligence->strNode;
structInsert.item.pszText = i_strSource;
if ( pIntelligence->bIsSolution )
{
structInsert.item.iImage = 1;
structInsert.item.iSelectedImage= 1;
}
else
{
structInsert.item.iImage = 0;
structInsert.item.iSelectedImage= 0;
}
hTree = pThisTree->InsertItem(&structInsert);
pIntelligence->hTree = hTree;
pIntelligence = pIntelligence->pNext;
}
/*i_pCurrent = m_pResult;
while ( i_pCurrent )
{
i_pThisTree->Expand( i_pCurrent->hTree, TVE_EXPAND );
i_pCurrent = i_pCurrent->pNext;
}*/
}
//---------------------------------显示A*算法的结果列表控件-----------------------------------------
void CIntelligence::showList(CListCtrl* pThisList, CString strNode, int nWidth)
{
TExitAiPtr i_pExitAi = getExitAi(strNode);
LV_COLUMN i_lvColumn; LV_ITEM i_lvItem;
char* i_aColumn[4]={ "源结点", "父结点", "扩展次序", "权值" };
int i_nNum;
pThisList->SetTextColor( RGB( 0, 0, 255) );
i_lvColumn.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
i_lvColumn.fmt = LVCFMT_LEFT;
i_lvColumn.cx = nWidth;
for ( i_nNum=0; i_nNum<4; i_nNum++ )
{
pThisList->DeleteColumn( i_nNum );
i_lvColumn.pszText = i_aColumn[i_nNum];
i_lvColumn.iSubItem = i_nNum;
pThisList->InsertColumn( i_nNum, &i_lvColumn );
}
pThisList->DeleteAllItems();
i_lvItem.mask = LVIF_TEXT;
i_nNum = 0;
while ( i_pExitAi )
{
i_lvItem.pszText = (LPTSTR)(LPCTSTR)i_pExitAi->strDestination;
i_lvItem.iItem = i_nNum;
i_lvItem.iSubItem = 0;
pThisList->InsertItem( &i_lvItem );
pThisList->SetItemText( i_nNum, 1, (LPTSTR)(LPCTSTR)i_pExitAi->strSource );
pThisList->SetItemText( i_nNum, 2, (LPTSTR)(LPCTSTR)i_pExitAi->strOrder );
pThisList->SetItemText( i_nNum, 3, (LPTSTR)(LPCTSTR)i_pExitAi->strWeight );
i_nNum++;
i_pExitAi = i_pExitAi->pNext;
}
}
//-----------------------------------判断当前状态是否合法------------------------------------------
bool CIntelligence::isValid(CString strSource, CString strDestination)
{
_variant_t i_strSql;
i_strSql = "select * from Source where Source = '" + strSource + "'";
m_pRecordSet->Open( i_strSql, "AI", adOpenDynamic, adLockReadOnly, adCmdUnknown);
if ( m_pRecordSet->AdoEof )
{
m_pRecordSet->Close();
return false;
}
m_pRecordSet->Close();
i_strSql = "select * from Source where Destination = '" + strDestination + "'";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -