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 |


