物流中心选址重心法程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单一物流中心选址重心法程序设计
重心法是一种模拟方法。这种方法将物流系统中的需求点和资源点看成是分布在某一平面范围内的物流系统,各点的需求量和资源量分别看成是物体的重量,物体系统的重心作为物流网点的最佳设置点,利用求物体系统重心的方法来确定物流网点的位置。
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) ∑
∑=
)()(0
i
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
∑∑=
)
()(0i
i
i i
i
R V X R V X ∑
∑=)()(0
i 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=,sumy=,sumqr=; 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="< float *d; d=new float[i]; float xzsumx=,xzsumy=,xzsumqr=; float xzavex,xzavey; int j=0; while (1) { for (i=0;i d[i]=sqrt((avex-X[i])*(avex-X[i])+(avey-Y[i])*(avey-Y[i])); for (i=0;i