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

📄 computegame.cpp

📁 本程序为求解博弈纳什均衡解的源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        //显示我方采取的策略
			for(int m=1;m<=m_aPolicyNum;m++)
				if(m==Equ[i][0])
				{
					str.Format("%d",1);
					m_gameResult.SetItemText(i,m,str);
				}
				else
				{
					str.Format("%d",0);
					m_gameResult.SetItemText(i,m,str);
				}
       //显示敌方采取的策略
            for(int n=1;n<=m_bPolicyNum;n++)
				if(n==Equ[i][1])
				{
					str.Format("%d",1);
					m_gameResult.SetItemText(i,m_aPolicyNum+n,str);
				}
				else
				{
					str.Format("%d",0);
					m_gameResult.SetItemText(i,m_aPolicyNum+n,str);
				}
			
		}

	}
	else
		MessageBox("没有纯纳什均衡解","提示");

  m_gameResNum1=EquNum;

}

//调用现有软件计算纳什均衡解
void CComputeGame::OnAbCompute() 
{
	// TODO: Add your control notification handler code here
	if(m_aPolicyNum > 0 && m_bPolicyNum > 0)
	{
		// 将博弈输入矩阵写入到NFG文件中
		WriteGameDataToNFG("temp.nfg");

		// 调用LCP程序计算博弈结果
		CString nfgProcName = "console1.exe -f temp.nfg";
		//ShellExecute(NULL, "open", "console1.exe", " -f temp.nfg", NULL, 0);
		WriteNFGToLCP(nfgProcName);

		// 删除临时NFG中间文件
		CFile::Remove("temp.nfg");

		// 显示博弈结果
		ShowGameResult();

		// 删除临时NFG中间文件
		CFile::Remove("output.txt");
	}
	else
		AfxMessageBox("双方策略数不能为0");
}

// 清除当前的采用比较方法求得的博弈均衡解,即清除比较方法纳什均衡解控制列表框的内容
void CComputeGame::ClearGameResult()
{
	UpdateData();

	int i, j, delRowEnable, delColEnable;

	delRowEnable = 0;
	delColEnable = 0;
	if(m_gameResNum1 > 0)						delRowEnable = 1;
	if(m_aPolicyNum > 0 && m_bPolicyNum > 0)	delColEnable = 1;

	// 删除博弈结果的所有行
	if(delRowEnable > 0)
	{
		for(i = 0; i < m_gameResNum1; i++)
		{
			m_gameResult.DeleteItem(m_gameResult.GetItemCount()-1);
		}
	}

	// 删除博弈结果的所有列
	if(delColEnable > 0)
	{
		for(j = 0; j < m_aPolicyNum + m_bPolicyNum + 2; j++)  
		{                                                      
			m_gameResult.DeleteColumn(m_aPolicyNum + m_bPolicyNum + 1 - j);
		}
	}

	m_gameResNum1 = 0;
}

//将博弈矩阵列表控制框中的敌我双方收益保存到指定文件中
void CComputeGame::WriteGameDataToNFG(CString nfgFileName)
{
	int i, j, itemCount, colNum;
	CString tempFileName, temp, num1, num2, itemText;

	UpdateData();

	itemCount = m_aPolicyNum;
	colNum = m_bPolicyNum;

	tempFileName = nfgFileName;

	// 创建临时中间文件
	CFile tempFile;
	tempFile.Open(tempFileName,
		CFile::modeReadWrite|CFile::modeCreate);

	// 写入辅助信息
	num1.Format("%d", m_aPolicyNum);
	num2.Format("%d", m_bPolicyNum);
	temp = "NFG 1 R \"Random ";
	temp += num1 + "x" + num2 + " game \" { \"Player 1\" \"Player 2\" }" + "\n\n";
	temp += "\0";
	tempFile.Write(temp, temp.GetLength());

	// 写入策略序列编号
	temp = "{ { ";
	for(i = 0; i < itemCount; i++)
	{
		num1.Format("%d", i + 1);
		temp += "\"" + num1 + "\" ";
	}
	temp += "}\n{ ";
	for(j = 1; j < colNum + 1; j++)
	{
		num2.Format("%d", j);
		temp += "\"" + num2 + "\" ";
	}
	temp += "}\n}\n";
	temp += "\"\"";
	temp += "\n";
	temp += "\n";
	temp += "\0";
	tempFile.Write(temp, temp.GetLength());

	// 博弈矩阵输入到临时中间文件中
	temp = "{\n";
	for(j = 1; j < colNum + 1; j++)
	{
		for(i = 0; i < itemCount; i++)
		{
			itemText = m_gameInput.GetItemText(i, j);
			int pos = itemText.Find(",");
			itemText.Insert(pos + 1, " ");
			temp += "{ \"\" " + itemText + " }\n";
		}
	}
	temp += "}\n";
	temp += "\0";
	tempFile.Write(temp, temp.GetLength());

	// 写入双方策略乘积编号序列
	temp = "";
	for(i = 0; i < itemCount * colNum; i++)
	{
		num1.Format("%d", i + 1);
		temp += num1 + " ";
	}
	temp += "\n";
	temp += "\0";
	tempFile.Write(temp, temp.GetLength());

	// 关闭临时中间文件
	tempFile.Close();
}

//将新输入的博弈矩阵控制列表框中的博弈内容保存到指定文件中
void CComputeGame::OnSave() 
{
	// TODO: Add your control notification handler code here
	
	CString nfgFileName;

	// 定义保存对话框
	CFileDialog saveDlg(FALSE,"",NULL,OFN_HIDEREADONLY|
		OFN_OVERWRITEPROMPT,
		"NFG(*.nfg)|*.nfg|(All Files(*.*)|*.*||",NULL);
    

	if(saveDlg.DoModal() == IDOK)
	{
		// 获取保存文件名称
		nfgFileName = saveDlg.GetPathName();
		
		// 将博弈数据按标准格式写入文件
		WriteGameDataToNFG(nfgFileName);
	}
	
}

//按照我方和敌方策略数设置初始博弈矩阵
void CComputeGame::OnSet() 
{
	// TODO: Add your control notification handler code here
	OnABConfig();
}

//清空博弈矩阵
void CComputeGame::OnAbClear() 
{
	// TODO: Add your control notification handler code here
	ClearGameInput();
}

//调用软件,计算纳什均衡解
void CComputeGame::WriteNFGToLCP(CString procName)
{
	

	PROCESS_INFORMATION pi;
    STARTUPINFO si;
   //启动信息
	memset(&si, 0, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
	si.hStdInput = 0;
	si.hStdError = 0;
	si.wShowWindow = SW_HIDE;//SW_SHOWNORMAL;
   //创建进程,开始计算
	if (CreateProcess( NULL, procName.GetBuffer(procName.GetLength()), NULL, NULL,
						TRUE, 0, NULL, NULL,
						&si, &pi)) {
	    WaitForSingleObject(pi.hProcess, INFINITE);
	    CloseHandle(pi.hThread);
	    CloseHandle(pi.hProcess);   
	}

}

// 显示调用软件求得的纳什均衡解
void CComputeGame::ShowGameResult()
{
	int i, j, commaPos, gameResReadedBytes, readNum;
	CFile gameResFile;
	CString gameRes, num, colName, rowName;
	char gameResBuf[20];
	BOOL bRowColValid;

	gameResFile.Open("output.txt", CFile::modeRead);

	bRowColValid = FALSE;

	// 博弈矩阵的行和列合法性判断
	if(m_aPolicyNum > 0 && m_bPolicyNum > 0)
		bRowColValid = TRUE;

	// 清除当前的博弈均衡解
	if(m_gameResNum2 > 0)
		ClearGameResult2();

	// 显示博弈结果的我方/敌方列集合
	if(bRowColValid == TRUE)
	{
		// 增加博弈结果序号
		m_gameResult2.InsertColumn(0, _T("序号"), LVCFMT_CENTER, 60);

		// 增加我方列集合
		for(j = 0; j < m_aPolicyNum; j++)
		{
			num.Format("%d", j + 1);
			colName = "我方策略" + num;
			m_gameResult2.InsertColumn(j + 1, colName, LVCFMT_CENTER, 150);
		}

		// 增加敌方列集合
		for(j = 0; j < m_bPolicyNum; j++)
		{
			num.Format("%d", j + 1);
			colName = "敌方策略" + num;
			m_gameResult2.InsertColumn(j + m_aPolicyNum + 1, colName, LVCFMT_CENTER, 150);
		}
	}

	                          
	// 增加博弈均衡解 ,显示博弈计算结果                                                           
	if(bRowColValid == TRUE)
	{
		if(gameResFile.GetLength() > 0)
		{
			num.Format("%d", 1);
			rowName = "均衡" + num;
			m_gameResult2.InsertItem(0, rowName);
			m_gameResNum2 = 1;
		}
		i = 0;
		j = 1;
		gameResReadedBytes = 0;
		while((readNum = gameResFile.Read(gameResBuf, 20)) > 2)
		{
			gameRes = "";
			gameRes.Insert(0, gameResBuf);
			commaPos = gameRes.Find(",");
			gameRes = gameRes.Left(commaPos);
			if(gameRes.Find("\n") >= 0)
			{
				i = i + 1;
				j = 1;
				gameRes = gameRes.Right(gameRes.GetLength() - 2);
				num.Format("%d", i + 1);
				rowName = "均衡" + num;
				m_gameResult2.InsertItem(i, rowName);
				m_gameResNum2 = m_gameResNum2 + 1;
				gameResReadedBytes = gameResReadedBytes + gameRes.GetLength() + 1 + 2;
			}
			else
				gameResReadedBytes = gameResReadedBytes + gameRes.GetLength() + 1;
			m_gameResult2.SetItemText(i, j, gameRes);
			gameResFile.Seek(gameResReadedBytes, CFile::begin);
			j = j + 1;
			gameResBuf[0] = '\0';
		}
	}

	// 关闭文件
	gameResFile.Close();
}

//清除采用调用软件方法求得的纳什均衡解
void CComputeGame::ClearGameResult2()
{
	UpdateData();

	int i, j, delRowEnable, delColEnable;

	delRowEnable = 0;
	delColEnable = 0;
	if(m_gameResNum2 > 0)						delRowEnable = 1;
	if(m_aPolicyNum > 0 && m_bPolicyNum > 0)	delColEnable = 1;

	// 删除博弈结果的所有行
	if(delRowEnable > 0)
	{
		for(i = 0; i < m_gameResNum2; i++)
		{
			m_gameResult2.DeleteItem(m_gameResult2.GetItemCount()-1);
		}
	}

	// 删除博弈结果的所有列
	if(delColEnable > 0)
	{
		for(j = 0; j < m_aPolicyNum + m_bPolicyNum + 2; j++)  
		{                                                      
			m_gameResult2.DeleteColumn(m_aPolicyNum + m_bPolicyNum + 1 - j);
		}
	}

	m_gameResNum2 = 0;
}

// 从博弈矩阵列表控制框中读取我方及敌方的收益
void CComputeGame::GetCtrlListData()
{
	int i, j, itemCount, colNum;
	CString itemText,firstr,secstr;
	double firdata,secdata;

	UpdateData();
	itemCount = m_aPolicyNum;  //我方策略数
	colNum = m_bPolicyNum;    //敌方策略数
	
	for(i = 0; i< itemCount; i++)
	{
		for(j = 1; j < colNum+1; j++)
		{
			//读取列表控制框中的一个表项(某一局势下我方及敌方的收益)
			itemText = m_gameInput.GetItemText(i, j);
		
			//提取我方收益
			int pos = itemText.Find(",");
			firstr=itemText.Left(pos);
			firdata=atof(firstr);
			GameData[i][j-1][0]=firdata;
			
			//提取敌方收益
			secstr=itemText.Right(itemText.GetLength()-pos-1);
			secdata=atof(secstr);
            GameData[i][j-1][1]=secdata;
			
		}
	}
	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -