所得税交纳点选址的数学模型
试题:所得税交纳点选址
所得税管理部门
对某个城市的所得税交纳点网络进行重新
。下图是该城市主要区和主要道路的示意图。区旁边的黑体数字
示该区居民数目,单位为千人。在连区之间的弧上标出了它们之间的距离,单位为千米(斜体字)。为覆盖整个城市,所得税管理部门决定在三个区设置纳税点。请建立数学模型给出三个纳税点安排的最佳方案。
摘要
所得税管理部门计划对某个城市的所得税交纳点网络进行重新设计。如图所示,区旁边的黑体数字表示该区居民数目,单位为千人。在连区之间的弧上标出了它们之间的距离,单位为千米(斜体字)。为覆整个城市,所得税管理部门决定在三个区设置纳税点。
首先我们将问题参数化,建立数学模型。然后利用穷举法计算出每个点到所指定的三个纳税点的距离,再利用弗洛依德算法得出距离矩阵,并结合 math lab等程序(C语言、Lingo),得出其与人数加权后的距离矩阵。
最后得出在1,6,和11 设置纳税点为最佳。1,2,5,7区 的居民去1区 的纳税点缴税,3,4,6,9 区的居民去6 区的纳税点缴税,8,10,11,12区的居民去11区 的纳税点缴税。
我们的模型虽然简单,但合理、实用,可以被各领域针对自己的情况应用到
中去,指导他们的实际工作。
模型的总体假设
1. 假设纳税点集中在每个区的中心;
2. 假设限定每个区的居民只能到一个纳税点缴税;
3. 假设三个纳税点之间无特定联系;
4. 不考虑“道路难度系数”(即实际路程、地面情况及障碍物等);
5. 不考虑路程与时间的关系(即选出的是人数和距离加权后最小的纳税点,而非时间最短);
6. 不考虑居民的迁入迁出,即假定该区居民数目稳定;
7. 不考虑居民的主观因素(如个人偏好,或者因最近纳税点人多而临时改变纳税点等);
模型的建立与求解
◆第一步:模型的建立
根据假设一,每个纳税点集中在每个区的中心,可能的位置有12种,则三个纳税点的组合至多有
=12*11*10/6=220个。可将问题参数化。
参数的假定:
① i、j、k——所选纳税点的区号;(共有
=220种选择方案)
② m——区号数;(m=1、2、3…12)
③
——m区的居民数,单位为千人;
④
、
、
——分别表示m区到i、j、k区(即所选纳税点)的最小距离;
⑤
=Min[
,
,
]即m区到三个纳税点的最小距离;
则问题可以表述为:
求目标函数:Min[Z(i,j,k)]=
◆第二步:模型的求解(考虑用穷举法)
一、距离矩阵的建立
1、i=1,j=2,k=3(即所选的三个纳税点为1区,2区,3区);
(1)m=1,2,3时,显然,
=0;
=0;
=0(即纳税点所在居民到本区纳税的距离最小,距离为0)
(2)m=4时,由题图显然:
=55(4——3——2——1);
=40(4——3——2);
=18(4——3);
=min(
,
,
)=
=18;
……
(10) m=12时,由题图显然:
=67(12——9——5——1);
=61(12——9——3——2);
=39(12——9——3);
=min(
,
,
)=
=39;
2、 i=1,j=2,k=4 (即所选的三个纳税点为1区,2区,4区);
(1) m=1,2,4时,显然,
=0;
=0;
=0(即纳税点所在居民到本区纳税的距离最小,距离为0。
(2)m=3时,由题图显然:
=37(3——2——1);
=22(3——2);
=18(3——4);
=min(
,
,
)=
=18;
……
(10) m=12时,由题图显然(以此类推):
……
以此类推,可得距离矩阵如下:
二、距离与人数的加权
与人数加权后的距离矩阵如下:
由公式Min[Z(i,j,k)]=
结合与人数加权后的距离矩阵可得结果为:加权后的最小距离和为2438;在1,6,和11 设置纳税点为最佳。1,2,5,7区 的居民去1区 的纳税点缴税,3,4,6,9 区的居民去6 区的纳税点缴税,8,10,11,12区的居民去11区 的纳税点缴税。
三、 将上述求解过程程序化(以Math lab为主,C语言程序、Lingo 的程序及运行结果见附录)
Math lab思考过程及程序如下:
第一步,用标号法求出每一个顶点vi至其它各个顶点vj的最短路径长度dij(i,j = 1,2,…,12),并将其写成如下距离矩阵:
ShortDistance=
第二步,以各顶点的载荷(人口数)加权,求每一个顶点至其它各个顶点的最短路径长度的加权和,并将其写成如下距离矩阵:
ShortPath=
第三部,用穷举法任选三点,求其他九点中的任意一点到该三点的加权距离的最短距离的加权和,MATLAB中可用矩阵依次求出所有可能的结果,并标记最短距离SDL及最优第三点i,j,k.
第四步,输出,shortpath,SDL及i,j,k.
M=inf;A=[15 10 12 18 5 24 11 16 13 22 19 20];
a=[0,15,M,M,24,M,18,M,M,M,M,M;0,0,22,M,M,M,M,M,M,M,M,M;zeros(1,3),18,16,M,M,M,20,M,M,M;zeros(1,4),M,12,M,M,M,M,M,M;zeros(1,5),M,M,12,24,M,M,M;zeros(1,6),M,M,12,M,M,22;zeros(1,7),15,M,22,M,M;zeros(1,8),30,M,25,M;zeros(1,9),M,19,19;zeros(1,10),19,M;zeros(1,11),21;zeros(1,12)];
a=a+a';
for i=1:length(a)
pb(1:length(a))=0;pb(i)=1; d(1:length(a))=M;d(i)=0;temp=i;
while sum(pb)
void floyd(int (*dist)[13],int n)
{ int i,j,k;
for(k=1;k