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

📄 strategy_2.cpp

📁 银行排队的数学模型的实现 问题: n银行有n个窗口对外营业
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////
//策略二
//
//

#include <fstream.h>

#include "strategy_2.h"

Service_Window_2::Service_Window_2()
{
	Service_client = NULL;
}
Service_Window_2::~Service_Window_2()
{
	SAFEDELETE(Service_client);
}
int		Service_Window_2::Free()
{
	SAFEDELETE(Service_client);
	return	TRUE;
}

Strategy_2::Strategy_2()														// 构造函数,将所需数据初始化
{
	m_pWindows = NULL;
	m_nWindow_num = 0;
	m_nWait_time = 0;
	m_nWait_client_num = 0;
	m_Flag_inputed = FALSE;
	m_Flag_simulated = FALSE;
	m_nClient_num = 0;
	m_nTime = 0;	
}

Strategy_2::~Strategy_2()														// 析构函数,归还所申请的内存
{
	for (int i=0; i<m_nWindow_num; i++)
	{
		m_pWindows[i].Free();
	}
	SAFEDELETES(m_pWindows);
}

int		Strategy_2::Initial()													// 初始化数据
{
	SAFEDELETES(m_pWindows);
	m_pWindows = NULL;
	m_nWindow_num = 0;
	m_nWait_client_num = 0;
	m_nWait_time = 0;
	m_Flag_inputed = FALSE;
	m_Flag_simulated = FALSE;
	m_nClient_num = 0;
	m_nTime = 0;
	m_Client.Free();
	m_Wait_client.Free();
	return TRUE;
}
int		Strategy_2::Input_Queue()												// 从文件输入队列
{
	Initial();
	fstream	input_client;
	input_client.open("custom.txt", ios::in);
	if (!input_client)
	{
		cout << "Warning: File custom.txt can't open!";
		return FALSE;
	}
	input_client >> m_nWindow_num >> m_nClient_num;
	m_pWindows = new Service_Window_2[m_nWindow_num];
	int	narrive_time, ndeal_time;
	for (int i=0; i<m_nClient_num; i++)
	{
		input_client >> narrive_time >> ndeal_time;
		m_Client.Join_Queue(narrive_time, ndeal_time);
	}
	input_client.close();
	m_Flag_inputed = TRUE;
	return TRUE;
}

int		Strategy_2::Simulation()												// 模拟策略二
{
	if (!m_Flag_inputed)
	{
		cout << "Input the data first" << endl;
		return FALSE;
	}
	m_nTime = 0;
	fstream		output_simulation;
	output_simulation.open("strategy_simulation_2.txt", ios::out);
	if (!output_simulation)
	{
		cout << "Warning: File strategy_simulation_2.txt can't build!";
		return FALSE;
	}
	output_simulation << "NOTE: (arrive time, deal time)" << endl <<"----------------------------------------------------" << endl;
	output_simulation.close();

	do 
	{
		int		flag_output = FALSE;											
		while (m_Client.m_pHead && m_Client.m_pHead->m_nArrive_Time==m_nTime)						// 判断是否有顾客进入银行
		{
			flag_output = TRUE;
			Client*	ptemp;
			ptemp = m_Client.m_pHead;
			m_Client.m_pHead = m_Client.m_pHead->m_pNext;
			if (m_Client.m_pHead)
			{
				m_Client.m_pHead->m_pPrev = NULL;	
			}
			else
			{
				m_Client.m_pRear = NULL;
			}
			m_Wait_client.Push_Client(ptemp);
			m_nWait_client_num++;
		}
		for (int j=0; j<m_nWindow_num; j++)																// 判断正在办理业务的顾客是否要离开
		{
			if (m_pWindows[j].Service_client && m_pWindows[j].Service_client->m_nBegin_deal_time+m_pWindows[j].Service_client->m_nDeal_Time<=m_nTime)
			{
				flag_output = TRUE;
				m_pWindows[j].Free();
			}
		}
		for (int i=0; i<m_nWindow_num; i++)																// 判断正在等待的客户是否可以开始办理业务
		{
			if (!m_pWindows[i].Service_client)
			{
				if (m_Wait_client.m_pHead)
				{
					flag_output = TRUE;
					m_pWindows[i].Service_client = m_Wait_client.m_pHead;
					m_pWindows[i].Service_client->m_nBegin_deal_time = m_nTime;
					m_Wait_client.m_pHead = m_Wait_client.m_pHead->m_pNext;
					if (m_Wait_client.m_pHead)
					{
						m_Wait_client.m_pHead->m_pPrev = NULL;
					}
					else
					{
						m_Wait_client.m_pRear = NULL;
					}
					m_pWindows[i].Service_client->m_pNext = NULL;
					m_pWindows[i].Service_client->m_pPrev = NULL;
					m_nWait_client_num--;
				}			
			}
		}
		m_nWait_time += m_nWait_client_num;
		if (flag_output)
		{
			Output_Simulation();
		}
		m_nTime++;	
	} while(m_Client.m_pHead || m_Wait_client.m_pHead);
	m_Flag_simulated = TRUE;
	return	TRUE;
}

int		Strategy_2::Output_Result()
{	
	if (!m_Flag_inputed)
	{
		cout << "Input the data first" << endl;
		return FALSE;
	}
	if (!m_Flag_simulated)
	{
		cout << "Simulate first" << endl;
		return FALSE;
	}
	fstream		output_client;
	output_client.open("strategy_2.txt", ios::out);
	if (!output_client)
	{
		cout << "Warning: File strategy_2.txt can't build!";
		return FALSE;
	}
	output_client << "strategy 2:" << endl;
	cout << "strategy 2:" << endl;
	output_client << "service windows number: " << m_nWindow_num << endl;
	cout << "service windows number: " << m_nWindow_num << endl;
	output_client << "client number: " << m_nClient_num << endl;
	cout << "client number: " << m_nClient_num << endl;
	output_client << "average wait time: " << (double)m_nWait_time/m_nClient_num << endl; 
	cout << "average wait time: " << (double)m_nWait_time/m_nClient_num << endl << endl; 
	output_client.close();
	return	TRUE;
}


int		Strategy_2::Output_Simulation()
{
	fstream	output_simulation;
	output_simulation.open("strategy_simulation_2.txt", ios::app);
	if (!output_simulation)
	{
		cout << "Warning: File strategy_simulation_2.txt can't build!";
		return FALSE;
	}
	output_simulation << "TIME NOW: " << m_nTime << endl;
	for (int i=0; i<m_nWindow_num; i++)
	{
		output_simulation << "window " << i+1 << ": ";
		if (m_pWindows[i].Service_client)
		{
			output_simulation << "(" << m_pWindows[i].Service_client->m_nArrive_Time << ", " << m_pWindows[i].Service_client->m_nDeal_Time << ")";
		}
		output_simulation << endl;
	}
	Client*	ptemp = m_Wait_client.m_pHead;
	output_simulation << "clients: ";
	int		j = 0;
	while (ptemp)
	{
		j++;
		output_simulation << "(" << ptemp->m_nArrive_Time << ", " << ptemp->m_nDeal_Time << "), ";
		ptemp = ptemp->m_pNext;
		if (j%10==0)
		{
			output_simulation << endl;
		}
	}
	output_simulation << endl;
	output_simulation << endl << "----------------------------------------------------" << endl;
	output_simulation.close();
	return	TRUE;
}

⌨️ 快捷键说明

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