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