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

📄 petri_net.cpp

📁 petri网络的演示程序
💻 CPP
字号:
#include "iostream.h"
#include "string.h"
#include "stdlib.h"
#include "time.h"

#define maxnum 100
#define maxlength 15

struct TransRules
{
	char left[maxlength];
	char right[maxlength];
}Rules[maxnum];//用于存放转换规则

char state_issue[maxnum];
char state_accept[maxnum];

int TransRules_input() //转换规则的输入,返回规则的数目,输入以#结束
{
	
	cout<<"Please input the transition rules(put in '#' to end and '/' representing 'loss'):  "<<endl;
	int i=0;
	do
	{
		i++;
		cin>>Rules[i].left;
		if(Rules[i].left[0]=='#') //输入#表示输入结束
			break;
		cout<<"  ==>";
		cin>>Rules[i].right;// 把转换规则输入存放到Rules[1]开始的数组中
		cout<<endl;
	}while(strcmp(Rules[i].left,"#")!=0);
	int j=i-1; //暂存转换规则数目

	cout<<" the transition rules are : "<<endl;
	for(i=1;i<=j;i++)
	{
		cout<<Rules[i].left<<"-->"<<Rules[i].right<<endl;
	}
	return j;
}



void main()
{
	int enable[maxnum]; //存放可以fire的转换序号
	int trans_num;     //存放transition的次数
	int randtrans;
	char init_state[maxlength]; //存放初始状态

	int rule_num=TransRules_input(); //把转换规则的数目存如rule_num
	cout<<"Please input the initial state: "<<endl;
	cin>>init_state;
	cout<<"Please input the number of transitions: "<<endl;
	cin>>trans_num;
	cout<<endl;
	int transflag=0;  //转换是否能继续的标志
	srand((unsigned) time(NULL));

	for(int x=0;(x<trans_num)&&(!transflag);x++)
	{
		int flag=0;
		int m=0;
		int i,j;
		for(i=1;i<=rule_num;i++)  //搜索可以fire的transition
		{
			for(j=0;(j<(int)strlen(Rules[i].left))&&(flag==0);)//flag==1表示规则左部已经有状态不属于初始态了,故可断定不能FIRE
			{
				int k=0;
				while((Rules[i].left[j]!=init_state[k])&&(k<(int)strlen(init_state)))
					k++;
				if(k<(int)strlen(init_state))//在init_state中找到相同的状态
					j++;
				else    //没找到
				{
					flag=1;
					j++;
				}
			}
			if((j==(int)strlen(Rules[i].left))&&(!flag))// 规则的左部全部属于初始状态,故可以fire
			{
				enable[m]=i; //把可以fire的序号存入enable数组
				m++;
			}
			flag=0;
		}
		int enable_num=m; //可以fire的转换数
		if(enable_num==0)
		{
			transflag=1;  //表明转换不能继续进行
			cout<<"Transition can not be achieved!"<<endl;
		}
		else
		{
			int n=rand();
		    randtrans=n%enable_num;// 生成随机数

			int flag1=0;
			int w=0;
			char temp[maxlength];//临时存放空间
			for(int y=0;y<(int)strlen(init_state);y++)//把原状态替换为转换后的状态
			{
				for(int z=0;(z<(int)strlen(Rules[enable[randtrans]].left))&&(!flag1);z++)
				{
					if(init_state[y]==Rules[enable[randtrans]].left[z])  //保留未转换的状态
					{
					    flag1=1;
					}
				}
				if(flag1==0)
				{
					temp[w]=init_state[y];
					w++;
				}
				flag1=0;
			}
			int flag2=0;
			for(i=0;i<(int)strlen(Rules[enable[randtrans]].right);i++)
			{
				for(j=0;(j<w)&&(!flag2);j++)
				{
					if(Rules[enable[randtrans]].right[i]==temp[j])
						flag2=1;
				}
				if((!flag2)&&(Rules[enable[randtrans]].right[i]!='/'))  //转换后的状态未在剩余状态中出现过且不为空
				{
					temp[w]=Rules[enable[randtrans]].right[i];
				    w++;
				}
			}
			temp[w]='\0';
			strcpy(init_state,"");//清原来的init_state
			strcpy(init_state,temp);
			cout<<"The states after "<<x+1<<" transitions is :"<<init_state<<endl;
		}
	}
}



	
    

⌨️ 快捷键说明

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