选区划分.docx
- 文档编号:10018356
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:27
- 大小:246.95KB
选区划分.docx
《选区划分.docx》由会员分享,可在线阅读,更多相关《选区划分.docx(27页珍藏版)》请在冰豆网上搜索。
选区划分
2008华中地区数学建模联盟赛
承诺书
我们仔细阅读了华中地区数学建模联盟赛的竞赛规则.
我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。
我们知道,抄袭别人的成果是违反竞赛规则的,如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。
如有违反竞赛规则的行为,我们将受到严肃处理。
我们参赛选择的题号是(从A/B中选择一项填写):
B
我们的参赛队编号是:
06023
所属学校(请填写完整的全名):
中南财经政法大学
参赛队员(打印并签名):
1.
2.
3.
日期:
2008年5月12日
湖北省大学生数学建模竞赛组委会
武汉工业与应用数学学会
华中数学建模联盟会
论文标题:
选区划分
选做的题号:
B
编号:
06023
组长:
黄艺婵
*******
******
B题:
选区划分
摘要
本文在巩固地区席位的背景上,对街区的划分进行了研究,我们首先提出了“绝对多数”的标准,设置了“绝对多数”参数K,以便适合各种不同的实际情况。
对于这个问题的分析,我们建立了基于“绝对多数”的K值模型,并将问题划分为三步来求解。
第一步:
我们用堆栈中背包问题求解算法(Knap)找出所有符合以下要求的“候选选区”。
(1):
选区内的街区要相邻;
(2):
选区内总选民数应在30,000到100,000之间;
(3):
某个街区选民数不少于50,000,则允许此街区单独作为一个选区;
(4):
街区10不能单独作为一个选区。
这样我们就把14个街区组合成了许多“候选选区”。
第二步:
我们继续运用堆栈的方法从第一步求得的“候选选区”中选出可行的划分方案,选择的条件是候选选区间的街区号不能重复,并且组合起来就是1到14的街区号,例如:
选区一:
2、1,选区二:
4、3,选区三:
7、6、5,选区四:
11、9、8,选区五:
13,10,选区六:
14,12。
第三步:
在第二步的划分方案下选择最优方案。
然后我们对模型进行了优化,利用图论的方法建立的街区的邻接矩阵,然后结合堆栈的方法重新来求解该问题,使得算法速度得到显著提高:
如本来第一步中需要逐个判断街区是否相邻的,现在利用邻接矩阵我们可以直接找到相邻的街区然后再进行下一个条件判断。
在第二步中我们用表上作业法进行优化,直接把相交的候选选区去掉然后进行下一个条件判断。
优化起到了对数字进行筛选的作用,使得算法的效率得到显著提高,可以解决相对规模更大的问题。
由于相关的文献表明,不同的国家对选举制中的的“绝对多数”有不同的定义,因此我们设变量K,对于不同的国家,只要改变K的值,我们的k值模型都是可以实现的。
我们把问题划分为三步来解决,并在第一和第二步都使用了堆栈。
第一步根据不同的约束条件,栈可以筛选出不同的候选选区。
第二步根据要求划分的选区数设定相匹配的栈容量,得出可行的选区划分方案。
根据不同的条件我们可以进行不同的筛选并且栈容量可以自行设定,因此栈的使用可以使本模型具有很大的灵活性。
如本题中当对绝大多数理解为k=1/2时所能获的最多席位数是5,k=2/3时,所能获的最多席位数是2(实际情况中此种划分的概率很小)。
本文建模的过程中,每一步都尽量考虑实际情况,所以模型的实际应用性和扩展性很强。
关键词:
席位;栈;背包问题求解算法(Knap);“绝对多数”参数K;邻接矩阵;优化;筛选;候选选区;表上作业法
1.问题重述
在—个遥远的国家,SarkMevo所领导的政党最终击败了ReguelTekris王子领导的联合党派。
Mevo希望巩固他在首都地区的席位。
首都由14个街区组成,这些街区将分组为多个选区。
下图是首都地区的示意图。
在图中用数字1到14对这些街区进行了编号。
每个街区中的另外两个数字是预计该街区会投票给Mevo的选民数和该街区的选民总数。
所有选民都必须投票,且选举胜出方必须得到绝对多数选票。
一个选区可以由多个相邻的街区组成,且选区内总选民数应在30,000到100,000之间。
如果两个街区不相邻,例如12和13,则它们不能组成一个选区。
如果某个街区选民人数不少于50,000,则允许此街区单独作为一个选区。
但是由于Mevo本人就居住在街区10内,因此迫于舆论压力,他不能将这个街区单独作为一个选区。
请设计出一个将首都划分为5个选区的方案,以使Mevo得到的席位数最多。
如果这样做有困难,可以尝试划分为6个选区。
2.问题分析
1.对照图我们可以算出首都14个街区的总人数为540000,由于选区划分的条件之一是选区内总选民数应在30,000到100,000之间。
每个选区的人数上限是100000,而总人数有540000。
因此将首都划分为5个选区是不可能的,我们将街区划分为6个选区。
2.对于每个街区预计会投票给Mevo的选民数和该街区的选民总数都是既定的。
Mevo希望巩固他在选区的席位。
那么在第一步分析的基础上,我们希望把首都的14个街区划分为6个选区。
每个选区都是由这14个街区中的若干个街区组成的。
若Mevo在该选区内获得绝对多数的选票,则认为Mevo获得在该选区的席位。
3.依据条件把14个街区划分为6个选区称为一个划分方案。
则在所有的划分方案中Mevo所获得的席位数有能是0,也有可能是6。
4.最后我们所要做的就是在此基础上选择最优的方案,使得Mevo在首都所获得席位书最多。
我们将这个问题划分为三步来求解:
第一步:
我们只考虑四个条件:
(1)选区内的街区要相邻
(2)选区内总选民数应在30,000到100,000之间
(3)某个街区选民人数不少于50,000,则允许此街区单独作为一个选区
(4)街区10不能单独作为一个选区
我们把满足以上四个条件的街区并到一个集合中,这样我们就把14个街区划分成了许多个候选选区。
第二步:
在第一步这些候选选区中任选6个候选选区作为一个划分方案。
选择的条件是这6个候选选区中的元素不能相交,,并且这6个候选选区中的元素并起来就是1到14的数。
第三步:
在第二步的划分方案下选择最优方案。
对于题中所提到的“绝对多数选票”,并且这是一个发生在一个遥远国家的问题,不同的国家对于选举制中的“绝对多数”有不同的的定义。
因此我们在解题的第三步中将对“绝大多数”设置一个判断参数k。
k可以根据具体的情况取1/2或2/3等等。
3.问题假设
1.在每个街区的总人数上我们不考虑迁入、迁出、出生率、死亡率……对街区总人数的影响。
2.我们的划分都符合当地的选举法规,是合法的地划分。
3.选区的划分最后都与行政区域、地理环境、自治区域等因素想协调。
4.投票结果与预计情况相符,即不出现临时更改投票决定的情况。
5.不存在弃权或一票多投的情况,所有选票都有效。
3.模型的建立和求解
设
为i选区的席位,若Mevo获得i选区的席位,则
为1,若Mevo失去i选区的席位,则
为0。
那么我们目标函数就是:
Max=
(i为从1到6的数字)
3.11模型的建立(对于问题第一部的求解)
对于第一步的划分我们只考虑四个条件:
(1)选区是由相邻的街区组成的
(2)选区内总选民数应在30,000到100,000之间
(3)某个街区选民人数不少于50,000,则允许此街区单独作为一个选区
(4)街区10不能单独作为一个选区
我们用堆栈的方法把满足以上四个条件的街区并到一个候选选区中,这样我们就把14个街区划分成了许多个候选选区。
3.12模型的求解
首先我们把每个街区的总人数存储在一个数组w中,以后街区就用街区的编号来代替。
另外算法的实现时,使用一个堆栈s。
算法思想:
从1号街区开始开始顺序的选择街区,如果满足以上四个条件,则将该街区的编号进栈;如果当前选取的街区不满足条件则不进栈,继续选择下一个街区。
如果尚未得到一个划分方法,又已街区可选,则说明上一个进栈的街区不合适,就将堆栈退出一个街区编号,就从退出的编号的下一个编号街区开始尝试进栈。
每求得一组解,就输出堆栈中的所有街区的编号(这些编号的街区就是满足我们以上四个条件的一个划分选区),然后再退出栈顶数据,从当前退出的编号的下一个编号街区开始尝试,直至堆栈为空(无退栈数据),且达到最大编号。
如现在有街区1,2,3,4
若1不能单独作为一个选区1进栈,满足条件输出{1}(街区1的总人数不少于5万)
若2不能单独作为一个选区2进栈,满足条件输出{1,2}(街区1,2相邻,两街区总人数在三万和5万之间)
3不能单独作为一个选区3进栈,满足条件输出{1,2,3}(街区1,2,3相邻,两街区总人数在三万和5万之间)
4不能单独作为一个选区4进栈满足条件输出{1,2,3,4}(街区1,2,3,
4相邻,四街区总人数在三万和5万之间)
若集合{1,2,3,4}不能作为一个选区3出栈,4进栈满足条件输出{1,2,4}
若集合{1,2,4}不能作为一个选区2出栈,3进栈满足条件输出{1,3}
若集合{1,3}不能作为一个选区4进栈,满足条件输出{1,3,4}
若集合{1,3,4}不能作为一个选区3出栈,4进栈满足条件输出{1,4}
若集合{1,4}不能作为一个选区1出栈,2进栈……
每个街区进栈前都要判断是否能单独作为一个选区,若不能单独作为一个选区才能进栈。
我们可以这样来理解。
栈就像是一个背包,背包的体积是一定的,我们的选取选区的四个条件就是背包的体积。
现在有体积不等的一定数量的物品,那么我们需要选择一些物品的组合,使得这些组合物品的体积和等于背包的体积。
类似的现在我们有一些条件互异的14个街区,那么我们需要选择一些街区的组合,使得这些组合街区的条件满足选取选区的条件。
那满足条件的街区组合就是一个可行的划分区域。
算法流程图
用程序算出的结果为:
第几个集合
街区编号
第几个集合
街区编号
1
1
2
1
2
2
3
1
3
2
4
1
5
5
5
1
6
1
5
5
7
2
6
8
2
9
2
3
3
10
2
5
5
11
3
12
3
4
4
13
3
14
3
5
5
6
10
15
4
16
4
17
5
5
6
18
5
19
5
6
6
7
8
20
5
21
5
6
10
8
22
5
11
10
23
6
11
7
24
6
25
8
7
6
8
26
6
27
7
8
8
11
29
7
28
7
8
8
11
9
31
7
30
7
9
9
11
32
8
33
8
9
9
34
8
11
10
35
8
36
8
10
11
11
37
8
38
8
11
11
12
13
39
9
40
9
11
11
41
9
13
12
42
10
43
10
11
13
44
11
45
11
12
13
46
11
47
12
13
48
12
14
14
49
13
14
如集合46里面所含的街区编号为{11,13,14}则表示这三个街区是相邻的,三个街区的人数总和为3万到10万。
也就是满足第一步所要求的四个条件的一个可行的选区。
3.21模型建立(对于问题第二步的求解)
这一步我们所要达到的目的就是在第一步所求出的候选选区中选取6个。
选取的条件是这6个候选选区中的元素不能相交,,并且6个候选选区并起来里面的元素就是1到14的数。
3.22模型求解
在这一步我们也是使用了栈,并用一个1*14的矩阵P来辅助判断,如
我们先让第一个集合{1,2}进栈
则对应的矩阵P的第一列,第二列元素变为1
第二个集合进栈前我们先判断,如第二个集合是{1.5},那么这时我们先看一下矩阵的第一列和第五列的元素是否为一,只要两者中有一个为一,则不进栈。
依次顺序选择候选选区,直到所选择的候选选区中的街区号对应矩阵P中相应的列元素都不为1时,则进栈。
如集合{5,7},进栈,并改变矩阵p中相应的列元素。
然后再依次选择候选选区进栈,直至矩阵中所有元素都变成“1”。
则一个可行的划分区域已经找到,最后输出。
算法流程图
用程序算出最后的结果为:
方案序号
街区编号
方案序号
街区编号
方案序号
街区编号
1
1,11,18,33,43,48
13
2,15,18,34,40,48
25
2,16,24
39,43,48
2
1,11,18,34,40,48
14
2,15,18
34,41,46
26
2,16,24
41,42,49
3
1,11,18,35,41,46
15
2,15,18
35,41,49
27
2,16,25
31,43,48
4
1,11,18,35,41,49
16
2,15,19
31,43,48
28
2,16,26
30,43,48
5
1,11,19,31,43,48
17
2,15,20
30,43,48
29
3,11,23
33,43,48
6
1,11,20,30,43,48
18
2,15,21
24,40,48
30
3,11,23
34,40,48
7
1,11,21,24,40,48
19
2,15,21
24,41,46
31
3,11,23
34,41,46
8
1,11,21,24,41,46
20
2,15,22
24,41,49
32
3,11,23
35,41,49
9
1,11,22,24,21,49
21
2,16,23
33,43,48
33
3,11,24
39,43,48
10
1,14,15,24,40,48
22
2,16,23
34,40,48
34
3,11,24
41,42,49
11
1,14,15,24,41,46
23
2,16,23
34,41,46
35
3,11,25
31,43,48
12
2,15,18,33,43,48
24
2,16,23
35,41,49
36
3,11,26
30,43,48
如方案12表示一个可行的划分区域方案,方案12中包含集合:
2,15,18,33,43,48。
表示在第一步的结果的前提下可知这几个集合中所含的街区编号。
2{1,2,3},15{4},18{5,6,7},33{8,9,11},43{10,13},48{12,14}。
可见这几个集合中所含的街区编号是没有交叉的,并且并起来里面所含的街区编号就是从1到14的数字。
3.31模型建立(第三步的求解)
第三步我们就是要在第二步可行的选区划分的方案中选取最优方案。
在第二步可行的选区划分方案中,Mevo获得席位有可能是最小值0,也有可能是最大值6.因此我们要在第二步的基础上选择最优的划分方案,使得Mevo获得席位数最多。
第三步模型解决的关键在于对题中所说的”绝对多数选票”的理解。
我们认为不同的国家在选举制中对“绝对多数”有不同的理解。
有的国家认为选举中所获的选票大于所有选票的1/2为胜,有的国家则认为所获的选票大于所有选票的2/3为胜。
题中所说的问题发生在一个遥远国家,因此对于“绝对多数”的理解具有不确定性。
因此我们设定变量k,k可以根据不同国家的不同情况取不同的值。
3.32模型的求解
在第二步所得的可行方案中我们可以编制一个程序,让可行方案中每个选区中投给Mevo的选民数和选民总数分别相加,然后在相除。
根据给定的k值判断Mevo能不能获得该选区的席位。
用此种方法分别对6个选区进行统计,最后得出在该方案下Mevo所获得席位总数。
或我们可以吧第二步的结果放到Excel表中,进行简单的加总则可以得出最后的结果。
4.模型的优化
4.1对于第一步的优化
堆栈的特点是有利于推广,但是在成程序中一个一个数据进栈进行比较,这样显然是不合理的。
因为整个过程中必然会有一些数明显是不满足条件根本不用比较的,盲目的进栈进行比较这样当数据量很大的时候必然会加重电脑的负担,并且浪费时间。
针对以上的问题我们希望将此模型进行优化,使得整个过程更具效率。
因此在比较前我们分别针对第一步和第二步对数据进行筛选。
对于第一步的算法。
首先我们把14个街区的图变成14*14的邻接矩阵。
设矩阵中的元素为
,i,j=1、2……14.若
=1则表示i街区和j街区相邻。
=0,则表示i街区和j街区不相邻。
邻接矩阵
对应题目中的图
观察此邻接矩阵,我们发现这个矩阵是对称的。
又由于当
和
都为1的时候。
表示的都是i街区和j街区相临。
因此我们只取
或
中的一个则可以表明i街区和j街区是否相临。
因此我们把邻接矩阵的下三角均全变成0
对应上面的这个矩阵,则如当1街区进栈的时候。
这时我们看矩阵的第一行。
这时我们可以看到为1的元素有:
,
。
我们只看元素的行下标和列下标。
除去1后还有数字2,5。
因此我们将2,5街区进栈比较。
其余的街区有于我们已经在邻接矩阵中得知它们与街区1是显然不相邻的。
因此其余的街区都不用和1比较了。
如不进行数据筛选,那么街区1则要和2到14的街区进行比较看是否满足条件。
而进行比较后,街区1只要和街区2,5比较即可。
可见对数据进行筛选后效率是明显提高的了。
4.2对于第二步的优化
我们把第一步所得的结果填到一个14*14矩阵中。
矩阵中的元素
。
i,j分别表示1到14的街区。
我们把第一步所求得结果放进矩阵中的原则是:
(1)如果集合中只有一个元素i,那么我们把这个集合放到
中,i就是集合中的街区号。
如下图矩阵中的元素2,4,12.
(2)如集合中有两个元素(i,j),则把这个集合放到
或
,矩阵中元素的下标i,j就是集合中的的街区号。
(3)如果集合中有三个元素(i,j,k),i,j,k分别是街区1到十四的编号。
那么这个时候在矩阵中就会有
中放法。
如集合(i,j,k)就可以放在
中。
(4)如果集合中有四个元素(i,j,k,s),i,j,k,s分别是街区1到十四的编号。
那么这个时候在矩阵中就会有
中放法。
如集合(i,j,k,s)就可以放在
,
中。
(5)如果集合中有五个元素……
有了这个矩阵那么我们对第二步的优化为:
如当集合{1,2}进栈时,那么对应矩阵将被我们划掉两行两列,
如:
那么被划掉的集合将不再进栈,我们就有从剩下的元素选择进栈。
如集合{3,4}进栈时
对应矩阵变成
依次从未被划掉的集合中选择进栈,进栈后再在矩阵中划去集合中出现街区好的行和列
由上可知借助矩阵我们可以减少第二步中不必要的比较,提高运算效率。
当集合中的元素越多时,那排除进栈的集合也会越多,那效率也会越高。
如当集合{5,6,8,11}进栈时。
对应的矩阵变成
下一步就是从未被划掉的集合中选择集合集合进栈。
5.结果分析
当k的取值为1/2时,Mevo所能获得的最多的席位书是5。
这时有一种可行的街区划分方案为{3,11,24,41,42,49}则对应的街区划分情况为:
{1,2,5}{3,4}{6,7,8}{9,12}{10,11}{13,14}
当k的取值为2/3,Mevo所能获得的最多的席位书是2。
这时有两种可行的划分方案.方案一为{2,16,24,39,43,48}则对应的街区划分情况为:
{1,2,3}{4,5}{6,7,8}{9,11}{10,13}{12,14}.方案二为{2,16,23,34,40,48}则对应的街区划分情况为:
{1,2,3}{4,5}{6,7}{8,10}{9,11,13}{12,14}
由结果可知,当“绝大多数”的k定义为1/2时,Mevo最多能获得5个席位。
这样的区域划分是有利于Mevo在首都地区执政地位的巩固的。
而当“绝大多数”的k定义为2/3时,Mevo在首都最多只能获得2个席位,这是不利于Mevo的执政地位的巩固的,因此此题取k为2/3来划分区域的概率是很小的。
6.模型的推广
这个模型我们之所分三步来解决,就是为了推广这个模型。
就是当这个问题扩展到更大的范围。
如当某位执政人想要巩固他在全国范围的席位,这时我们不是要划分14个街区,而是全国这一个大的范围。
这时我们可能也不是要划分为6个选区,而是比6更多或更少的时候。
这样的问题用这个模型也是可以解决的。
这时我们只要分别在第一和第二步中改变选择条件则可以实现。
更甚者,我们的这个模型可以推广到更广的领域。
如农民土地的划分,若某一个村子要将村子的土地承包给若干位承包人。
那么则要根据不同的承包人所愿意给承包费的多少,而对应给于承包商合适的土地。
如地图分块问题,如某一个跨国集团的董事长想要把他的企业扩张到全球的各个地方。
在进行市场攻略的时候他们不是以国家或城市为单位的。
为了节约经营成本和便于管理,他们会根据各个地方的不同特点将地图分为若干块,然后再在所分的快上设子公司……
如某城市为了疏通期城市的交通及为了方便其市民乘坐公交车,要在城市的不同的地方设置一定数量的公交车站。
也就是根据一定的划分条件将城市划分为一定数量的区域。
以上例子如国家领土划分,地图分块问题,城市公交车站位置的选区……
其实只要涉及划分的问题,只要我们认真研读划分条件,然后在三步求解过程中分别改变相应的条件,最终则可以得出最优解。
7.模型的评价
这个模型的最大有点就是易于扩展,依据具体的情况改变相应的选择条件则可以使用与很多种情况。
如当问题需要划分的区域是n(不同的题目有不同的n)时,我们只要在第二步的过程中据不同的n值设置n个栈即可。
因此此模型是具有很大的灵活性的。
其次这个模型简单易明,计算量很小,大部分都是用计算机来实现。
人们只要根据具体的情况改变相应的选择条件即可,具有很强的可行性。
这个模型的缺点是要根据具体的情况,对特定的划分条件改变时要在程序中人为的改变。
同时对于不同的情况,当要用此模型时都是要人为的在程序中输入数据的。
参考书目
【1】韩大元,《外国宪法》,中国人名大学出版社,2005年9月第二版
【2】谭浩强,《C程序设计》,清华大学出版社,2005年7月第三版
【3】方辉云,《程序设计》,科学出版社,2005年1月第一版
【4】王少波,《数据结构》,科学出版社,2004年8月第一版
附件:
step1_2.cpp(第一第二步的合程序)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 选区 划分