学校选址问题
- 格式:doc
- 大小:33.50 KB
- 文档页数:7
如果您需要使用本文档,请点击下载按钮下载!
授课:XXX 数学建模(学校选址问题)
选址问题
背景 现如今,教育普及,学校的建设问题也就成为了一个需要考虑的问题。现在,某地新开发的20个小区需要建设配套的小学,设备选的校址共有16个,各校址覆盖的小区情况如下表所示:
备选校址 1 2 3 4 5 6 7 8
覆盖小区 1,2,3,
4,6 2,3,5,8,
11,20 3,5,11,20 1,4,6,7,
12 1,4,8,7,9,
11,13,14 5,8,9,10,
11,16,20 10,11,15,
16,19,20 6,7,12,
13,17,18
备选校址 9 10 11 12 13 14 15 16
覆盖小区 7,9,13,
14,15,17,
18,19
9,10,14,
15,16,18,
19 1,2,4,6,
7 5,10,11,
16,20,
12,13,14,
17,18 9,10,14,
15 2,3,,5,
11,20 2,3,4,
5,8
现在要用最少的校区,包含全部的小区,这问题关系到土地问题,应此,先建立以下模型。
本模型先建立矩阵,由于一个小区只需在一个校址内即可,所以再编程求解出所选校址。
模型假设 一、假设校区可以建得很大,也可以建的很小,不影响其他校区的建立。
二、假设任意小区到可选择的任意校区都一样,距离不考虑。
模型建立 建立矩阵,行表示备选校址,列表示小区号。若某校址能覆盖某小区,则在矩阵的相应位置上添“1”,否则添“0”,为了使矩阵成为方阵,故在矩阵的行最后添加四行全为“0”的行。最终,建立了一下矩阵:A=[
1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 如果您需要使用本文档,请点击下载按钮下载!
授课:XXX 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1如果您需要使用本文档,请点击下载按钮下载!
授课:XXX 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0
1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0
0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1
0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0
0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 0
0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0
1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
模型求解 对于以上方阵,可先将它与一个20行1列的矩阵B=[1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1]相乘,所得的结果就是各个小区所覆盖的小区数。由于本题是要求最少的校区,因此可先选择出覆盖最多的校区,然后将该校区所覆盖的小区全部删去,所以在矩阵里,只需将含“1”最多的行里面,反是“1”的位置的列的所有元素都变成“0”。如此反复,就会在最后一步发现只有矩阵的每一行最多只有1个“1”,且这个“1”在同一列。这样,只要记录下以上用来处理数据使列变零的行的行数,就是所需选出的校区。
这里,对于含“1”数相同,且都是最多的情况,采用矩阵变换后,变后的矩阵各行含一数较大的方式进行变换。如:若某一次变换可有两种选择,则将两种都分别变换,比较变换后的矩阵,看这两个矩阵中含“1”最多的行,哪个行含“1”多,则采用哪种变换。
(以上都是用MATLAB编程实现,具体程序见附录)
最后可以根据MATLAB里所得到的数据,再综合实际情况,加以选址。
计算的结果是,校区选择9 6 1三个,然后再在4 8 13中任选一个,一般选择包含小区最多的校址。所以本方法选出的最少校区为4个。
因此可选用1 6 8 9 四个校区,就可将20个小区都包含在内。对于一个小区,去两个或三个校区都可以的问题,可以根据建校离小区的距离来决定到底去哪个校区。如果您需要使用本文档,请点击下载按钮下载!
授课:XXX
模型推广和分析 本模型可以教方便的找出结果,且很容易推广到其他的选址问题,但是,未考虑到一些的实际问题,比如交通问题,小学生从家到校的安全问题,校区建成的成本,各小区人数等问题。
就本题而言,本程序所求出的个数4个,用很多其他方法程序也可求出,但本程序有个优点,就是本程序对于更多的数据,也可处理,且程序不用变。
附录 先编写函数f0,用来计算哪一行所包含的“1”最多(其中C=A*B):
function y=f0(C)
s=0;
for i=1:20
if C(i)>s
s=C(i);
j=i;
end;
end
y=s;
再编写函数f1,用来计算哪几行都包含了最多的相同数目的“1”,输出的是该行的行数:
function y=f1(A,C)
s=f0(C);
k=1;
for i=1:20
if C(i)==s
t(k)=i;
k=k+1;
end;
end
y=t;
然后编写函数f2,用来将选出行中,为“1”的数的所在列的数都变成“0”:如果您需要使用本文档,请点击下载按钮下载!
授课:XXX function y=f2(A,b)
for k=1:20
if A(b,k)==1;
A(:,k)=0;
end;
end;
y=A;
然后编写程序f3,用来记录到底该选用哪一行,原则是变换后的矩阵,所有行中含“1”的个数最多的行,此行的含“1”数较多:
function y=f3(A,x)
B=[1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1];
p=size(x);
j=p(2);
D=A;
b=0;
for i=1:j
z=f2(D,x(i));
C=z*B;
m=f0(C);
if m>b
b=m;
yy=x(i);
end
D=A;
end;
y=yy;
最后,编写总程序,用来输出必选的行数(answer),和可选择的最后一行(x):
A=[1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0如果您需要使用本文档,请点击下载按钮下载!
授课:XXX 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0
1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0
0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1
0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0
0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 0
0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0
1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
B=[1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1];
C=A*B;
D=A;
k=1;
w=f0(C);
while w>1
x=f1(D,C);
b=f3(D,x);
a(k)=b;
k=k+1;
D=f2(D,b);