1、数学模型及其在信息学竞赛中的应用上海市复旦附中高三(8)班 郭一【关键字】数学模型,可靠性,可解性【引言】数学模型是人们解决现实问题的有力武器。人们把现实问题经过科学地抽象、提炼得到数学模型,再用数学方法去解决。数学模型可分为离散和连续两种。连续数学模型需要大量的高等数学知识,中学生很少接触。在信息学竞赛经常出现的则是离散数学模型。本文主要介绍的就是离散数学模型的一般概念及建立方法。【正文】所谓数学模型,就是现实世界中某一类特殊的运动变化过程、关系或结构的一种模拟性的数学结构,其实也就是对现实模型进行科学抽象后得到的模型。在信息学竞赛中,试题给出的问题通常是一个现实问题,这也就需要选手在审清题
2、意后首先把问题的关键因素总结、提炼出来,形成一个抽象的数学模型,这样有利于问题的分析与解决。一般来说,我们在解一道有关现实问题的试题时,需要分以下几个步骤:审清题意,了解题目的来龙去脉,弄清哪些量是已知的(输入),需要求什么(输出),数据规模如何等等。这是解决问题的前提。建立模型,使之能够简洁高效地表达出题目给出的现实模型。解决模型,得出算法。建模之后就是要解决模型。这步顺利与否很大部分上取决于所建模型的可解性如何。编程实现。其中,、两步是关键。模型建立与解决得好与坏对能否成功解决该题起着决定性的作用。(一)对于同一个现实问题,可能可以建立不同的数学模型这种现象十分普遍,也就是平时所说的一题多
3、解。既然如此,这里有必要讨论一下数学模型的选择问题,其实也就是评判一个模型好坏标准的问题。一个好的数学模型不仅要能够准确地反映出现实模型(可靠性),所建立的模型还必须能够被有效地解决(可解性)。这里“有效”指的是解决它的算法所需的空间与时间都在可以承受的范围之内。通常在解一些要求最优解或要求准确计数的一类具有唯一正确解的试题时,我们一般在保证可靠性的前提下,尽量提高模型的可解性。若几个模型都具有可靠性,则当然可解性越强的模型越好。例: 最佳旅行路线问题 IOI93【问题描述】你在加拿大航空公司组织的一次竞赛中获奖,奖品是一张免费机票,可在加拿大旅行,从最西的一个城市出发,单方向从西向东经若干城
4、市到达最东的一个城市(必须到达最东的城市);然后再单方向从东向西飞回起点(可途径若干城市)。除起点城市外,任何城市只能访问次,起点城市被访问次:出发一次;返回一次。除指定的航线外,不允许乘其他航线也不允许使用其他交通工具。求解的问题是:给定城市表列及两城市之间的直通航线表列,请找出一条旅行路线,在满足上述限制条件下,使访问的城市数尽可能多。这是一个现实问题,我们首先可以做如下的抽象:把每个城市抽象成一个顶点。不妨设由西到东的城市对应编号分别是 1 至 n。若两个城市之间有直通航线,则在相应的两点之间连一条边。这样,所有城市与直通航线就被抽象成了一个无向图。【盲目搜索】这是最原始的想法。我们一开
5、始假想有两架飞机都从最西边的城市飞向最东边的城市,并且在搜索的过程中保证两条路线中的城市除起点与终点外都不相同。记下所有找到的路线中所经城市最多的方案,把其中的一条作为向东旅行的路线,一条作为向西旅行的路线,合并起来即得最佳旅行路线。因为搜索的时间复杂度是指数级的,所以这样做的话,时间效率不够理想。究其主要原因就是所有模型的抽象程度不够,没有把试题中的限制充分融入数学模型中,盲目性太大。【网络流模型】为了把更多的试题中的限制融入模型中,我们在原有的模型的基础上建立了如下的最大费用最大流的模型:1)为了保证每个城市最多只能被访问一次,我们把每个城市 i 拆成两个顶点 i 和 i,并在两个顶点之间
6、连接一条 i 至 i的有向弧,单位费用设为0。2)将原图中的无向边改为有向弧:若城市 i 到城市 j 有直通航线(ij,或i=j=n 时,我们考虑 i 的前趋顶点,不妨设为 k。此时,到达顶点 k 与 j 的两条路线的所需乘航线之和也一定最大,否则与 fi,j最大矛盾。若 i Si-p (pin)Si = 0 then inc(di - q); S(i) = 0 then dec(di - q);di := -1;next := true;end;until not next or (count = n + 1); 直到所有顶点已被赋上序号或无 0 度顶点为止输出if count =l0 th
7、en begin 根据 a0l 0-(si- )b 0 构造有向边 0lsaddedge(i,i-l0,a0-l0);addedge(i-l0,i,l0-b0);end; thenif i=l1 then begin 根据 a1s i- b 1 构造有向边 laddedge(i-l1,i,a1);addedge(i,i-l1,-b1);end; thenaddedge(i-1,i,0); 根据 si-1s i 构造有向边 addedge(i,i-1,-1); 根据 sis i-1+1 构造有向边end; forend; initprocedure main; 计算顶点 0 至其余顶点的最长路径
8、 var i,j ,k:integer;beginfillchar(s,sizeof(s) ,0); s 数组清零 for i:=1 to n do 逐条边地延长路径 for j:=0 to n do 枚举第 i 条边的所有可能情况 for k:=1 to numj doif sj+headj,k.vsheadj,k.no 若顶点 0 至顶点 headj,k.no 的所有路径中,经过顶点 j 的第 k 条有向边的一条路径为目前最长,则记下 then beginsheadj,k.no:=sj+headj,k.v ;if sheadj,k.noheadj,k.no then begin 若 0 位
9、 headj,k.no 位全填 1 也不能满足条件,则无解退出 writeln(-1);exit;end; thenend; thenfor j:=0 to n do 检查有向图。若出现有向环,则无解退出 for k:=1 to numj doif sj+headj,k.vsheadj,k.no then beginwriteln(-1);exit;end; thenfor i:=1 to n do 根据 s 数组的值构造满足条件的 01 串 if si=si-1 then write(0)else write(1);writeln;end; mainbeginassign(input,inputfile); 输入文件名串与文件变量连接 reset(input); 输入文件读准备 assign(output,outputfile); 输出文件名串与文件变量连接 rewrite(output); 输出文件写准备 init; 输入数据,构造有向图 main; 计算和输出一个满足所有条件的 01 串 close(input); 关闭输入文件和输出文件 close(output);end. 程序结束