计量地理-最优点的位置

输入如下:每一行是居民点位置和人口数

5 5 2 

10 10 2.5 
5 35 2 
10 27.5 2.5 
15 5 2 
15 15 3 
15 40 2 
17.5 25 3.5 
20 15 4 
25 30 4 
25 45 2 
30 10 4 
35 20 5 
40 5 3 
42.5 25 6 
45 35 5 
52.5 42.5 5.5 
55 35 4.5 
55 5 4 

57.5 10 3

输出如下:

Step=0.10L=1347.483601m_best.x=33.90m_best.y=21.60


// BestCenter.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
#include "stdafx.h"
#include "stdlib.h"
#include "math.h"
struct RESIDENCE{	//存储每一个居民点的坐标和人口数
	float x;
	float y;
	float p;


	};
struct POINT{
	float x;
	float y;
	};

void main()
{
	//重要变量
	RESIDENCE *m_data;
	POINT m_best;	
	float m_xmin, m_xmax, m_ymin, m_ymax;		//居民点坐标中的最值
	int m_count;		        //居民点的个数
	double L = 99999999.9;		//距离与人口数乘积的累加和
	float step;				//控制循环的步长


	//其它变量
	float temp1,temp2,temp3;
	int i;	
	char m_file[]="best.txt";
	float j,k;
	FILE *fp;
	
	//部分变量初始化
	double temp=0.0;	
	i=0;
	m_count=0;
	j=k=temp1=temp2=temp3=0.0;
	m_xmin=m_xmax=m_ymin=m_ymax=0.0;


	//提示用户输入循环的步长
	printf("Please intput step= ");
	scanf("%f",&step);


/*  读文件,将数据存入m_data中  */
	if((fp=fopen(m_file,"r"))==NULL)
	{
		printf("Can not open this file.\n");
		exit(0);


	}
	
	while(!feof(fp))
	{
		fscanf(fp,"%f %f %f",&temp1,&temp2,&temp3);
		m_count++;


	}


	m_data=(RESIDENCE*)malloc(sizeof(RESIDENCE)*m_count);


	rewind(fp);


	while(!feof(fp))
	{
		fscanf(fp,"%f %f %f",&m_data[i].x,&m_data[i].y,&m_data[i].p);
		i++;


	}


	fclose(fp);


	//将m_data中数据输出到屏幕
	for(i=0;i<m_count;i++)
		printf("%3d  %5.1f,%5.1f,%5.1f\n",i+1,m_data[i].x,m_data[i].y,m_data[i].p);


	//寻找m_data中坐标x和y的最大值及最小值
	m_xmax=m_xmin=m_data[0].x;		//min and max	
	m_ymax=m_ymin=m_data[0].y;
	for(i=1;i<m_count;i++)
	{
		if(m_xmin>m_data[i].x)
			m_xmin=m_data[i].x;
		if(m_xmax<m_data[i].x)
			m_xmax=m_data[i].x;


		if(m_ymin>m_data[i].y)
			m_ymin=m_data[i].y;
		if(m_ymax<m_data[i].y)
			m_ymax=m_data[i].y;


	}	


	//三重循环,寻找最优点的位置及L的最小值
	for(j=m_xmin;j<m_xmax;j+=step)
	{
		for(k=m_ymin;k<m_ymax;k+=step)
		{
			for(i=0;i<m_count;i++){				
				temp+=m_data[i].p*sqrt(pow(m_data[i].x-j,2)+pow(m_data[i].y-k,2));
				
			}//for(i=0;i<m_count;i++)
			
			if(temp<L)
			{
				L=temp;
				m_best.x=j;
				m_best.y=k;
					
			}//if(temp<L)
			
			temp=0.0;
		}//for(k=m_ymin;k<m_ymax;k=k+5)


	}
	
	printf("L=%.5f  ;m_best.x=%.1f;  m_best.y=%.1f\n",L,m_best.x,m_best.y);
	
	char m_out[]="result.txt";
	if((fp=fopen(m_out,"w"))==NULL)
	{
		printf("Can not open this file.\n");
		exit(0);


	}
	
	fprintf(fp,"Step=%.2fL=%.6fm_best.x=%.2fm_best.y=%.2f\n",step,L,m_best.x,m_best.y);	
	fclose(fp);


	free(m_data);
	
}

猜你喜欢

转载自blog.csdn.net/sheyun1876/article/details/80580977