重心法选址的C++编程问题,请高手赐教

重心法选址的C++编程问题,请高手赐教,第1张

据我所知:

公式:x0 = ( ∑ xiwi ) / ( ∑ wi )

y0 = ( ∑ yiwi ) / ( ∑ wi )

单设施选址模型有不同的名称,如:精确重心法、网格法和重心法等,因为选址因素只包括运输费率和该点的货物运输量,所以此方法较为简单。

我们以预计仓库点位到达各个目的点位的成本最低为考察目标:

即:

Min TC=∑ViRidi i 遍历所有目的地 …(0)

其中: TC——总运输成本;

Vi——i 点运输量;

Ri——到 i 点的运输费率;

di——从待定仓库位置到i 点的距离。

坐标平面中设待定仓库坐标为(X0,Y0)

∑ViRiXi/di

X0=...(1)

∑ViRi/di

∑ViRiYi/di

Y0= …(2)

∑ViRi/di

其中di可以坐标间公式

di =SQR((X0-Xi)2+(Y0-Yi)2) …(3)

该方法求解过程:

1、确定各目的地点的坐标,同时确定各点货物运输量和直线距离运费;

2、不考虑距离因素,用重心公式估算初始选址点:

∑ViRiXi

X0=…(4)

∑ViRi

∑ViRiYi

Y0…(5)

∑ViRi

3、根据公式(3),用步骤2得到的(X0,Y0)计算di;

4、将di代入公式(1),(2),得到修正的(X0,Y0)坐标;

5、根据修正的(X0,Y0)坐标,再重新计算di;

6、 重复步骤4和步骤5直至(X0,Y0)坐标在连续迭代过程中都不再变化或变化在误差范围内;

7、最后,如果需要,利用公式(0)计算最优选址的总成本。

#include <stdio.h>

#include <math.h>

struct xuanzhi

{

double x,y,v,r

}xz[5]={{3,8,2000,0.050},{8,2,3000,0.050},{2,5,2500,0.075},{6,4,1000,0.075},{8,8,1500,0.075}}

main()

{

struct xuanzhi

int i

double d[5]

double x0=0.0,y0=0.0,min=0.0,TC=0.0,t=0.0,m=0.0,w=0.0,x1=0.0,y1=0.0,m1=0.0,m2=0.0,w2=0.0,t1=0.0,m3=0.0,w3=0.0

for(i=0i<5i++)

{

m+=xz[i].v*xz[i].r*xz[i].x

w+=xz[i].v*xz[i].r

m1+=xz[i].v*xz[i].r*xz[i].y

}

x0=m/w

y0=m1/w

for(i=0i<5i++)

{

d[i]=sqrt((xz[i].x-x0)*(xz[i].x-x0)+(xz[i].y-y0)*(xz[i].y-y0))

m3+=xz[i].v*xz[i].r*xz[i].x/d[i]

t1+=xz[i].v*xz[i].r*xz[i].y/d[i]

w3+=xz[i].v*xz[i].r/d[i]

}

x1=m3/w3

y1=t1/w3

do

{

x0=x1

y0=y1

for(i=0i<5i++)

{

d[i]=sqrt((xz[i].x-x0)*(xz[i].x-x0)+(xz[i].y-y0)*(xz[i].y-y0))

m2+=xz[i].v*xz[i].r*xz[i].x/d[i]

t+=xz[i].v*xz[i].r*xz[i].y/d[i]

w2+=xz[i].v*xz[i].r/d[i]

}

x1=m2/w2

y1=t/w2

m2=0.0

t=0.0

w2=0.0

}while(fabs(x0-x1)-0.00000001>0&&fabs(y0-y1)-0.00000001>0)

printf("x0=%12lf,y0=%12lf\n",x0,y0)

for(i=0i<5i++)

{

d[i]=sqrt((xz[i].x-x0)*(xz[i].x-x0)+(xz[i].y-y0)*(xz[i].y-y0))

min=xz[i].v*xz[i].r*d[i]

TC+=min

}

printf("min TC=%12lf\n",TC)

getch()

}

我们实验做得,不知对你有用吗?

分别利用Roberts、Prewitt和Sobel算子对lena.img进行边缘检测

clc

fid=fopen(' F:\数字图像处理\实验二 在 502-111 (603-003) 上\img\lena.bmp','r')

f=fread(fid,[256,256],'uchar')

GR=f

GP=f

GS=f

for x=2:255

for y=2:255

GRx(x,y)=f(x,y)-f(x+1,y+1)

GRy(x,y)=f(x,y+1)-f(x+1,y)

GR(x,y)=sqrt((GRx(x,y)).^2+(GRy(x,y)).^2)

GPx(x,y)=(f(x-1,y+1)+f(x,y+1)+f(x+1,y+1))/3-(f(x-1,y-1)+f(x,y-1)+f(x+1,y-1))/3

GPy(x,y)=(f(x-1,y-1)+f(x-1,y)+f(x-1,y+1))/3-(f(x+1,y-1)+f(x+1,y)+f(x+1,y+1))/3

GP(x,y)=sqrt((GPx(x,y)).^2+(GPy(x,y)).^2)

GSx(x,y)=(f(x-1,y+1)+2*f(x,y+1)+f(x+1,y+1))/3-(f(x-1,y-1)+2*f(x,y-1)+f(x+1,y-1))/3

GSy(x,y)=(f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1))/3-(f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1))/3

GS(x,y)=sqrt((GSx(x,y)).^2+(GSy(x,y)).^2)

end

end

subplot(2,2,1)

imshow(f,[0,255])title('原图像')

subplot(2,2,2)

imshow(GR,[0,255])title('Roberts')

subplot(2,2,3)

imshow(GP,[0,255])title('Prewitt')

subplot(2,2,4)

imshow(GS,[0,255])title('Sobel')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11697878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存