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

📄 maindrive.cs

📁 petriNet model
💻 CS
字号:
using System;

namespace MyPetriNet
{
	/// <summary>
	/// Class1 的摘要说明。
	/// </summary>
	class MainDrive
	{
		public  static void initialplaces(Place[] P)
		{
			int i;
			for(i=1;i<8;i++)
			{
				P[i]=new Place();
				P[i].TokenNumber=0;
				P[i].PlaceId=i;
			}
			P[1].PlaceName="A:Wait for Ack 0";
			P[2].PlaceName="B:Wait for Ack 1";
			P[3].PlaceName="C:Seq 0 on the line";
			P[4].PlaceName="D:Ack on the line";
			P[5].PlaceName="E:Seq 1 on the line";
			P[6].PlaceName="F:Expect 1";
			P[7].PlaceName="G:Expect 0";
			for(i=1;i<8;i++)
			{
				Console.WriteLine(P[i].PlaceName.ToString());	
			}
		}
		public static void initialTransition(Transition[] T)
		{
			int i;
			for(i=1;i<12;i++)
			{
				T[i]=new Transition();
				T[i].TransitionId=i;
            }
			T[1].TransitionName="1:Emit 0";
			T[2].TransitionName="2:TimeOut";
			T[3].TransitionName="3:Emit 1";
			T[4].TransitionName="4:TimeOut";
			T[5].TransitionName="5:Loss";
			T[6].TransitionName="6:Loss";
			T[7].TransitionName="7:Loss";
			T[8].TransitionName="8:Reject 0";
			T[9].TransitionName="9:Reject 1";
			T[10].TransitionName="10:Process 0";
			T[11].TransitionName="11:Process 1";
			for(i=1;i<12;i++)
			{
				Console.WriteLine(T[i].TransitionName.ToString());
			}
		}
		public static void initialPetriNet(Arc[] A)
		{
			int i=0;
			for(;i<100;i++)
			{
				A[i]=new Arc();
			}
            #region Arc to Place
			i=0;
			A[i].toPlace=true;
			A[i].place=1;
			A[i++].transition=1;
			A[i].toPlace=true;
			A[i].place=1;
			A[i++].transition=2;
			A[i].toPlace=true;
			A[i].place=2;
			A[i++].transition=3;
			A[i].toPlace=true;
			A[i].place=2;
			A[i++].transition=4;
			A[i].toPlace=true;
			A[i].place=3;
			A[i++].transition=1;
			A[i].toPlace=true;
			A[i].place=3;
			A[i++].transition=2;
			A[i].toPlace=true;
			A[i].place=4;
			A[i++].transition=10;
			A[i].toPlace=true;
			A[i].place=4;
			A[i++].transition=8;
			A[i].toPlace=true;
			A[i].place=4;
			A[i++].transition=11;
			A[i].toPlace=true;
			A[i].place=4;
			A[i++].transition=9;
			A[i].toPlace=true;
			A[i].place=5;
			A[i++].transition=3;
			A[i].toPlace=true;
			A[i].place=5;
			A[i++].transition=4;
			A[i].toPlace=true;
			A[i].place=6;
			A[i++].transition=10;
			A[i].toPlace=true;
			A[i].place=6;
			A[i++].transition=8;
			A[i].toPlace=true;
			A[i].place=7;
			A[i++].transition=11;
			A[i].toPlace=true;
			A[i].place=7;
			A[i++].transition=9;
			#endregion
			#region Arc to Transition
			A[i].toPlace=false;
			A[i].transition=1;
			A[i++].place=2;
			A[i].toPlace=false;
			A[i].transition=1;
			A[i++].place=4;
			A[i].toPlace=false;
			A[i].transition=2;
			A[i++].place=1;
			A[i].toPlace=false;
			A[i].transition=3;
			A[i++].place=1;
			A[i].toPlace=false;
			A[i].transition=3;
			A[i++].place=4;
			A[i].toPlace=false;
			A[i].transition=4;
			A[i++].place=2;
			A[i].toPlace=false;
			A[i].transition=5;
			A[i++].place=3;
			A[i].toPlace=false;
			A[i].transition=6;
			A[i++].place=4;
			A[i].toPlace=false;
			A[i].transition=7;
			A[i++].place=5;
			A[i].toPlace=false;
			A[i].transition=8;
			A[i++].place=3;
			A[i].toPlace=false;
			A[i].transition=8;
			A[i++].place=6;
			A[i].toPlace=false;
			A[i].transition=9;
			A[i++].place=5;
			A[i].toPlace=false;
			A[i].transition=9;
			A[i++].place=7;
			A[i].toPlace=false;
			A[i].transition=10;
			A[i++].place=3;
			A[i].toPlace=false;
			A[i].transition=10;
			A[i++].place=7;
			A[i].toPlace=false;
			A[i].transition=11;
			A[i++].place=5;
			A[i].toPlace=false;
			A[i].transition=11;
			A[i++].place=6;
			#endregion
		}
			
		/// <summary>
		/// 判断该Transition是否能被激活
		/// </summary>
		/// <returns></returns>
		public static bool isAcitive(Transition T,Place[] P,Arc[] A)
		{ 
			//如果通过Arc连接到该Transition的所有Place都有tokenNum>0 
			//则该Transition可以被激活 
			int i; 
			for(i=0;i<A.Length;i++)
			{ 
				if(A[i].transition==T.TransitionId && A[i].toPlace==false)
				{
					for(int j=1;j<P.Length;j++)
					{
						if(P[j].PlaceId==A[i].place )
						{
							if(P[j].TokenNumber<=0)
								return false;
						}
					}
//					return true;
				}		
			}
			return true;
		}
		
			
		/// <summary>
		/// 激活该Transition
		/// </summary>
		public static void fire(Transition[] T,Place[] P,Arc[] A)
		{ 
			for(int i=1;i<12;i++)
			{
				if (isAcitive(T[i],P,A))
				{
					Console.WriteLine("Transition "+T[i].TransitionName.ToString()+"  has just been fired!");
				}
			}

//			//从转换左边的Place中,每个tokenNum-1 
//			for(int i=0;i<A.Length;i++)
//			{ 
//				if(A[i].transition==T.TransitionId && A[i].toPlace==false)
//				{
//					for(int j=1;j<P.Length;j++)
//					{
//						if(P[j].PlaceId==A[i].place )
//						{
//							P[j].desTokenNum();
//						}
//					}					
//				}
//			} 
//			//向转换右边的Place中,每个tokenNum+1 
//			for(int i=0;i<A.Length;i++)
//			{ 
//				
//				if(A[i].transition==T.TransitionId && A[i].toPlace==true)
//				{
//					for(int j=1;j<P.Length;j++)
//					{
//						if(P[j].PlaceId==A[i].place )
//						{
//							P[j].addTokenNum();
//						}
//					}					
//				}
//			} 
		}
		public static int[] GetRandomPlace()
		{
			
			int i=0,length=0;
			Random ra=new Random();
			int RandomPlace=ra.Next(6)+1;
			int[] Result=new int[RandomPlace];
			for(i=0;i<RandomPlace;i++)
			{
				Result[i]=ra.Next(6)+1;
			}
			for(i=0;i<Result.Length;i++)
			{
				int j=0;
				for(;j<i;j++)
				{
					if(Result[j]==Result[i])
					{
						int p=i;
						for(;p+1<Result.Length;p++)
						{
							Result[p]=Result[p+1];
						}
						Result[p]=0;
						length++;
					}
				}
			}
			int[] Result1=new int[RandomPlace-length];
			for(i=0;i<RandomPlace-length;i++)
			{
				Result1[i]=Result[i];
//				Console.WriteLine(Result1[i].ToString());
			}
			return Result1;
		}

		/// <summary>
		/// 应用程序的主入口点。
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			Arc[] arcs=new Arc[100];			
			Place[] places=new Place[8];
			Transition[] transitions=new Transition[12];
			Console.WriteLine("          This is A PetriNet Model!  On Page 233");
			Console.WriteLine("     Now initialize Place:");			
			initialplaces(places);//初始化处所
			Console.WriteLine("     Now initialize Transition:");
			initialTransition(transitions);//初始化转换
			Console.WriteLine("     Now initialize PetriNet...");
			initialPetriNet(arcs);//初始化弧,即连接整个petrinet
			Console.WriteLine("     Now the initialization has been finished.");//初始化完毕
			Console.WriteLine("\n\n===========================================================");//模拟书上给定初始状态A,C,G下的激活情况			
			Console.WriteLine("If the system is currently in state A,C and G like our book,");
			Console.WriteLine("then,the transitions which can be fired are:");
			Console.WriteLine("-----------------------------------------------------------");
			Console.WriteLine("The current state is:\n         "+places[1].PlaceName+", "+places[3].PlaceName+", "+places[7].PlaceName+"\nResult:\n-------");
			places[1].addTokenNum();
			places[3].addTokenNum();
			places[7].addTokenNum();
			fire(transitions,places,arcs);//进行一次激活
			Console.WriteLine("===========================================================\n\n\n");
randomore:  int i=0;
			for(i=1;i<8;i++)
			{
				places[i].TokenNumber=0;
			}//还原为初始值
			Console.WriteLine("===========================================================");
			Console.WriteLine("     Now let's make the current state of the system at random:");
            Console.WriteLine("-----------------------------------------------------------");
			Console.WriteLine("     The current state which was made at random is:");
			int[] randomplace=GetRandomPlace();
			for(i=0;i<randomplace.Length;i++)
			{
				places[randomplace[i]].addTokenNum();
				Console.WriteLine(places[randomplace[i]].PlaceName+"  ");
			}
			Console.WriteLine("Result:\n-------");
			fire(transitions,places,arcs);
			Console.WriteLine("===========================================================");

			

																									  
//			bool B=isAcitive(transitions[1],places,arcs);
			Console.WriteLine("Press \"R/r\" to get another random;press any key to exit:");
			string quit;
			quit=Console.ReadLine();
			if(quit.Equals("R") || quit.Equals("r"))
			{
				goto randomore;
			}
		}
	}
}

⌨️ 快捷键说明

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