物流中心选址重心法c程序设计

物流中心选址重心法c程序设计
物流中心选址重心法c程序设计

单一物流中心选址重心法c++程序设计

(选址)某企业有五个供应商,他们的位置分别是(4+i,4+i ),(12+i,4+i ),(2+i,7+i ),(11+i,11+i ),(7+i,14+i ),该企业从这五个供应商处的采购量每年为4+i 、3+i 、2+i 、4+i 、1+i ,假设运输费率相同,i 为序号的末位数。请用计算机编写一个通用程序,完成下面的题目。

(1)用城市距离为该企业推荐一个地址,使该企业的费用最省。

(2)将第1问中的结果作为一个初始解,用欧氏距离进行重新优化,推荐一个最优的位置。 要求:

(1)前后两次结果之差小于0.001;

(2)程序的通用性高,可以满足任何多个供应商; (3)程序的可读性强; (4)操作界面友好;

(5)在手册中要记录所有的程序、运行结果及相关界面图形。 解:

重心法是一种模拟方法。这种方法将物流系统中的需求点和资源点看成是分布在某一平面范围内的物流系统,各点的需求量和资源量分别看成是物体的重量,物体系统的重心作为物流网点的最佳设置点,利用求物体系统重心的方法来确定物流网点的位置。

i

d i R n

m i i V TC ∑+==1

min 运输总费用(1)

式中:V i —i 点运输量;

R i —待定物流中心到i 点的运输费率;

d i —待定物流中心到i 点的距离。 求解算法—数值分析法(重心法) 1)

设供应点和需求点所在地的坐标为(X i ,Y i ),待定物流中心的位置坐标为(X 0,Y 0) 则 ()()2020Y Y X X d i i i -+-=(2)

2)

将(2)式代入(1)式,然后求运输总费用TC 对X 0和Y 0的偏导数,并令其等于

零。

∑-+-=2020)()(Y Y X X R V TC i i i i

0)(00=--=??∑i

i i i d X X R V X TC

00=-∑∑i

i

i i i i i d R V X d X R V ∑

∑=

)()(0

i

i

i

i

i

i

i

d R V d X R V X (3) ∑∑=

)

()(0i

i

i

i

i i i

d R V d Y R V Y (4) 上述两式中仍含有未知数d i ,因此一次不能求得X 0和Y 0(解析解),需要通过迭代收敛法得到数值解。

迭代收敛法具体步骤:

1、先用重心公式估算初始选址点(大致位置):

∑=)()(0

i

i

i i

i

R V X R V X (5)

∑∑=

)

()(0i i

i i i

R V Y R V Y (6) 2、将X 0和Y 0代入公式2,计算d i (i=1,2,…,m+n ); 3、将d i 代入公式3和4,解出修正值X 0和Y 0; 4、根据修正值X 0和Y 0,再重新计算d i ;

5、重复步骤3和4,直至X 0和Y 0的值在连续迭代过程中不再变化,即△X 0≈0,

△Y 0≈0,即得到精确仓库选址位置,继续计算无意义。

程序设计具体步骤:

Step1:

利用几何重心公式(5)和(6)估算初始点X 0,Y 0

∑=

)()(0

i

i

i i

i

R V X R V X ∑∑=)

()(0i i

i i i

R V Y R V Y Step2:

将X 0,Y 0代入距离公式(2),计算d i (i=1,2, (5)

2012011)()(Y Y X X d -+-=

2022022)()(Y Y X X d -+-= 2032033)()(Y Y X X d -+-= 2042044)()(Y Y X X d -+-= 2052055)()(Y Y X X d -+-= Step3:

将d i (i=1,2,…,5)代入公式3和公式4,修正值X 0和Y 0

∑∑=

)

()(0i

i

i

i

i

i

i

d R V d X R V X

∑=)()(0

i

i

i

i

i i i

d R V d Y R V Y Step4:

重复步骤2和3,直至修正值X 0和Y 0的值在连续迭代过程中不再变化。(用C++程序进行编译),程序如下所示:

#include #include #include void main() { int n;

float *X,*Y,*V,*R;

cout<<"请输入需求点和供应点总个数:";

cin>>n;

X=new float[n];

Y=new float[n];

V=new float[n];

R=new float[n];

cout<<"请输入各结点的横坐标:";

for (int i=0;i

cin>>X[i];

cout<<"请输入各结点的纵坐标:";

for (i=0;i

cin>>Y[i];

cout<<"请输入各结点的供货量或需求量:";

for (i=0;i

cin>>V[i];

cout<<"请输入各结点的内/外向运输费率:";

for (i=0;i

cin>>R[i];

float sumx=0.0,sumy=0.0,sumqr=0.0;

float avex,avey;

for (i=0;i

{

sumx+=V[i]*R[i]*X[i];

sumy+=V[i]*R[i]*Y[i];

sumqr+=V[i]*R[i];

}

avex=sumx/sumqr;

avey=sumy/sumqr;

cout<<"初始物流中心地址为:"<<"X="<

相关主题
相关文档
最新文档