Ejemplo n.º 1
0
float		give_me_distance(t_map *map, t_position *f_pos,
				 t_position *s_pos)
{
  int	limit;
  int	l;
  int	w;

  limit = calcul_limit(map->size->width);
  if (abs(f_pos->x - s_pos->x) >= limit)
    l = calcul_length(f_pos->x, s_pos->x, map);
  else
    l = abs(f_pos->x - s_pos->x);
  limit = calcul_limit(map->size->height);
  if (abs(f_pos->y - s_pos->y) >= limit)
    w = calcul_width(f_pos->y, s_pos->y, map);
  else
    w = abs(f_pos->y - s_pos->y);
  return (calcul_distance(w, l));
}
Ejemplo n.º 2
0
int two_means(int nb_dimensions,groupe_t *groupe,groupe_t *groupe1,groupe_t *groupe2,
	      int type_donnees)
{
  /*declaration des variables*/
  int i,j,point1,point2,*groupes_des_individus,succes_affectation;
  int compteur_iterations,nb_iterations_two_means,compteur_while;
  double *centre,*centre1,*centre2,inertie_inter_classe_precedente;
  double inertie_inter_classe_courante,meilleure_inertie_inter_classe;
  /*fin declaration des variables*/

  nb_iterations_two_means=10;
  meilleure_inertie_inter_classe=NOT_DEFINED;
  
  /*allocation memoire*/
  centre1=(double *)malloc(sizeof(double)*nb_dimensions);
  centre2=(double *)malloc(sizeof(double)*nb_dimensions);
  centre=(double *)malloc(sizeof(double)*nb_dimensions);
  groupes_des_individus=(int *)malloc(sizeof(int)*groupe->nb_individus);
  /*fin allocation memoire*/

  if((type_donnees==SIMILARITES)||(type_donnees==ALIGNEMENT))
    {
      for(i=0;i<groupe->nb_individus;i++)
	{
	  centre[i]=0;
	  for(j=0;j<groupe->nb_individus;j++)
	    {
	      centre[i]+=groupe->individus[j]->valeurs_traitees[groupe->individus[i]->id];
	    }
	  centre[i]/=(double)groupe->nb_individus;
	}
    }
  else
    {
      for(i=0;i<nb_dimensions;i++)
	{
	  centre[i]=0;
	  for(j=0;j<groupe->nb_individus;j++)
	    {
	      centre[i]+=groupe->individus[j]->valeurs_traitees[i];
	    }
	  centre[i]/=(double)groupe->nb_individus;
	}
    }

  for(compteur_iterations=0;compteur_iterations<nb_iterations_two_means;compteur_iterations++)
    {
      point1=(int)floor((double)groupe->nb_individus-1.0)*((double)rand()/(double)RAND_MAX);
      compteur_while=0;
      while(compteur_while<50)
	{
	  point2=(int)floor((double)groupe->nb_individus-1.0)*((double)rand()/(double)RAND_MAX);
	  if(calcul_distance(nb_dimensions,groupe->individus[point1]->valeurs_traitees,
			     groupe->individus[point2]->valeurs_traitees)>ZERO_LIMIT)
	    {
	      break;
	    }
	  compteur_while++;
	}
      if(compteur_while==50)
	{
	  return NON;
	}

      /*initialisation*/
      if((type_donnees==SIMILARITES)||(type_donnees==ALIGNEMENT))
	{
	  for(i=0;i<groupe->nb_individus;i++)
	    {
	      centre1[i]=
		groupe->individus[point1]->valeurs_traitees[groupe->individus[i]->id];
	      centre2[i]=
		groupe->individus[point2]->valeurs_traitees[groupe->individus[i]->id];
	    }
	}
      else
	{
	  for(i=0;i<nb_dimensions;i++)
	    {
	      centre1[i]=groupe->individus[point1]->valeurs_traitees[i];
	      centre2[i]=groupe->individus[point2]->valeurs_traitees[i];
	    }
	}

      /*premiere affectation des individus aux deux groupes*/
      succes_affectation=
	affectation_individus2means(nb_dimensions,groupe->nb_individus,groupe->individus,
				    centre1,centre2,groupes_des_individus,
				    &inertie_inter_classe_precedente,type_donnees,centre);
      if(succes_affectation==NON)
	{
	  return NON;
	}

      /*fin initialisation*/
      compteur_while=0;
      while(compteur_while<10)
	{
	  succes_affectation=
	    affectation_individus2means(nb_dimensions,groupe->nb_individus,groupe->individus,
					centre1,centre2,groupes_des_individus,
					&inertie_inter_classe_courante,type_donnees,centre);
	  if(succes_affectation==NON)
	    {
	      return NON;
	    }

	  if((inertie_inter_classe_courante-inertie_inter_classe_precedente<ZERO_LIMIT)&&
	     (-inertie_inter_classe_courante+inertie_inter_classe_precedente<ZERO_LIMIT))
	    {
	      break;
	    }
	  else
	    {
	      inertie_inter_classe_precedente=inertie_inter_classe_courante;
	    }
	  compteur_while++;
	}
      
      if((meilleure_inertie_inter_classe==NOT_DEFINED)||
	 (inertie_inter_classe_courante>meilleure_inertie_inter_classe))
	{
	  groupe1->nb_individus=0;
	  groupe2->nb_individus=0;
	  for(i=0;i<groupe->nb_individus;i++)
	    {
	      if(groupes_des_individus[i]==GROUPE1)
		{
		  groupe1->individus[groupe1->nb_individus]=groupe->individus[i];
		  (groupe1->nb_individus)++;
		}
	      else
		{
		  groupe2->individus[groupe2->nb_individus]=groupe->individus[i];
		  (groupe2->nb_individus)++;
		}
	    }
	  meilleure_inertie_inter_classe=inertie_inter_classe_courante;
	}
    }      

  /*desallocation memoire*/
  free(centre1);
  free(centre2);
  free(centre);
  free(groupes_des_individus);
  /*fin desallocation memoire*/

  return OUI;
}