📄 computegame.cpp
字号:
//显示我方采取的策略
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 + -