当前位置:文档之家› 图论模型的构建

图论模型的构建

为此,我们必须寻找解决问题的更好途径。
【方形柱体堆砌问题分析】
对符合要求的方形柱体来讲,交换任意两个正 方体的上下位置,得到的方形柱体仍是符合要求的, 即它的4个侧面都有4种颜色。它的每一对对面由4 个正方体各一个对面组成,因此问题的要素是4个正 方体各3个对面的颜色的构成,于是从每个对面的着 色考虑。用字母b,g,r,y分别表示蓝、绿、红、黄4种 颜色,并作为图的4个 顶点,4个正方体的各三个对 面依各对面的颜色连以边,并分别标以e1、e2、e3、 e4,比如第一个正方体有一对面着蓝、黄两色,则 从顶点b到y引一条边标以e1,另两对面为红对红、红 对绿,故联结r,e和r,g,均标以 e1。同样地根据第二、 三、四正方体的各对面着色分别连以边并分别标以 e2 、e3、e4。则得图G,如图1—3所示。
si<si+p
(0≤i≤n-p)
si+q<si
(0≤i≤n-q)
【奇怪的数列分析】
下面,我们把每个si抽象成一个点,则根据上述两个不 等式可以建立一个有向图,图中共有n+1个顶点,分别 为s0,s1,……,sn。若si>sj(0≤i,j≤n),则从si往sj 引出一条有向边。例如对于n=6,p=5,q=3的情况, 我们可以建立图4
begin
if i+p<=n then begin
g[i+p,i]=1;
d[i]=d[i]+1;
end;
if i+q<=n then begin
g[i,i+q]=1;
d[i+q]=d[i+q]+1;
end;
end;
【奇怪的数列分析】
显然,按照上面的定义,如果建立的图可以拓扑排序,其 顶点的拓扑序列可以对应满足条件的整数数列;反之,不 存在这样的整数数列。 算法框架为:
对图进行拓扑排序; if 图有回路 then 无解退出
else 生成拓扑序列 order[0]…order[n]; 如果得到了一个拓扑序列,该如何转换成s数组呢?因为拓 扑序列中顶点对应的s值是递减的,其中s0=0。如果 order[i]=0,则依次设定sorder[0]=i,sorder[1]=i-1,……, sorder[i-1]=1,sorder[i]=0,sorder[i+1]=-1,……, sorder[n]=i-n。例如,对于图4所示的有向图,可以得到表 1:
2、若能,找出一种堆砌方法。
【方形柱体堆砌问题分析】
一个正方体有6个面,所以4个正方体可以堆砌 出为数十分可观的不同状态。就是确定了4个正方 体依Ⅰ,Ⅱ,Ⅲ,Ⅳ次序从上到下排列,只考虑两 两接触面不同,也有6^4=1296种排列,这里还没 有考虑4个侧面的不同组合。若考虑到后者,又会 衍生出许多各异的形式,先令第Ⅰ个正方体保持不 动,Ⅱ,Ⅲ,Ⅳ正方体个有4个侧面,故有4^3=64 种状态。因此即使在从上到下按序排列情况下,仍 然有1296×64=82944种状态。若用穷举法求这类 问题,将是不胜其烦的。
【例3】 机器人布阵
有一个N*M(N,M<=50)的棋盘,棋盘的每一 格是三种类型之一:空地、草地、墙。机器人只 能放在空地上。在同一行或同一列的两个机器人, 若它们之间没有墙,则它们可以互相攻击。问给 定的棋盘,最多可以放置多少个机器人,使它们 不能互相攻击。
空地 Empty 草地 Grass
墙 Wall
要素(2)、(3)可抽象为开始时设人和其他三样东 西在河的左岸,这种情况用集合{mwsv}表示。在过河过 程中左岸出现的情况有以下16种: {wmsv} {mws} {mwv} {msv} {wsv} {mw} {ms} {mv} {ws} {wv} {sv} {m} {s} {v} {w} {φ}
显然这一模型不是属于一些特殊的图,给我们设计算法 带来很大的麻烦。
【模型二】
我们将每一行,每一列被墙隔开,且包含空地的连续区域称 作“块”。显然,在一个块之中,最多只能放一个机器人。我 们把水平方向的这些块编上号;同样,把竖直方向的块也编上 号。
1
2
3
4
5
水平方向的块编号
1 2
3 4
竖直方向的块编号
【例4】奇怪的数列
编程输入3个整数n,p,q,寻找一个由整数组成的数列 (a1,a2,……,an),要求:其中任意连续p项之和为正 数,任意连续q项之和为负数。0<n<100,0<p,q<n,若不 存在这样的整数数列,则输出NO;否则输出满足条件的一 个数列即可。
【输入格式】
输入文件名为num.in,仅一行分别表示n,p,q,之间用 一个空格隔开。
问题的求解目标就归结为:在图G中找一条连接顶点mwsv与 φ,并且包含边数最少的路径。把图的边长设为1,那么渡河 问题归结为求顶点mwsv到顶点φ的最短路径问题。
【例2】方形柱体堆砌
有4个正立方体,它们的6个侧面各着以绿、蓝、红、黄4 种颜色之一,如图1-2所示。现在要把这4个正方体堆成一方 形柱体,堆成的方形柱体每个侧面4种颜色都有。 求解任务:1、这4个正方体能否堆成符合要求的方形柱体?
fillchar(s,sizeof(s),0); for i:=0 to n do if order[i]<>0 then for j : = i downto 0 do s[order[ j]]←s[order[ j]]+1
径上每条边的权相加得到,求解目标往往是求图中或是
两点之间所有路径的权的最优值。
• 权的运算也会产生一些变形,例如权的运算由 简单的相加、求最值扩展到相乘,或是更复杂的函数 计算等等。
以上这些差异形成了图论模 型的多样化,使图论模型可以广 泛地适应各类问题,但这些丰富 的选择同时也增加了图论建模的 难度。。
问题的要素有三点:(1)人及他所带的3样东西;(2) 人不在时狼就会吃掉羊,羊就要吃白菜,即人在渡河 时,一岸上不能同时留下狼和羊或羊和白菜;(3)人 每次至多带一样东西渡河,并要保证岸上的安全。
问题的求解目标:求河上往返次数最少的渡河方案。
对于要素(1),用字母m代表人,w代表狼,s代表 羊,v代表白菜。
【输出格式】
输出文件名为num.out,只有一行,有解即输出这个数列, 每个数之间用一个空格隔开。否则输出NO。
【奇怪的数列分析】
从形式上看,这道题与图论风马牛不相干,题中既未出 现图论中常见的“车站”,“城市”等顶点,也未出现 “公路”,“铁路”等边,更未出现“长度”,“传输时 间”等权。仅以数学角度考虑,按常规思想来分析如何表 示“连续几项之和”这一要点,直接将第i个整数ai开始的 k 个 整 数 之 和 描 述 成 多 项 式 ai+ai+1+…+ai+k-1 的 话 , 问 题 就很难再往下思考和解决了。所以,我们不防换个角度, 暂且撇去每一项数究竟为何值的具体细节,而将注意力集 中至连续性这一特点上。设si表示数列前i个整数之和,即 si=a1+a2+…+ai。其中s0=0 (0≤i≤n)。显然根据题意, 有:
二.图论建模方法
1. 要素的选取
在建立模型之前,我们首先要对研究对象进行 全面的调查,将原型理想化、简单化;然后对原 型进行初步的分析,分清其中的各个要素及求解 目标,理出它们之间的联系;下一步就是用恰当 的模型来描述这些要素及联系。 【例1】渡河问题
一个人带了一只狼、一只羊和一筐白菜想要过 河。河上有一只小船,每次除了人以外,只能带 一样东西。另外,如果人不在时狼就会吃掉羊, 羊就要吃白菜。问怎样安排渡河,才能做到既把 所有东西都带过河,而且在河上往返次数最少?
“串联求最值,并联求和”,即一条路径上最大或是最
小的权决定了整条路径的权,而求解目标则是求图中或
是两点之间所有路径的权的加和。

还有的图不仅包含边权(边集E到实数集R的映
射),还包含点权(点集V到实数集R的映射);或是
包含好几类不同性质的权。

有的权表示长度或是时间等等,它们的运算特征是
“串联求和,并联求最值”,即一条路径的权由这条路
S1
S2
S0 S6
图4
S3
S4 S5
【奇怪的数列分析】
构造这样的有向图很简单,过程如下:
fillchar(g,sizeof(g),0); {有向图的邻接矩阵初始化}
fillchar(d,sizeof(d),0); {各顶点的入度序列初始化}
for i:=0 to n do
{根据两组不等式构造有向图}
e4
b
e3
e1 e2
e4 e3
y
e2
e3
r
e1
从图中,能找 到两个 e2 Hamiltion回 路,每个回路
e1
的4条边分别 是
g e4 e1,e2,e3,e4。
(见下页 )
e4
b
e3
e1 e2
e4 e3
r
e1
e2 e1
y
e2
g
e4
e3
2. 选择合适的理论体系
图由点、边、权三部分组成,根据这三部分的性 质的不同,就有着不同的图论模型,有着不同的理论 和算法,也就构成了不同的理论体系。图论建模依据 的是图论的基本理论和基本算法。
【奇怪的数列分析】
i
0
1
2
3
4
5
6
order[i]
2
Байду номын сангаас
5
0
3
6
1
4
sorder[i]
2
1
0
-1
-2
-3
-4
所以,得到s0=0,s1=-3,s2=2,s3=-1,s4=-4,s5=1,s6=-2。再 根据s的定义,由: ai=(a0+a1+…+ai-1+ai) - (a0+a1+…+ai-1)=sisi-1 , 求 出 : a1=s1-s0=-3 , a2=s2-s1=5 , a3=s3-s2=-3 , a4=s4s3=-3,a5=s5-s4=5,a6=s6-s5=-3。显然这个整数数列的任意连续5 个整数之和为正,任意连续3个整数之和为负。由拓扑序列构造整数数 列的算法如下:
相关主题