void findStatistics(){ float sumInCluster=0, sumBetweenCluster=0; int countInCluster=0, countBetweenCluster=0, temp=0; edge TempEdge; while(temp<(vertexNum)){ /*iterating on all the vertices*/ findDiameter(temp); TempEdge = vertices[temp]->edges->head; while(TempEdge!=NULL){ /*iterating on all the edges bounded to this vertex*/ /*in the following sections weight is divided by 2 because each edge is added twice*/ if((TempEdge->inCluster==1)){ sumInCluster+=(TempEdge->weight); (clusters[vertices[temp]->ClusterBelonging-1]->score)+=(TempEdge->weight/2); countInCluster++; } else if((TempEdge->inCluster==3)){ sumBetweenCluster+=(TempEdge->weight); countBetweenCluster++; } TempEdge=TempEdge->next; } temp++; } if(countInCluster!=0){ avgInClusters = Calculate(sumInCluster,countInCluster); } if(countBetweenCluster!=0){ avgBetweenClusters = Calculate(sumBetweenCluster,countBetweenCluster); } sort(); setClusters(); }
/** * @brief AgentCluster::assignmentPhase Runs the assignment phase of the AgentSwarm algorithm. */ void AgentCluster::assignmentPhase() { for (unsigned int i = 0; i < m_agents.size(); i++) { Agent* agent = m_agents[i]; if (agent->visited) continue; agent->visited = true; Cluster* cluster = new Cluster(); cluster->id = m_clusters.size(); m_clusters.push_back(cluster); std::vector<Agent*> neighbors = agentsWithinRange(agent, agent->foragingRange * 2.0); addToCluster(cluster, agent, neighbors); } for (unsigned int i = 0; i < m_clusters.size(); i++) { Cluster* cluster = m_clusters[i]; for (unsigned int j = 0; j < cluster->agents.size(); j++) { Agent* agent = cluster->agents[j]; std::vector<ClusterItem*> items = dataWithinForagingRange(agent); for (unsigned int k = 0; k < items.size(); k++) { ClusterItem* item = items[k]; if (item->group != -1) continue; item->group = cluster->id; cluster->points.push_back(item); } } } for (unsigned int i = 0; i < m_data.size(); i++) { //assign unassigned points to the closest groups ClusterItem* item = m_data[i]; if (item->group != -1) continue; Agent* closestAgent = 0; double closestDistance = -1; for (unsigned int j = 0; j < m_agents.size(); j++) { Agent* current = m_agents[j]; double dist = pointDistance(current->x, item->x, current->y, item->y); if (dist < closestDistance || closestDistance == -1) { closestAgent = current; closestDistance = dist; } } item->group = closestAgent->cluster; for (unsigned int j = 0; j < m_clusters.size(); j++) { Cluster* cluster = m_clusters[j]; if (cluster->id == item->group) cluster->points.push_back(item); } } emit setClusters(&m_clusters); }
AlgMultiArranque::AlgMultiArranque(vector<Cluster*>& clusters, vector<Objeto*>& objetos) { setNombreAlgoritmo(" Técnica MultiArranque "); setObjetos(objetos); setClusters(clusters); setDimension(getClusters()[0]->getDimension()); int* sol = new int [getObjetos().size()]; _solActual = new int [getObjetos().size()]; _mejorSol = new int [getObjetos().size()]; for (unsigned int i = 0; i < getObjetos().size(); ++i) { sol[i] = -1; } setSolucion(sol); delete [] sol; _tecnicaLocal = NULL; _centroidesFin = new int *[getClusters().size()]; for (unsigned int i = 0; i < getClusters().size(); ++i) _centroidesFin[i] = new int[getDimension()]; }
void ProcessingCallback(const geometry_msgs::PoseArray msg) { //Reinitialize image to zeros image.setTo(cv::Scalar(255, 255, 255)); //Reset Points and Cluster LeftCluster.clear(); RightCluster.clear(); //Set valid points setClusters(msg); //Evaluates cluster evaluateCluster(); //Show Image cv::imshow(OPENCV_WINDOW, image); cvWaitKey(1); }
int findClusters(){ int iter; clus *tmp, newCluster; edge tempEdge; clusterList cl; element e; int *checked = (int *)calloc(vertexNum,sizeof(int)); clusters=(clus *)malloc(sizeof(clus)*vertexNum); /*we will realoc it later to fit the cluster number*/ if (clusters==NULL){ allFail(0); if (checked!=NULL){ free(checked); } return -1; } if (checked==NULL){ allFail(1); return -1; } for(iter=0;iter<vertexNum;iter++){ if(checked[iter]==0){ cl = (clusterList) malloc(sizeof(struct s_clusterList)); if (cl==NULL){ allFail(0); free(checked); return -1; } newCluster=(clus)malloc(sizeof(struct s_clust)); clusters[clusterNum]=newCluster; clusters[clusterNum]->clustVertices = cl; clusters[clusterNum]->size=1; clusters[clusterNum]->score=0; clusters[clusterNum]->diameter=0; clusterNum++; tempEdge=vertices[iter]->edges->head; e = (element) malloc(sizeof(struct s_element)); if (e==NULL){ allFail(0); free(checked); return -1; } e->vertex = iter; /*Adding the first vertex in the cluster to the Cluster list*/ cl->headl = e; e->next=NULL; checked[tempEdge->vertexBelong]=1; while(tempEdge!=NULL){ if((tempEdge->inCluster==1) || (tempEdge->inCluster==2)){ if (checked[tempEdge->id_vertex]==0){ checked[tempEdge->id_vertex]=1; e = (element) malloc(sizeof(struct s_element)); if (e==NULL){ perror("Problem in function: 'findClusters'\n"); allFail(0); free(checked); return -1; } e->vertex = tempEdge->id_vertex; e->next = cl->headl; cl->headl = e; clusters[clusterNum-1]->size++; } } tempEdge=tempEdge->next; } } } tmp=(clus*)realloc(clusters,sizeof(clus)*clusterNum); if(tmp==NULL){ free(clusters); free(checked); return -1; } clusters=tmp; setClusters(); free(checked); return 0; }