Forum » Programiranje » hierarhično rojenje, beleženje združevanja rojev, c++
hierarhično rojenje, beleženje združevanja rojev, c++

fraktal ::
Zdravo, pišem program za hierarhični postopek iskanja rojev(http://luks.fe.uni-lj.si/sl/studij/RVO/..., od strani 25) in se mi zatakne pri beleženju kateri roji so že združeni.
Če malo posplošim problem: imam recimo 10 točk v x-y ravnini. Med vsemi točkami izračunam evklidsko razdaljo in vse te razdalje vpišem v neko matriko velikosti 10x10. Nato v tej matriki poiščem najmanjšo razdaljo in ugotovim njeno pozicijo v matriki, torej vem kateri točki sta si najbližji. Recimo T1 in T2 sta si najbližje zato jih združim, torej nova točka T1'=T1+T2. Sedaj zoper izračunam razdalje te nove točke T1' do vseh ostalih. Torej dobim novo matriko 9x9 in postopek znova ponavljam, dokler ne dobim samo še ene razdalje v matriki.
Zatakne se mi, ker ne vem kako bi napisal algoritem, da bi si shranjeval katere točke/roji se združijo, da bi lahko narisal drevo združevanja-dendrogram....Če ima mogoče kdo kakšno idejo... Aha še to pišem v c++, katerega ne poznam dobro-delam prvič in se mi res ne sanja kako bi to sprogramiral.. Hvala.
koda:
Če malo posplošim problem: imam recimo 10 točk v x-y ravnini. Med vsemi točkami izračunam evklidsko razdaljo in vse te razdalje vpišem v neko matriko velikosti 10x10. Nato v tej matriki poiščem najmanjšo razdaljo in ugotovim njeno pozicijo v matriki, torej vem kateri točki sta si najbližji. Recimo T1 in T2 sta si najbližje zato jih združim, torej nova točka T1'=T1+T2. Sedaj zoper izračunam razdalje te nove točke T1' do vseh ostalih. Torej dobim novo matriko 9x9 in postopek znova ponavljam, dokler ne dobim samo še ene razdalje v matriki.
Zatakne se mi, ker ne vem kako bi napisal algoritem, da bi si shranjeval katere točke/roji se združijo, da bi lahko narisal drevo združevanja-dendrogram....Če ima mogoče kdo kakšno idejo... Aha še to pišem v c++, katerega ne poznam dobro-delam prvič in se mi res ne sanja kako bi to sprogramiral.. Hvala.
koda:
#include <iostream>
#include <math.h>
#include <vector>
#include <array>
using namespace std;
//data;
int S1x [8]={4, 6, 4, 8, 9, 9, 8, 14};
int S1y [8]={15, 14, 12, 9, 7, 5, 3, 3};
const int l=8; //stevilo znacilk;
double D [l][l]; //matrika razdalj;
static double d [l]; //vektor minimalnih razdalj med roji;
static double L[l][l];
//funkcije;
//calculate euclidean distance between two points;
double dist (double x1, double x2, double y1, double y2);
//razdalja med roji;
double Rdist(double sik, double sjk, double sij);
//find min value;
int minc(double matrix[l][l]); //minimum stolpci;
int minr(double matrix[l][l]); //minimum vrstice;
double minn(double matrix[l][l]); //minimum value;
//for min value;
const double eps=1e-10;
double temp;
int xtemp, ytemp; //position of smallest element;
int i, j, k, idx;
double T=1e10; //T index elementov v matriki D, ki so vecji od 0, ko T==1, imamo samo se en stolpec in se program zakljuci;
int main ()
{
//calculate starting distance matrix, without distances between the same points;
temp=dist(S1x[1], S1x[2], S1y[1], S1y[2]); //search for min value;
for(i=0; i<l; ++i)
{
for(j=i; j<l; ++j)
{
D[i][j]=dist(S1x[i], S1x[j], S1y[i], S1y[j]);
if(D[i][j]< temp & D[i][j]>eps)
{
temp=D[i][j];
ytemp=i;
xtemp=j;
}
}
}
d[0]=temp;
L[0][0]=ytemp; L[0][1]=xtemp;
for(i=0; i<l; ++i)
{
for(j=0; j<l; ++j)
{
cout << D[i][j] << " ";
}
cout << endl;
}
cout << endl;
cout << "min value is: " <<temp << endl;
cout << "position of min value is: " << ytemp << "," << xtemp << endl;
cout << D[ytemp][xtemp]<< endl;
for(idx=1; T>1; ++idx) //Združevanje rojev
{
T=0;
for(i=0; i<l; ++i)
{
for(j=l-1; j>=0; --j)
{
if(j==xtemp)
{
D[i][j]=Rdist( D[i][j], D[i][idx-1+ytemp], D[ytemp][xtemp]);
}
if(i==ytemp)
{
D[i][j]=Rdist(D[i][j], D[xtemp+1-idx][j], D[ytemp][xtemp]);
}
if((j<xtemp) & (j>0))
{
D[i][j]=D[i][j-1];
}
if(j>xtemp)
{
D[i][j]=D[i][j];
}
if(i>(xtemp+1-idx))
{
D[i-1][j]=D[i][j];
}
}
}
cout << endl;
cout << endl;
cout << endl;
for(i=0; i<l; ++i)
{
for(j=0; j<l; ++j)
{
if(D[i][j]>eps) {T++;}
cout << D[i][j] << " ";
}
cout << endl;
}
d[idx]=minn(D);
xtemp=minc(D);
ytemp=minr(D);
cout << minn(D) << endl;
cout << ytemp << endl;
cout << xtemp << endl;
}
system("PAUSE");
return 0;
}
double dist (double x1, double x2, double y1, double y2)
{
double d, x, y;
x=x1-x2;
y=y1-y2;
d=pow(x,2) + pow(y,2); d=sqrt(d); //euclidean distance;
//d=abs(x+y); //city block distance;
return d;
}
double Rdist(double sik, double sjk, double sij)
{
double ai=0.5, aj=0.5, b=0, c=-0.5;
//double ai=0.5, aj=0.5, b=0, c=0.5;
double Rdist;
Rdist=aj*sik + aj*sjk + b*sij + c*abs(sik-sjk);
return Rdist;
}
double minn(double matrix[l][l])
{
double minn=1e10;
for(i=0; i<l; ++i)
{
for(j=i; j<l; ++j)
{
if(matrix[i][j]< minn & matrix[i][j]>eps)
{
minn=matrix[i][j];
}
}
}
return minn;
}
int minc(double matrix[l][l])
{
double minn=1e10;
for(i=0; i<l; ++i)
{
for(j=i; j<l; ++j)
{
if(matrix[i][j]< minn & matrix[i][j]>eps)
{
minn=matrix[i][j];
ytemp=i;
xtemp=j;
}
}
}
return xtemp;
}
int minr(double matrix[l][l])
{
double minn=1e10;
for(i=0; i<l; ++i)
{
for(j=i; j<l; ++j)
{
if(matrix[i][j]< minn & matrix[i][j]>eps)
{
minn=matrix[i][j];
ytemp=i;
xtemp=j;
}
}
}
return ytemp;
}

Spura ::
Naredis razred Roj, ki lahko vsebuje druge roje. Potem je dost easy napisat kako so roji sestavljeni.

fraktal ::
hja več ko gledam te razrede manj mi je jasno vse skupaj...
recimo tako nekako definiram razred in v njem neko funkcijo, ki zdruzi I-ti in J-ti roj?
recimo tako nekako definiram razred in v njem neko funkcijo, ki zdruzi I-ti in J-ti roj?
class roj{
public:
void zdruzi(rojI, rojJ);
};
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] MetodeOddelek: Programiranje | 1547 (1379) | Klobasa |
» | Java ObjektiOddelek: Programiranje | 2314 (2008) | Mavrik |
» | C++ pomočOddelek: Programiranje | 911 (841) | Tutankhamun |
» | Program v COddelek: Programiranje | 1975 (1814) | darkkk |
» | c++ koordinatni sistemOddelek: Programiranje | 2303 (2125) | OwcA |