⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 欧氏空间选址模型
💻 CPP
字号:
#include<stdio.h>
#include<math.h>
#define M 10000

double x[M],y[M],r[M],w[M],d[M];

void choosePostion(int n,double k,double m);

void main(){
	int i,j,n;
	int c;
	double k,min;
	printf("输入需要满足的商户总数: ");
	scanf("%d",&n);
	while(n==0){
		printf("没有商户,无需设备!\n");
		printf("请重新输入需要满足的商户总数: ");
		scanf("%d",&n);
	}
	printf("输入各商户的坐标(x,y),需求量,运费:\n");
	for(i=0;i<n;i++){
		printf("第%d个:坐标:",i+1);
		scanf("%lf,%lf",&x[i],&y[i]);
		printf("需求量:");
		scanf("%lf",&r[i]);
		printf("运费:");
		scanf("%lf",&w[i]);
	}
	printf("请选择您要的操作:1=求最佳地址;2=增加商户;3=修改商户;4=显示商户信息;5=退出\n");
	scanf("%d",&c);
	while(c!=5){
		switch(c){
		case 1:
			printf("请给出确定的转换因子k:");
			scanf("%lf",&k);
			printf("请给出收敛的差值min:");
			scanf("%lf",&min);
			choosePostion(i,k,min);
			break;
		case 2:
			printf("新增加第%d个:坐标:",i+1);
			scanf("%lf,%lf",&x[i],&y[i]);
			printf("需求量:");
			scanf("%lf",&r[i]);
			printf("运费:");
			scanf("%lf",&w[i]);
			i++;
			break;
		case 3:
			printf("输入需要更改的商户编号:");
			scanf("%d",&j);
			printf("请重新输入第%d个:坐标:",j);
			j--;
			scanf("%lf %lf",&x[j],&y[j]);
			printf("需求量:");
			scanf("%lf",&r[j]);
			printf("运费:");
			scanf("%lf",&w[j]);
			break;
		case 4:
			printf("所有商户的信息如下:\n");
			for(j=0;j<i;j++){
				printf("第%d个商户:坐标:x=%lf,y=%lf\t",j+1,x[j],y[j]);
				printf("需求量:%lf\t",r[j]);
				printf("运费:%lf\n",w[j]);
			}
			break;
		default:
			break;
		}
		printf("请选择您要的操作:1=求最佳地址;2=增加商户;3=修改商户;4=显示商户信息;5=退出\n");
		scanf("%d",&c);
	}
}
double sum1(int n,double a[M],double b[M],double c[M]){
	int i;
	double s=0,p=0;
	for(i=0;i<n;i++)
		s+=a[i]*b[i]*c[i];
	for(i=0;i<n;i++)
		p+=b[i]*c[i];
	return s/p;
}
double sum2(int n,double a[M],double b[M],double c[M]){
	int i;
	double s=0,p=0;
	for(i=0;i<n;i++)
		s+=a[i]*b[i]*c[i]/d[i];
	for(i=0;i<n;i++)
		p+=b[i]*c[i]/d[i];
	return s/p;
}
double comp(double a,double b){
	if(a<0)
		return (-a-b);
	return (a-b);
}
void choosePostion(int n,double k,double m){
	int i=1,j;
	bool find=false;
	double sum,a1,b1,a2,b2;
	
	if(n==1){
		printf("对于一个商户,新设备的最佳选址即商户所在地址: x=%lf,y=%lf\n",x[0],y[0]);
		printf("当前总花费为0.\n");
	}
	else{
		a1=sum1(n,x,r,w);
		b1=sum1(n,y,r,w);
		while(find==false){
			printf("a[%d]=%lf,b[%d]=%lf\n",i,a1,i,b1);
			printf("现有设施与新设施的距离d[i]: \n");
			for(j=0;j<n;j++){
				d[j]=(sqrt)((x[j]-a1)*(x[j]-a1)+(y[j]-b1)*(y[j]-b1));
				d[j]*=k;
				printf("d[%d]:%lf\t",j+1,d[j]);
			}
			sum=0;
			for(j=0;j<n;j++){
				sum+=d[j]*r[j]*w[j];
			}
			printf("当前总花费为%lf.\n",sum);
			a2=sum2(n,x,r,w);
			b2=sum2(n,y,r,w);
			if((comp(a1-a2,m)<0)&&(comp(b1-b2,m)<0))
				find=true;
			
			a1=a2;
			b1=b2;
			i++;
		}
		printf("a[%d]=%lf,b[%d]=%lf\n",i,a1,i,b1);
		printf("所以,新设备的最佳选址为: x=%lf,y=%lf\n",a2,b2);
		sum=0;
		for(j=0;j<n;j++){
			sum+=d[j]*r[j]*w[j];
		}
		printf("最小总花费为%lf.\n",sum);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -