⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intelligence.cpp

📁 用VC编制的集成的野人和八数码演示程序。其中野人程序用动态的效果演示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//-------------------------------------------------------------------------------------------------
//-------人工智能问题的实现文件       作者:申徐洲        日期: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 + -