物流中心选址重心法c++程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
void main()
{
int n;
float *X,*Y,*V,*R;
cout<<"请输入需求点和供应点总个数:";
cin>>n;
X=new float[n];
Y=new float[n];
求解算法—数值分析法(重心法)
1)设供应点和需求点所在地的坐标为(Xi,Yi),待定物流中心的位置坐标为(X0,Y0)
则 (2)
2)将(2)式代入(1)式,然后求运输总费用TC对X0和Y0的偏导数,并令其等于零。
(3)
(4)
上述两式中仍含有未知数di,因此一次不能求得X0和Y0(解析解),需要通过迭代收敛法得到数值解。
迭代收敛法具体步骤:
1、先用重心公式估算初始选址点(大致位置):
(5)
(6)
2、将X0和Y0代入公式2,计算di(i=1,2,…,m+n);
3、将di代入公式3和4,解出修正值X0和Y0;
4、根据修正值X0和Y0,再重新计算di;
5、重复步骤3和4,直至X0和Y0的值在连续迭代过程中不再变化,即△X0≈0,△Y0≈0,即得到精确仓库选址位置,继续计算无意义。
float xzavex,xzavey;
int j=0;
while (1)
{
for (i=0;i<n;i++)
d[i]=sqrt((avex-X[i])*(avex-X[i])+(avey-Y[i])*(avey-Y[i]));
for (i=0;i<n;i++)
{
xzsumx+=V[i]*R[i]*X[i]/d[i];
sumy+=V[i]*R[i]*Y[i];
sumqr+=V[i]*R[i];
}
avBaidu Nhomakorabeax=sumx/sumqr;
avey=sumy/sumqr;
cout<<"初始物流中心地址为:"<<"X="<<avex<<' '<<"Y="<<avey<<endl;
float *d;
d=new float[i];
float xzsumx=0.0,xzsumy=0.0,xzsumqr=0.0;
单一物流中心选址重心法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为序号的末位数。请用计算机编写一个通用程序,完成下面的题目。
avex=xzavex;
avex=xzavey;
xzsumx=0.0;
xzsumy=0.0;
xzsumqr=0.0;
j++;
}
}
cout<<"物流中心最佳地址为:"<<"X="<<xzavex<<' '<<"Y="<<xzavey<<endl;
}
物流管理082
孙文婷
200800847
(1)用城市距离为该企业推荐一个地址,使该企业的费用最省。
(2)将第1问中的结果作为一个初始解,用欧氏距离进行重新优化,推荐一个最优的位置。
要求:
(1)前后两次结果之差小于0.001;
(2)程序的通用性高,可以满足任何多个供应商;
(3)程序的可读性强;
(4)操作界面友好;
(5)在手册中要记录所有的程序、运行结果及相关界面图形。
解:
重心法是一种模拟方法。这种方法将物流系统中的需求点和资源点看成是分布在某一平面范围内的物流系统,各点的需求量和资源量分别看成是物体的重量,物体系统的重心作为物流网点的最佳设置点,利用求物体系统重心的方法来确定物流网点的位置。
(1)
式中:Vi—i点运输量;
Ri—待定物流中心到i点的运输费率;
di—待定物流中心到i点的距离。
for (i=0;i<n;i++)
cin>>V[i];
cout<<"请输入各结点的内/外向运输费率:";
for (i=0;i<n;i++)
cin>>R[i];
float sumx=0.0,sumy=0.0,sumqr=0.0;
float avex,avey;
for (i=0;i<n;i++)
{
sumx+=V[i]*R[i]*X[i];
xzsumy+=V[i]*R[i]*Y[i]/d[i];
xzsumqr+=V[i]*R[i]/d[i];
}
xzavex=xzsumx/xzsumqr;
xzavey=xzsumy/xzsumqr;
if (j==50)
break;
else
{
cout<<"第"<<j+1<<"次迭代:"<<"tempX="<<xzavex<<' '<<"tempY="<<xzavey<<endl;
V=new float[n];
R=new float[n];
cout<<"请输入各结点的横坐标:";
for (int i=0;i<n;i++)
cin>>X[i];
cout<<"请输入各结点的纵坐标:";
for (i=0;i<n;i++)
cin>>Y[i];
cout<<"请输入各结点的供货量或需求量:";
程序设计具体步骤:
Step1:
利用几何重心公式(5)和(6)估算初始点X0,Y0
Step2:
将X0,Y0代入距离公式(2),计算di(i=1,2,…,5)
Step3:
将di(i=1,2,…,5)代入公式3和公式4,修正值X0和Y0
Step4:
重复步骤2和3,直至修正值X0和Y0的值在连续迭代过程中不再变化。(用C++程序进行编译),程序如下所示:
#include <math.h>
#include <stdlib.h>
void main()
{
int n;
float *X,*Y,*V,*R;
cout<<"请输入需求点和供应点总个数:";
cin>>n;
X=new float[n];
Y=new float[n];
求解算法—数值分析法(重心法)
1)设供应点和需求点所在地的坐标为(Xi,Yi),待定物流中心的位置坐标为(X0,Y0)
则 (2)
2)将(2)式代入(1)式,然后求运输总费用TC对X0和Y0的偏导数,并令其等于零。
(3)
(4)
上述两式中仍含有未知数di,因此一次不能求得X0和Y0(解析解),需要通过迭代收敛法得到数值解。
迭代收敛法具体步骤:
1、先用重心公式估算初始选址点(大致位置):
(5)
(6)
2、将X0和Y0代入公式2,计算di(i=1,2,…,m+n);
3、将di代入公式3和4,解出修正值X0和Y0;
4、根据修正值X0和Y0,再重新计算di;
5、重复步骤3和4,直至X0和Y0的值在连续迭代过程中不再变化,即△X0≈0,△Y0≈0,即得到精确仓库选址位置,继续计算无意义。
float xzavex,xzavey;
int j=0;
while (1)
{
for (i=0;i<n;i++)
d[i]=sqrt((avex-X[i])*(avex-X[i])+(avey-Y[i])*(avey-Y[i]));
for (i=0;i<n;i++)
{
xzsumx+=V[i]*R[i]*X[i]/d[i];
sumy+=V[i]*R[i]*Y[i];
sumqr+=V[i]*R[i];
}
avBaidu Nhomakorabeax=sumx/sumqr;
avey=sumy/sumqr;
cout<<"初始物流中心地址为:"<<"X="<<avex<<' '<<"Y="<<avey<<endl;
float *d;
d=new float[i];
float xzsumx=0.0,xzsumy=0.0,xzsumqr=0.0;
单一物流中心选址重心法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为序号的末位数。请用计算机编写一个通用程序,完成下面的题目。
avex=xzavex;
avex=xzavey;
xzsumx=0.0;
xzsumy=0.0;
xzsumqr=0.0;
j++;
}
}
cout<<"物流中心最佳地址为:"<<"X="<<xzavex<<' '<<"Y="<<xzavey<<endl;
}
物流管理082
孙文婷
200800847
(1)用城市距离为该企业推荐一个地址,使该企业的费用最省。
(2)将第1问中的结果作为一个初始解,用欧氏距离进行重新优化,推荐一个最优的位置。
要求:
(1)前后两次结果之差小于0.001;
(2)程序的通用性高,可以满足任何多个供应商;
(3)程序的可读性强;
(4)操作界面友好;
(5)在手册中要记录所有的程序、运行结果及相关界面图形。
解:
重心法是一种模拟方法。这种方法将物流系统中的需求点和资源点看成是分布在某一平面范围内的物流系统,各点的需求量和资源量分别看成是物体的重量,物体系统的重心作为物流网点的最佳设置点,利用求物体系统重心的方法来确定物流网点的位置。
(1)
式中:Vi—i点运输量;
Ri—待定物流中心到i点的运输费率;
di—待定物流中心到i点的距离。
for (i=0;i<n;i++)
cin>>V[i];
cout<<"请输入各结点的内/外向运输费率:";
for (i=0;i<n;i++)
cin>>R[i];
float sumx=0.0,sumy=0.0,sumqr=0.0;
float avex,avey;
for (i=0;i<n;i++)
{
sumx+=V[i]*R[i]*X[i];
xzsumy+=V[i]*R[i]*Y[i]/d[i];
xzsumqr+=V[i]*R[i]/d[i];
}
xzavex=xzsumx/xzsumqr;
xzavey=xzsumy/xzsumqr;
if (j==50)
break;
else
{
cout<<"第"<<j+1<<"次迭代:"<<"tempX="<<xzavex<<' '<<"tempY="<<xzavey<<endl;
V=new float[n];
R=new float[n];
cout<<"请输入各结点的横坐标:";
for (int i=0;i<n;i++)
cin>>X[i];
cout<<"请输入各结点的纵坐标:";
for (i=0;i<n;i++)
cin>>Y[i];
cout<<"请输入各结点的供货量或需求量:";
程序设计具体步骤:
Step1:
利用几何重心公式(5)和(6)估算初始点X0,Y0
Step2:
将X0,Y0代入距离公式(2),计算di(i=1,2,…,5)
Step3:
将di(i=1,2,…,5)代入公式3和公式4,修正值X0和Y0
Step4:
重复步骤2和3,直至修正值X0和Y0的值在连续迭代过程中不再变化。(用C++程序进行编译),程序如下所示: