Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
16.04.2013
Размер:
39.94 Кб
Скачать

#include "net.h"

using namespace std;

cPetry::cPetry( char fileName[]){

fstream fin ( fileName );

vector < cAttr<string> > Astr;

vector < cAttr<int> > Aint; //цикл считывает информацию в атрибуты

for ( int i = 0; i < 16; ++i)

{

static int count = 0;

if ( i == 1 || i == 3 || i == 6 || i == 9 || i ==10 || i == 12 || i == 13 || i == 15)

{

cAttr <int> iTemp ( fileName, count );

Aint.push_back( iTemp );

}

else{

cAttr<string> sTemp (fileName, count);

Astr.push_back( sTemp );

}

}

// объявляем вектора кортежей, куда сольем информацию из атрибутов

// для будующих отношений

vector < cKort2<string, int> > temp_Sn;

vector < cKort2<string, int> > temp_Tt;

vector < cKort3<string, string, int> > temp_TSk;

vector < cKort3<string, string, int> > temp_STn;

vector < cKort3<int, string, int> > temp_activeT;

vector < cKort3<int, string, int> > temp_externalAct;

// формирование таблицы Sn

for ( int i = 0; i < Astr[0].size(); ++i){

cKort2<string, int> vTemp(Astr[0].getCell(i), Aint[0].getCell(i) );

temp_Sn.push_back(vTemp);

}

// формирование таблицы Tt

for ( i = 0; i < Astr[1].size(); ++i) {

cKort2<string, int> vTemp(Astr[1].getCell(i), Aint[1].getCell(i));

temp_Tt.push_back(vTemp);

}

// формирование таблицы переходов ST

for ( i = 0; i < Astr[2].size(); ++i)

{

cKort3<string,string, int> vTemp

( Astr[2].getCell(i),Astr[3].getCell(i), Aint[2].getCell(i));

temp_STn.push_back(vTemp);

}

// формирование таблицы переходов TS

for ( i = 0; i < Astr[4].size(); ++i){

cKort3<string,string, int> vTemp

( Astr[4].getCell(i),Astr[5].getCell(i), Aint[3].getCell(i) );

temp_TSk.push_back(vTemp);

}

// формирование таблицы активных переходов

for ( i = 0; i < Astr[6].size(); ++i){

cKort3<int, string, int> vTemp

( Aint[4].getCell(i), Astr[6].getCell(i), Aint[5].getCell(i));

temp_activeT.push_back( vTemp );

}

//формирование таблицы внешних воздействий

for ( i = 0; i < Aint[6].size(); ++i) {

cKort3<int,string, int> vTemp

( Aint[6].getCell(i), Astr[7].getCell(i), Aint[7].getCell(i));

temp_externalAct.push_back(vTemp);

}

Sn.setRel2( temp_Sn );

Tt.setRel2( temp_Tt );

TSk.setRel3( temp_TSk );

STn.setRel3( temp_STn );

activeT.setRel3( temp_activeT);

externalAct.setRel3( temp_externalAct);

}

void cPetry::print(){

cout << "S n" << endl;

for ( int i = 0; i < Sn.size(); ++i) Sn[i].print();

cout << "T t" << endl;

for ( i = 0; i < Tt.size(); ++i) Tt[i].print();

cout << "S T n" << endl;

for ( i = 0; i < STn.size(); ++i)STn[i].print();

cout << "T S k" << endl;

for ( i = 0; i < TSk.size(); ++i)TSk[i].print();

cout << "Tstart Tact Tfin" << endl;

for ( i = 0; i < activeT.size(); ++i) activeT[i].print();

cout << "Time S Ns" << endl;

for ( i = 0; i < externalAct.size(); ++i) externalAct[i].print();

}

// *********************************МОДЕЛИРОВАНИЕ

// **********************************************

// Функция завершения работы перехода

void cPetry::finishAct( int time )

{

int startSize = activeT.size();

string tempForDel[ 10 ];

static int tempS = 0;

for ( int i = 0; i < startSize; ++i)

{

if( activeT[i].getThird() == time )

{

for ( int j = 0; j < TSk.size(); ++j )

if ( TSk[j].getFirst() == activeT[i].getSecond())

for ( int k = 0; k < Sn.size(); ++k)

if (TSk[j].getSecond() == Sn[k].getFirst())

Sn[k].setSecond(Sn[k].getSecond()+TSk[j].getThird() );

// Кидаем отработанный переход в протокол событий

protocol.addEvent(activeT[i]);

tempForDel[tempS] = activeT[i].getSecond();

tempS++;

}

}

for ( i = 0; i < tempS; i ++ ) activeT.Delete2( tempForDel[i] );

}

// **********************************************

// Функция добавления новых фишек

void cPetry::addExternal( int time )

{

for ( int i = 0; i < externalAct.size(); ++i)

if ( externalAct[i].getFirst() == time )

for ( int j = 0; j < Sn.size(); ++j )

if ( Sn[j].getFirst() == externalAct[i].getSecond() )

Sn[j].setSecond( externalAct[i].getThird() + Sn[j].getSecond() );

}

// **********************************************

// Функция начала работы переходов

bool cPetry::startAct( int time ){

for ( int i = 0; i < Tt.size(); ++i )

{

bool flag = true;

// Проверяем, активен или нет i-ый переход

for ( int j = 0; j < activeT.size(); ++j)

if ( activeT[j].getSecond() == Tt[i].getFirst() ) flag = false ;

// Если переход неактивен флаг равен истине

if ( flag == false )continue;

// Первое. Пройти по таблице связей STn и выяснить, сколько необходимо фишек

// для начала работы перехода. Если их хватает, то второе

// Второе. Проходим по таблице состояний, убираем фишки, которые нужны для начала

// работы перехода.

// Третье. Кидаем активный переход в календарь событий.

// Первое.

cKort2 <string, int> prepS[ 1000 ];

int prep_size = 0;

for ( int j = 0; j < STn.size(); ++j )

{

if ( STn[j].getSecond() == Tt[i].getFirst() )

{

int k = -1;

do{

++k;

if ( Sn[k].getFirst() == STn[j].getFirst() ){

if ( Sn[k].getSecond() < STn[j].getThird() ) flag = false;

else {

flag = true;

prepS[prep_size].setFirst( Sn[k].getFirst());

prepS[prep_size].setSecond(STn[j].getThird());

prep_size++;

}

}

} while ( STn[j].getFirst() != Sn[k].getFirst() );

}

}

// Если для начала активности этого перехода не хватает фишек, то сваливаем

if ( flag == false ) continue;

// Второе.

for ( int j = 0; j < prep_size; ++j )

{

int k = -1;

do{

++k;

if ( prepS[j].getFirst() == Sn[k].getFirst() )

Sn[k].setSecond( Sn[k].getSecond() - prepS[j].getSecond() );

} while ( prepS[j].getFirst() != Sn[k].getFirst());

}

// Третье.

int delayTime = Tt[i].getSecond();

cKort3<int, string, int> newTActive(time, Tt[i].getFirst(), time + delayTime );

activeT.add( newTActive );

}

return true;

}

// *****************************************************

// Функция моделирования

void cPetry::model( int tStart, int tFinish){

for ( int curTime = tStart;curTime < tFinish; ++curTime){

finishAct( curTime );

addExternal( curTime );

startAct( curTime );

}

protocol.print();

}

Соседние файлы в папке ОтчетСетиПетри