number FracturedMediaRefiner<TGrid, TAPosition>:: aspect_ratio(Face* f) { if(!m_aaPos.valid()) UG_THROW("A position attachment has to be specified before this method is called."); EdgeDescriptor ed; f->edge_desc(0, ed); number eMin = EdgeLength(&ed, m_aaPos); number eMax = eMin; for(size_t i = 1; i < f->num_edges(); ++i){ f->edge_desc(i, ed); number len = EdgeLength(&ed, m_aaPos); if(len < eMin) eMin = len; else if(len > eMax) eMax = len; } if(eMax <= 0) return 0; return eMin / eMax; }
double CycleLength(int *ants) { double value=0; for(int i=0;i<n-1;i++) value+=EdgeLength(ants[i],ants[i+1]); value+=EdgeLength(ants[0],ants[n-1]); return value; }
double *FindProbabilites(int k, const int city, bool *visited, double **pheromones) { double *taueta = new double[n]; double sum = 0.0; for (int i = 0; i < n; ++i) { if (i == city) taueta[i] = 0.0; // Prawdopodobie�stwo przej�cia z miasta x do miasta x wynosi 0 else if (visited[i] == true) taueta[i] = 0.0; // Prawdopodobie�stwo przej�cia z miasta x do miasta odwiedzonego wynosi 0 else { taueta[i] = pow(pheromones[city][i], ALPHA) * pow((1.0 / EdgeLength(city, i)), BETA); // obliczenie prawdopodobie�stwa wed�ug okre�lonego wzoru if (taueta[i] < 0.0001) taueta[i] = 0.0001; else if (taueta[i] > (MaxValue() / (n * 100))) taueta[i] = MaxValue() / (n * 100); } sum += taueta[i]; } double *probs = new double[n]; for (int i = 0; i <n; ++i) probs[i] = taueta[i] / sum; return probs; }
void FracturedMediaRefiner<TGrid, TAPosition>:: collect_objects_for_refine() { // get the grid on which we'll operate if(!BaseClass::get_associated_grid()) UG_THROW("No grid has been set for the refiner."); Grid& grid = *BaseClass::get_associated_grid(); // make sure that the position accessor is valid if(!m_aaPos.valid()) UG_THROW("A position attachment has to be specified before this method is called."); // push all marked degenerated faces to a queue. // pop elements from that queue, mark them anisotropic and unmark associated // degenerated edges. // Furthermore we'll push degenerated faces, which are connected to the current // face through a regular edge to the queue (only unprocessed ones). typename BaseClass::selector_t& sel = BaseClass::get_refmark_selector(); // some helpers vector<Edge*> edges; vector<Face*> faces; // we need two while-loops. The outer is required to process changes which // stem from the base-class implementation. //todo: This is a lot of processing due to repeated calls to collect_objects_for_refine. do{ while(!m_queDegeneratedFaces.empty()) { Face* f = m_queDegeneratedFaces.front(); m_queDegeneratedFaces.pop(); // mark as anisotropic if(BaseClass::get_mark(f) != RM_ANISOTROPIC) BaseClass::mark(f, RM_ANISOTROPIC); // check edges CollectAssociated(edges, grid, f); // get the edge with the maximal length number eMax = 0; for(size_t i_edge = 0; i_edge < edges.size(); ++i_edge){ number len = EdgeLength(edges[i_edge], m_aaPos); if(len > eMax) eMax = len; } if(eMax <= 0) eMax = SMALL; // degenerated neighbors of non-degenerated edges have to be selected. // degenerated edges may not be selected size_t numDeg = 0; for(size_t i_edge = 0; i_edge< edges.size(); ++i_edge){ Edge* e = edges[i_edge]; if(EdgeLength(e, m_aaPos) / eMax >= m_aspectRatioThreshold){ // non-degenerated edge // make sure it is selected if(BaseClass::get_mark(e) != RM_REFINE) BaseClass::mark(e, RM_REFINE); // this edge possibly connects to an unselected degenerated neighbor. // If this is the case, we'll have to mark it and push it to the queue. CollectAssociated(faces, grid, e); for(size_t i_face = 0; i_face < faces.size(); ++i_face){ Face* nbr = faces[i_face]; if(!sel.is_selected(nbr)){ if(aspect_ratio(f) < m_aspectRatioThreshold){ // push it to the queue. m_queDegeneratedFaces.push(nbr); } } } } else{ // degenerated edge. unmark it BaseClass::mark(e, RM_NONE); ++numDeg; } } // if all edges are degenerate, we will have to perform regular refinement if(numDeg == edges.size()){ BaseClass::mark(f, RM_REFINE); for(size_t i = 0; i < edges.size(); ++i) BaseClass::mark(edges[i], RM_REFINE); } } // now call the base implementation. If degenerated faces are selected during // that step, then we have to process them too. BaseClass::collect_objects_for_refine(); }while(!m_queDegeneratedFaces.empty()); }