void grafe::UCComponentsPrint()

{

if (this->Components. size()-this->size > 1)

{

int kol=0;

cout << "\nКомпоненты связности\n";

30

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

{

if (Components[i].size() > 0)

{

kol ++;

cout << kol<<"-я: \n";

for (int j = 0; j < (int)Components[i].size(); j++)

{

cout << Components[i][j]<<"

("<<GNodes[Components[i][j]-1]->x<<" , "<<GNodes[Components[i][j]-1]-

>y<<"); R="<<GNodes[Components[i][j]-1]->range<< endl;

}

cout << endl;

}

}

}

}

//Информация о возможности восстановления

void grafe::PMayRepair()

{

if (this->Components. size()-this->size > 1)

{

int numcomponent=0;

int kol;

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

{

if((Components[i].size()>0) )

{

numcomponent++;

kol=0;

float midx=0, midy=0,midrange=0;

for (int j = 0; j < (int)Components[i].size(); j++)

{

kol++;

midx+=GNodes[Components[i][j]]->x;

midy+=GNodes[Components[i][j]]->y;

midrange+=GNodes[Components[i][j]]->range;

}

midx=midx/kol;

midy=midy/kol;

midrange/=kol;

AverageComponents. push_back(new

node(midx, midy, midrange));

31

}

}

cout << "Усредненные данные компонент: \n";

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

{

cout << i+1<<" ("<<AverageComponents[i]->x<<" ,

"<<AverageComponents[i]->y<<"); R="<<AverageComponents[i]->range<<

НЕ нашли? Не то? Что вы ищете?

endl;

}

double min=99999.0;

for (int i = 0; i < (int)AverageComponents. size()-1; i++)

{

for (int j = i+1; j < (int)AverageComponents. size(); j++)

{

UCComponents. push_back(new

T_Averaged_Components(AverageComponents[i],

AverageComponents[j],Range_Between(AverageComponents[i],

AverageComponents[j]),i+1,j+1));

}

}

/*cout << "UCComponents << " << UCComponents. size() << endl;

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

{

cout << UCComponents[i]->mydistance << " ";

}

cout << endl;*/

T_Averaged_Components * minimal=new

T_Averaged_Components(nullptr, nullptr,(float)99999.9,0,0);

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

{

if (UCComponents[i]->mydistance < minimal->mydistance)

{

minimal=UCComponents[i];

}

}

}

}

// обход итеративный, для поиска диаметра графа. Вспомогательная

//подпрограмма.

int grafe::GDDFS_Iter(int v1)

{

stack<int> s;

s. push(v1);

32

comp. push_back(v1);

int v;

int maxdiam=0;

int diamtmp=0;

while (!s. empty())

{

if (diamtmp > maxdiam)

maxdiam = diamtmp;

v = s. top();

s. pop();

//diamtmp=1;

for (int i = 0; i < (int)edgelist[v].size(); i++)

{

if (!Marker[edgelist[v][i]] )

{

s. push(edgelist[v][i]);

Marker[edgelist[v][i]] = 1;

diamtmp++;

}

}

};

return maxdiam-1;

}

//Основная подпрограмма поиска диаметра графа.

int grafe::GDiamIter()

{

int maxd=0;

int tmp=0;

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

{

Marker[i]=0;

}

for (int i = 0; i < this->size; i++)

{

tmp=GDDFS_Iter(i);

if (tmp > maxd)

maxd=tmp;

}

return maxd;

}

//Итератиный поиск несвязных компонент, основная подпрограмма.

int grafe::GUComponents_Iter()

{

int kol = 0;

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

this->Components. clear();

33

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

{

if (!Marker[i])

{

comp. clear();

GDDFS_Iter(i, this->comp);

if (comp. size() >0)

{

Components. push_back(comp);

kol++;

}

}

}

return kol;

};

34

ПРИЛОЖЕНИЕ Е

Подпрограмма многопоточного запуска

void parstart(int &rangMin, int &rangStep, int &rangMax, int &maxX, int

&maxY, int &maxR, int &idTst, int &Nrept)

{

vector<vector <int>> param;

vector <thread> MyThreads;

SYSTEM_INFO sysinfo;

GetSystemInfo(&sysinfo);

int CPUcount = sysinfo. dwNumberOfProcessors;

//cout << endl << CPUcount << endl;

maxCoreUse = CPUcount; // сколько ядер макс. можно занять

(потоков запустить одновременно)

cout << "Доступно " << CPUcount <<" ядер ЦПУ, сколько занять под

приложение? ";

cin >> maxCoreUse;

if (maxCoreUse > CPUcount)

{

maxCoreUse = CPUcount;

cout << "Превышено рекомендуемое предельное значение.

Максимум запускаемых одновременно потоков установлен в " << maxCoreUse

<< endl;

}

int numthcom = (rangMax - rangMin) / rangStep;

int N2 = numthcom / maxCoreUse;

cout << "N2 =" << N2;

//system("pause");

//Обработка потоков 1

int k = 0;

int inum;

for (unsigned int j = 0; j < N2; ++j)

{

cout << "J = " << j+1 << "[] -- ";

for (unsigned int it=0; it < maxCoreUse; ++it)

{

inum = it+1 + k*maxCoreUse;

cout << inum << " ( " <<rangMin+rangStep*(it +

(j)*maxCoreUse) << " ) ";

}

cout << endl;

}

int vv =0;

unsigned int time1=clock();

unsigned int time2=time1;

35

for (unsigned int j = 0; j < N2; ++j)

{

time1 = clock();

for (unsigned int it=0; it < maxCoreUse; ++it)

{

inum = it+1 + j*maxCoreUse;

vv = rangMin+rangStep*(it + (j)*maxCoreUse);

param. push_back(vector<int>());

param[inum-1].push_back(vv);

param[inum-1].push_back(maxX);

param[inum-1].push_back(maxY);

param[inum-1].push_back(maxR);

param[inum-1].push_back(idTst);

param[inum-1].push_back(Nrept);

param[inum-1].push_back(it+1 + k*maxCoreUse);

param[inum-1].push_back(rand());

MyThreads. push_back( thread (fthread, param[inum-1]));

}

//жду завершения работы пачки потоков

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

{

MyThreads[i].join();

MyThreads[i].~thread();

time2 = clock();

cout << "поток закрыт успешно; Время работы = " <<

timeformatted(time1,time2) << endl;

}

MyThreads. clear();

++k;

cout << endl;

}

int Nm = numthcom - k*N2;

//если вдруг остались

if (k*N2 < numthcom)

{

//cout << k*N2 << " " << numthcom;

time1 = clock();

param. clear();

for (unsigned int it=0; it < Nm ; ++it)

{

inum = it+1 + N2*maxCoreUse;

vv = rangMin+rangStep*(it + N2*maxCoreUse);

//cout << vv << " " << it+1 + k*maxCoreUse << endl;

param. push_back(vector<int>());

param[it].push_back(vv);

36

param[it].push_back(maxX);

param[it].push_back(maxY);

param[it].push_back(maxR);

param[it].push_back(idTst);

param[it].push_back(Nrept);

param[it].push_back(it+1 + k*maxCoreUse);

param[it].push_back(rand());

MyThreads. push_back( thread (fthread, param[it]));

}

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

{

MyThreads[i].join();

MyThreads[i].~thread();

time2 = clock();

cout << "поток закрыт успешно; Время работы = " <<

timeformatted(time1,time2) << endl;

}

MyThreads. clear();

}

}

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4