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

📄 keypathview.cpp

📁 利用Visual c++编程思想方法实现基于交通网络关键路径算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	edgenode *p;
	StepRun(10);
	total = 0;
	
	StepRun(11);

	for(i = 0; i < citynumber; i++) {
		StepRun(12);

		ve[i] = 0;

		StepRun(11);
	}
	StepRun(13);

	for(i = 0; i < citynumber; i++)
	{
		StepRun(14);
		if(graphicmap[i].id == 0)
		{
			StepRun(15);
			topologystack[++rear] = i;
			StepRun(16);
			m++;
			StepRun(13);
		}
		StepRun(13);
	}
	StepRun(19);
	while(front != rear)
	{
		StepRun(20);
		front++;
		StepRun(21);
		j = topologystack[front];
		StepRun(22);
		m++;
		StepRun(23);
		p = graphicmap[j].link ;
		StepRun(24);
		while(p)
		{
			StepRun(25);
			k = p->adjvex ;
			StepRun(26);
			graphicmap[k].id--;
			StepRun(27);
			if(ve[j] + p->dut > ve[k]) {
				StepRun(28);
				ve[k] = ve[j] + p->dut ;
				StepRun(27);
			}
			StepRun(30);
			if(graphicmap[k].id == 0) {
				StepRun(31);
				topologystack[++rear] = k;
				StepRun(30);
			}
			StepRun(32);
			p = p->next ;
			StepRun(24);
		}
		StepRun(19);
	}
	StepRun(35);
	if(m < citynumber)
	{
		StepRun(36);
		m_resultList.AddString("本程序所建立的交通网有回路不可计算出关键路径");
		StepRun(37);
		return 0;
	}
	StepRun(39);
	total = ve[citynumber-1];
	StepRun(40);
	for(i = 0; i < citynumber; i++) {
		StepRun(41);
		vl[i] = total;
		StepRun(40);
	}
	StepRun(42);

	for(i = citynumber - 2; i >= 0; i--)
	{
		StepRun(43);
		j = topologystack[i];
		StepRun(44);
		p = graphicmap[j].link ;
		StepRun(45);
		while(p)
		{
			StepRun(46);
			k = p->adjvex ;
			StepRun(47);
			if((vl[k] - p->dut ) < vl[j]) {
				StepRun(48);
				vl[j] = vl[k] - p->dut ;
				StepRun(49);
			}
			StepRun(49);
			p = p->next ;
			StepRun(45);
		}
		StepRun(42);
	}
	StepRun(52);
	i = 0;
	
	CString veStr = _T("最早发生时间:");
	CString vlStr = _T("最迟发生时间:");
	CString tmp;
	for(j = 0; j < citynumber; j++)
	{
		tmp.Format("%d", ve[j]);
		veStr += "(";
		veStr += pointVec[j].name;
		veStr += ",";
		veStr += tmp;
		veStr += ") ";
		
		tmp.Format("%d", vl[j]);
		vlStr += "(";
		vlStr += pointVec[j].name;
		vlStr += ",";
		vlStr += tmp;
		vlStr += ") ";
	}
	m_varList.AddString(veStr);
	m_varList.AddString(vlStr);
	
	for(j = 0; j < citynumber; j++)
	{
		StepSlowRun(53);
		p = graphicmap[j].link;
		StepSlowRun(54);
		while(p)
		{
			StepSlowRun(55);
			k=p->adjvex;
			StepSlowRun(56);
			e[++i]=ve[j];
			StepSlowRun(57);
			l[i]=vl[k]-p->dut;
			StepSlowRun(58);
			
			//最早开始时间  e[i]

			//最迟开始时间  l[i]

			//差值 l[i]-e[i]

			if(l[i] == e[i]) {
				StepSlowRun(59);
				//计算关键路径
				for (int kkk = 0; kkk < edgeVec.size(); kkk++) {
					if (edgeVec[kkk].prevPoint->id == (graphicmap[j].trafficnetname + 1)
						&& edgeVec[kkk].nextPoint->id == (graphicmap[k].trafficnetname + 1)
						) {
							edgeVec[kkk].isKey = 1;
						}
				}
				pointVec[graphicmap[j].trafficnetname].isKey = 1;
				pointVec[graphicmap[k].trafficnetname].isKey = 1;
			} else {
				StepSlowRun(61);
				//非关键路径
				for (int kkk = 0; kkk < edgeVec.size(); kkk++) {
					if (edgeVec[kkk].prevPoint->id == (graphicmap[j].trafficnetname + 1)
						&& edgeVec[kkk].nextPoint->id == (graphicmap[k].trafficnetname + 1)
						) {
						curPath = kkk;
					}
				}
			}
			StepSlowRun(63);
			ReDrawAll();
			
			p=p->next ;
			StepSlowRun(54);
		}
		StepSlowRun(52);
	}
	StepSlowRun(66);
	



	curPath = -1;
	ReDrawAll();
	return 1;
}

/************************************************************************/
/* 求直线与圆的交点坐标                                                 */
/* (x1, y1)、(x2,y2) 直线上两点坐标                                     */
/* (cx1, cy1) 圆心坐标                                                  */
/* radio 圆半径                                                         */
/* (jx, jy) 计算出的在直线上且在(x1, y1)、(x2,y2) 两点之间的点坐标      */
/* dt沿直线进行平移的数值                                               */
/************************************************************************/
void CKeyPathView::GetJionPointCoor(int x1, int y1, int x2, int y2, int cx1, int cy1, int radio, int & jx, int & jy, int dt)
{
	if (x1 == x2) {
		//沿x轴线平行
	} else if (y1 == y2) {
		//沿y轴线平行
	} else {
		//任意直线
	}
	jx = cx1;
	jy = cy1;
}

BOOL CKeyPathView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

void CKeyPathView::ShowProgram()
{
	m_programList.AddString("01   ");
	m_programList.AddString("02   int CKeyPathView::SearchKeyPath(vexnode* graphicmap,int citynumber,int activenumber,int& total) {");
	m_programList.AddString("03       int i, j, k, m = 0;");
	m_programList.AddString("04       int front = -1, rear = -1;");
	m_programList.AddString("05       int* topologystack = (int*) malloc(citynumber * sizeof(int)); ");
	m_programList.AddString("06       int* vl = (int*) malloc(citynumber * sizeof(int));");
	m_programList.AddString("07       int* ve = (int*) malloc(citynumber * sizeof(int));");
	m_programList.AddString("08       int* l = (int*) malloc(activenumber * sizeof(int));");
	m_programList.AddString("09      int* e = (int*) malloc(activenumber * sizeof(int));");
	m_programList.AddString("10      edgenode *p;");
	m_programList.AddString("11      total = 0;");
	m_programList.AddString("12      for(i = 0; i < citynumber; i++) ");
	m_programList.AddString("13          ve[i] = 0;");
	m_programList.AddString("14      for(i = 0; i < citynumber; i++) {");
	m_programList.AddString("15          if(graphicmap[i].id == 0) {");
	m_programList.AddString("16              topologystack[++rear] = i;");
	m_programList.AddString("17              m++;");
	m_programList.AddString("18          }");
	m_programList.AddString("19      }");
	m_programList.AddString("20      while(front != rear) {");
	m_programList.AddString("21          front++;");
	m_programList.AddString("22          j = topologystack[front];");
	m_programList.AddString("23          m++;");
	m_programList.AddString("24          p = graphicmap[j].link;");
	m_programList.AddString("25          while(p) {");
	m_programList.AddString("26              k = p->adjvex;");
	m_programList.AddString("27              k = p->adjvex;");
	m_programList.AddString("28              graphicmap[k].id--;");
	m_programList.AddString("29              if(ve[j] + p->dut > ve[k])");
	m_programList.AddString("30                  ve[k] = ve[j] + p->dut;");
	m_programList.AddString("31              if(graphicmap[k].id == 0)");
	m_programList.AddString("32                  topologystack[++rear] = k;");
	m_programList.AddString("33              p = p->next;");
	m_programList.AddString("34          }");
	m_programList.AddString("35      }");
	m_programList.AddString("36      if(m < citynumber) {");
	m_programList.AddString("37          MessageBox(\"本程序所建立的交通网有回路不可计算出关键路径\");");
	m_programList.AddString("38          return 0;");
	m_programList.AddString("39      }");
	m_programList.AddString("40      total = ve[citynumber-1];");
	m_programList.AddString("41      for(i = 0; i < citynumber; i++)");
	m_programList.AddString("42          vl[i] = total;");
	m_programList.AddString("43      for(i = citynumber - 2; i >= 0; i--) {");
	m_programList.AddString("44          j = topologystack[i];");
	m_programList.AddString("45          p = graphicmap[j].link;");
	m_programList.AddString("46          while(p) {");
	m_programList.AddString("47              k = p->adjvex;");
	m_programList.AddString("48              if((vl[k] - p->dut ) < vl[j])");
	m_programList.AddString("49                  vl[j] = vl[k] - p->dut;");
	m_programList.AddString("50              p = p->next;");
	m_programList.AddString("51          }");
	m_programList.AddString("52      }");
	m_programList.AddString("53      for(j = 0; j < citynumber; j++) {");
	m_programList.AddString("54          p = graphicmap[j].link;");
	m_programList.AddString("55          while(p) {");
	m_programList.AddString("56              k=p->adjvex;");
	m_programList.AddString("57              e[++i]=ve[j];");
	m_programList.AddString("58              l[i]=vl[k]-p->dut;");
	m_programList.AddString("59              if(l[i] == e[i]) {");
	m_programList.AddString("60			         //关键路径");
	m_programList.AddString("61              } else {");
	m_programList.AddString("62                  //非关键路径");
	m_programList.AddString("63              }");
	m_programList.AddString("64              p=p->next;");
	m_programList.AddString("65          }");
	m_programList.AddString("66      }");
	m_programList.AddString("67      return 1;");
	m_programList.AddString("68  }");
	m_programList.AddString("69     ");
}

/************************************************************************/
/* 模拟程序运行,时间值请自行设定                                        */
/************************************************************************/
void CKeyPathView::StepRun(int num)
{
	m_programList.SetCurSel(num);
	m_programList.Invalidate(FALSE);
	step = false;
	stepTime = 0;
	while (stepTime < 5) {
		Sleep(10);
		stepTime++;
	}
	step = true;
}

/************************************************************************/
/* 模拟程序运行,时间值请自行设定                                        */
/************************************************************************/
void CKeyPathView::StepSlowRun(int num)
{
	m_programList.SetCurSel(num);
	m_programList.Invalidate(FALSE);
	step = false;
	stepTime = 0;
	while (stepTime < 5) {
		Sleep(40);
		stepTime++;
	}
	step = true;
}

void CKeyPathView::OnTimer(UINT nIDEvent) 
{
	step = true;
	KillTimer(1);
	CFormView::OnTimer(nIDEvent);
}

int CKeyPathView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFormView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	m_keyPathStc.Create("", WS_CHILD|WS_VISIBLE, CRect(0,0, 580, 460), this, IDC_DRAW_STC);
	m_programList.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL|WS_HSCROLL, CRect(582,0,1000,466), this, IDC_PROGRAM_LIST);
	m_programList.SetHorizontalExtent(700);
	ShowProgram();
	StepRun(0);
	
	//结果列表
	m_resultList.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL|WS_HSCROLL, CRect(0,462,582,660), this, IDC_RESULT_LIST);
	
	//结果列表
	m_varList.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_HSCROLL|WS_HSCROLL, CRect(582,462,1000,660), this, IDC_VAR_NUM_LIST);
	m_varList.SetHorizontalExtent(700);
	return 0;
}

void CKeyPathView::OnFileNew() 
{
	drawType = 0;
	prev = -1;
	next = -1;
	startCalPoint = 0;
	endCalPoint = 0;
	curPath = -1;
	movePic = false;

	pointVec.clear();
	edgeVec.clear();

	theApp.m_PathTitle = _T("");
	theApp.m_PathTitleID = -1;

	m_resultList.ResetContent();
	m_varList.ResetContent();

	ReDrawAll();
}

void CKeyPathView::OnFileOpen() 
{
	CProjectSelDlg dlg;
	if (dlg.DoModal() == IDOK) {
		if (theApp.m_PathTitle.GetLength() > 0) {
			
			drawType = 0;
			prev = -1;
			next = -1;
			curPath = -1;
			movePic = false;
			
			pointVec.clear();
			edgeVec.clear();
			
			ReDrawAll();
			
			//获取当前程序所在物理路径
			//程序所在目录全路径。
			TCHAR exeFullPath[MAX_PATH];
			CString theConnUdl;
			GetCurrentDirectory(MAX_PATH, exeFullPath);

			//数据库连接指针
			_ConnectionPtr m_accessConn;
			//数据库结果集指针
			_RecordsetPtr m_accessRS;

			//初始化数据库连接
			theConnUdl.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s\\key_path.mdb;Jet OLEDB:Database Password=;", exeFullPath);
			HRESULT hr;
			try
			{
				hr = m_accessConn.CreateInstance("ADODB.Connection"); // 创建Connection对象
				if(SUCCEEDED(hr))
				{
					hr = m_accessConn->Open((_bstr_t) theConnUdl, "", "", adModeUnknown);
				} 
				
			}
			catch(_com_error e)// 捕捉异常
			{		
				MessageBox("连接数据库失败");
				return;
			}
			
			//初始化数据库
			m_accessRS.CreateInstance(_uuidof(Recordset));
			m_accessRS->CursorType = adOpenStatic;
			m_accessRS->CursorLocation = adUseClient;
			
			CString theSql;
			int i = 0;
			
			//获取顶点信息
			theSql.Format("select id, point_id, name, memo, radius, x_axis, y_axis, project_id from point_info where project_id = %s order by point_id ASC", theApp.m_PathTitleID);
			m_accessRS = m_accessConn->Execute(_bstr_t(theSql), NULL, adCmdText);
			while (!m_accessRS->adoEOF) {
				CPointInfo pInfo;
				pInfo.pointID = atoi((LPCTSTR)(_bstr_t) m_accessRS->GetCollect("id"));
				pInfo.xAxis = atoi((LPCTSTR)(_bstr_t) m_accessRS->GetCollect("x_axis"));
				pInfo.yAxis = atoi((LPCTSTR)(_bstr_t) m_accessRS->GetCollect("y_axis"));
				pInfo.color = pointColor;
				pInfo.name = (LPCTSTR)(_bstr_t) m_accessRS->GetCollect("name");
				pInfo.memo = (LPCTSTR)(_bstr_t) m_accessRS->GetCollect("memo");
				int i = pointVec.size();
				pInfo.id = ++i;
				pointVec.push_back(pInfo);

				m_accessRS->MoveNext();
			}

			//获取路径信息

⌨️ 快捷键说明

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