Example #1
0
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);
 }
Example #5
0
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;
}