会产生状态空间爆炸,后续需要约减。
#include <stdio.h>
#include "tinyxml.h"
#include <iostream>
#include <cstring>
#include<string>
#include<vector>
#include <stdlib.h>
#include<fstream>
using namespace std;
struct Arc {
string id;
string source;
string target;
int sourceNum = 0;
int sourceP = 0;//源节点是库所,则sourceP为1
int sourceT = 0;
int targetNum = 0;
};
//库所顶点表
typedef struct Place
{
string name;
int num = 0;
int initialMarking = 0;
};
//变迁顶点表
typedef struct Transition
{
string name;
int num = 0;
};
int m = 0;
int n = 0;
int arcnum = 0;
Place place[30];
Transition transition[30];
Arc arc[1000];
int A[30][30] = { 0 };//关联矩阵
int A1[30][30] = { 0 };//输出矩阵
int A2[30][30] = { 0 };//输入矩阵
//可达图节点
typedef struct Node {
int m[30] = { 0 };//标识
int flag = 0;//新0,旧1,端点2
int isfirable[30] = { 0 };//存储可以发生的变迁名字
struct Node *parent;//该节点的父节点
int t = 0;//存储生成这个节点所发生的变迁名字
};
void readPNML() {
TiXmlDocument mydoc("E:\\1model.pnml");
bool loadOK = mydoc.LoadFile();
if (!loadOK) {
cout << "could not load the test file" << endl;
exit(1);
}
TiXmlElement *pnmlElement = mydoc.RootElement();
TiXmlElement *netElement = pnmlElement->FirstChildElement();
TiXmlElement *pageElement = netElement->FirstChildElement("page");
for (TiXmlElement *petriElement = pageElement->FirstChildElement();//第一个子元素
petriElement;
petriElement = petriElement->NextSiblingElement())
{
if (petriElement->ValueTStr() == "place") {
place[m].num = m