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 | 1503 (1335) | Klobasa |
» | Java ObjektiOddelek: Programiranje | 2233 (1927) | Mavrik |
» | C++ pomočOddelek: Programiranje | 866 (796) | Tutankhamun |
» | Program v COddelek: Programiranje | 1919 (1758) | darkkk |
» | c++ koordinatni sistemOddelek: Programiranje | 2241 (2063) | OwcA |