martes, 14 de febrero de 2012

Algoritmo de los almacenes

Trata sobre el problema de donde situar unos almacenes para que sea óptimo para un número de ciudades situadas en ciertas coordenadas. Realizado mediante algoritmo voraces con un coste O(n^3).

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX 9999999
#define MIN -999
struct ciudad{
       int x;
       int y;
       int poblacion;
       };
      
float calcdistancia(int x, int y, int n, struct ciudad city[]);
void inicializar(int *xini, int *yini, int *xfin, int *yfin, float *distanciaSolucion);
int main(int argc, char *argv[]){
int n;
int xini, yini, xfin, yfin;
float distanciaSolucion, distancia=MAX,solX,solY;
printf("PROBLEMA DE LOS ALMACENES \n\n\n");
printf("Introduce el numero de ciudades del sistema: ");
scanf("%d",&n);
struct ciudad city[n];
int i;
for(i=0; i<n; i++){
         printf("\nIntroduce las coordenadas para la ciudad %d \n",i+1);
         printf(" Coordenada x "); scanf("%d",&city[i].x);
         printf(" Coordenada y "); scanf("%d",&city[i].y);
         printf(" Numero de habitantes aproximado "); scanf("%d",&city[i].poblacion);
         }
        
inicializar(&xini, &yini, &xfin, &yfin, &distanciaSolucion);
i=0;
for(i=0; i<n; i++){
         if(city[i].x <xini) xini=city[i].x;
         if(city[i].y <yini) yini=city[i].y;
         if(city[i].x >xfin) xfin=city[i].x;
         if(city[i].y >yfin) yfin=city[i].y;
}
int h;
for (h=xini; h<=xfin; h++){
    int j;
    for (j=yini; j<=yfin; j++){
        float distanciaActual = calcdistancia(h, j, n, city);
        if (distanciaSolucion > distanciaActual){
           distanciaSolucion = distanciaActual;
           solX = h;
           solY = j;
        }
    }
}
printf("\n\n");
printf("\nLas Coordenadas optimas para el almacen son, x %f y %f\n", solX, solY, distanciaSolucion);

system("PAUSE");
return 1;
}

void inicializar(int *xini, int *yini, int *xfin, int *yfin, float *distanciaSolucion){
     *xini=MAX;
     *yini=*xini;
     *xfin=MIN;
     *yfin=*xfin;
     *distanciaSolucion=MAX;
}
float calcdistancia(int x, int y, int n, struct ciudad city[]){
      float d=0;
      int i;
      for(i=0; i<n; i++)
               d +=sqrt(pow((x-city[i].x),2) + pow((y -city[i].y), 2))* city[i].poblacion;
      return d;
}

No hay comentarios:

Publicar un comentario