数与图的完美结合—浅析差分约束系统
差分约束
(本文假设读者已经有以下知识:最短路径的基本性质、Bellman-Ford算法。
)比如有这样一组不等式:X1 - X2 <= 0X1 - X5 <= -1X2 - X5 <= 1X3 - X1 <= 5X4 - X1 <= 4X4 - X3 <= -1X5 - X3 <= -3X5 - X4 <= -3不等式组(1)全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于)。
这样的不等式组就称作差分约束系统。
这个不等式组要么无解,要么就有无数组解。
因为如果有一组解{X1, X2, ..., Xn}的话,那么对于任何一个常数k,{X1 + k, X2 + k, ..., Xn + k}肯定也是一组解,因为任何两个数同时加一个数之后,它们的差是不变的,那么这个差分约束系统中的所有不等式都不会被破坏。
差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。
即对于任何一条边u -> v,都有:d(v) <= d(u) + w(u, v)其中d(u)和d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。
显然以上不等式就是d(v) - d(u) <= w(u, v)。
这个形式正好和差分约束系统中的不等式形式相同。
于是我们就可以把一个差分约束系统转化成一张图,每个未知数Xi对应图中的一个顶点Vi,把所有不等式都化成图中的一条边。
对于不等式Xi - Xj <= c,把它化成三角形不等式:Xi <= Xj + c,就可以化成边Vj -> Vi,权值为c。
最后,我们在这张图上求一次单源最短路径,这些三角形不等式就会全部都满足了,因为它是最短路径问题的基本性质嘛。
话说回来,所谓单源最短路径,当然要有一个源点,然后再求这个源点到其他所有点的最短路径。
那么源点在哪呢?我们不妨自已造一个。
将数加冕为图:差分约束
【问题描述】 有一个整数序列,我们不知道她的长度是多少(即序列中整数的 个数),但我们知道在某些区间中至少有多少个整数,用区间 [ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai,bi]这个区 间的整数至少有ci个。现在给出若干个这样的区间,请你求出满足条 件的最短序列长度是多少。如果不存在则输出 -1。 【文件输入】 第一行包括一个整数n(n<=1000),表示区间个数; 以下n行每行描述这些区间,第i+1行三个整数ai,bi,ci,由空 格隔开,其中0<=ai<=bi<=1000 而且 1<=ci<=bi-ai+1。 【文件输出】 文件输出只有一个整数表示满足要求序列长度的最小值。 注意:序列中不能有相同数字.
关键字:不等式 差分约束ห้องสมุดไป่ตู้SPFA 建图
什么是差分约束
如果一个系统由n个变量和m个约束条件组成,其 中每个约束条件形如: xj-xi<=bk(i,j∈[1,n],k∈[1,m]) 则称其为差分约束系统。
总而言之,差分约束系统是求解关于一组变量的 特殊不等式组的方法。
怎样用差分约束系统解决问题
引理
设x=(x1,x2,…,xn)是差分约束系统 Ax≤b的一个解,d为任意常数。 则x+d=(x1+d,x2+d,…,xn+d)也是该 系统Ax≤b的一个解。
算法总结---差分约束系统
Contents一、定义二、详解三、例题一、定义(百度百科):如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。
亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。
观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]。
因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk。
我们再增加一个源点s,s与所有定点相连,边权均为0。
对这个图,以s为源点运行Bellman-ford算法(或SPFA算法),最终{d[ i]}即为一组可行解。
例如,考虑这样一个问题,寻找一个5维向量x=(xi)以满足:这一问题等价于找出未知量xi,i=1,2,…,5,满足下列8个差分约束条件:x1-x2≤0x1-x5≤-1x2-x5≤1x3-x1≤5x4-x1≤4x4-x3≤-1x5-x3≤-3x5-x4≤-3该问题的一个解为x=(-5,-3,0,-1,-4),另一个解y=(0,2,5,4,1),这2个解是有联系的:y中的每个元素比x 中相应的元素大5。
引理:设x=(x1,x2,…,xn)是差分约束系统Ax≤b的一个解,d为任意常数。
则x+d=(x1+d,x2+d,…,xn+d)也是该系统Ax≤b的一个解。
bellman-ford算法伪代码:for each v V do d[v] <-- 无限大; d[s] <-- 0Relaxationfor i =1,...,|V|-1 dofor each edge (u,v) 属于E dod[v] <-- min{d[v], d[u]+w(u,v)}Negative cycle checkingfor each v 属于V do if d[v]> d[u] + w(u,v) then no solution在实际的应用中,一般使用SPFA(Shortest Path Fast Algorithm)算法来实现。
算法合集之《SPFA算法的优化及应用》
- 第 2 页共 37 页 -
2009Thesis
【正文】
SPFA 的优化与应用
姜碧野
SPFA 算法简介
1.1 SPFA 算法的基本实现
下面,先介绍一下 SPFA 和 Bellman-Ford 算法的原理和适用条件。 首先一个很重要的性质便是三角不等式。 设 G=(V,E)为一带权有向图,其权函数 w:EÆR 为边到实型权值的映射,s 为源点,对于任意点 t,d(s,t)为 s 到 t 的最短路。 则对于所有边(u,v)∈E 有 d(s,v)<=d(s,u)+w(u,v)。 令 d(s,s)=0,这一不等式为 d(s,t)是 s 到 t 的最短路的充要条件。 这一性质很容易理解。我们也很容易将其推广。 设 G=(V,E)为一带权有向图,d(u)为状态(顶点)u 的最优值,权函数 w:EÆ自定 义集合。则对于所有边(u,v)∈E 有 d(u)+w(u,v)不优于 d(v). 注:这里的“+”可以是延伸为任意形式的运算表达式。 更进一步,我们并不一定将不等式限定在“最优性”这一框架中,而可根据 具体题目要求制定自己的判断。推广后的三角不等式将不再拘束于最短路问题, 有着更加广泛的适用空间。只要我们根据题目构造出状态间的权函数和优劣判断 标准,在大部分情况下我们都可以使用 SPFA 求解。在下文中将看到相关的应用。
3. SPFA算法的应用.................................................................................. 19 3.1 差分约束系统 ............................................................................... 19 3.2 在一类状态转移阶段性不明显的动态规划中的应用............... 20 3.3 探讨SPFA在解方程中的应用...................................................... 23 3.4 一类状态转移存在“后效性”的动态规划中的应用 ................... 28
差分约束系统
(i 1 ,2,...,n )
那么如何找到满足要求的这样一组 S,且使其个数最少呢? 我们需要寻找一个满足以下要求的 S 数组:
Sb i Sa i 1 c i (i 1 ,2,...,n ) Si Si 1 0(i 1 ,2,...,n ) Si -1 Si 1(i 1 ,2,...,n )
t
j a i
bi
j
c i (i 1,2,..., n)
建立不等式模型: 这样的描述使一个约束条件所牵涉的变量太多, 不妨设 约束条件即可用以下不等式表示
Si
t
j1
i
j
(i=1,2,„,n)
Sb i Sa i 1 c i (i 1,2,..., n )
值得注意的是,这样定义的 S 若仅仅满足约束条件的要求是不能完整体现它的意义的,S 中 的各个组成之间并不是相对独立的,他们存在着联系。 由于 T 数组要么为 1 要么为 0,则 Si 一定比 Si-1 大,且至多大 1 于是有
而 Bellman-Ford 每次的更新操作为
联想
If d[u] w[u,v] d[v] then d[v] d[u] w[u,v]
d[v] d[u] w[u,v]
d[u] - d[v] w [u,v]
INPUT 3 S4-S0>=2 142 S6-S2>=3 363 S3-S1>=1 231 于是做出如下的转化: 1.我们将 S0,S1。 。 。Sn 看作 n+1 个点 V0,V1, 。 。 ,Vn 2.对诸如 A-B>=C 的形式,我们从 A 向 B 连一条有向边,权值为 -C。 1)Sbi-Sai-1>=Ci
图论总结(超强大)78408
1。
图论 Graph Theory1。
1.定义与术语 Definition and Glossary1.1。
1。
图与网络 Graph and Network1。
1.2.图的术语 Glossary of Graph1。
1。
3。
路径与回路 Path and Cycle1.1。
4。
连通性 Connectivity1。
1。
5。
图论中特殊的集合 Sets in graph1.1。
6。
匹配 Matching1.1。
7。
树 Tree1。
1.8。
组合优化 Combinatorial optimization1.2。
图的表示 Expressions of graph1.2。
1。
邻接矩阵 Adjacency matrix1.2。
2.关联矩阵 Incidence matrix1。
2。
3.邻接表 Adjacency list1.2。
4。
弧表 Arc list1.2。
5。
星形表示 Star1。
3.图的遍历 Traveling in graph1.3。
1.深度优先搜索 Depth first search (DFS)1.3.1.1。
概念1。
3.1.2。
求无向连通图中的桥 Finding bridges in undirected graph1.3。
2。
广度优先搜索 Breadth first search (BFS)1.4.拓扑排序 Topological sort1。
5。
路径与回路 Paths and circuits1。
5.1。
欧拉路径或回路 Eulerian path1。
5.1.1。
无向图1。
5.1.2。
有向图1.5。
1.3。
混合图1。
5.1。
4。
无权图 Unweighted1.5。
1。
5。
有权图 Weighed —中国邮路问题The Chinese post problem1.5。
2。
Hamiltonian Cycle 哈氏路径与回路1。
5。
2。
1。
无权图 Unweighted1。
5.2.2.有权图 Weighed - 旅行商问题The travelling salesman problem 1。
差分法原理
差分法原理差分法是一种常见的数值计算方法,常用于离散化求解微分方程、差分方程等问题,也被广泛应用于图像处理、信号处理、数据压缩等领域。
差分法的核心思想是利用离散间隔之间的差别来逼近函数的导数或曲率,从而将连续问题转化为离散问题,通过精度的控制来达到近似求解的目的。
一阶差分法一阶差分法是差分法中最简单且最基础的方法之一,它的原理是使用函数在两个相邻点的取值差来逼近函数在该点的导数,即:f'(x) ≈ (f(x+h)-f(x))/h其中,h是离散间隔,通常取值越小,逼近精度越高。
二阶差分法二阶差分法是一种更加精确的差分方法,它不仅利用了函数在相邻点的取值差,还利用了函数在相邻点的导数差,从而更加准确地逼近函数在该点的二阶导数,即:f''(x) ≈ (f(x+h)-2f(x)+f(x-h))/h^2同样地,h取值越小,逼近精度越高。
其他差分法除了一阶差分法和二阶差分法,还有更高阶的差分法,如三阶差分法、四阶差分法等。
这些方法可以通过类似的方式求解函数在某点的高阶导数,但是随着阶数的增加,计算过程变得更加复杂,也需要更高的计算精度和更小的离散间隔来保证结果的准确性。
应用实例差分法在实际应用中有着广泛的应用,其中包括但不限于以下几个方面:1.图像处理:差分法可以用于图像边缘检测、锐化处理等,通过计算像素点之间的差异来实现特定的效果。
2.信号处理:差分法可以用于信号滤波、频谱分析等,通过差分的方式获取信号的一阶或二阶导数来实现特定的处理目的。
3.数据压缩:差分法可以用于数据压缩、数据加密等,通过差分的方式减少数据的冗余和重复,从而实现更高效的存储和传输。
总结差分法是一种基于离散化的数值计算方法,通过利用函数在相邻点之间的差别来逼近函数的导数或曲率,从而将连续问题转化为离散问题,并通过精度的控制来实现近似求解的目的。
差分法在图像处理、信号处理、数据压缩等领域中有着广泛的应用,是一种非常实用的数学工具。
差分约束系统例题详解
差分约束系统例题详解例1:pku1364已知一个序列a[1], a[2], ......, a[n],给出它的若干子序列以及对该子序列的约束条件,例如a[si], a[si+1], a[si+2], ......, a[si+ni],且a[si]+a[si+1]+a[si+2]+......+a[si+ni] < or > ki。
问题关键在于如何转化约束条件,开始我想以序列中的每一个值做一个点,如a[1], a[2] ……,就发现他们的关系是多者之间的关系,跟差分系统对不上,在看到MickJack的讲解后,才知道,用前n项和来转化成两两之间的关系。
如:s[a] + s[a+1] + …… + s[b] < c 可以转化成前n项和sum[b] - sum[a - 1] < c,为了能用Bellman_Ford,即将< 转化成<= ,sum[b] - sum[a - 1] <= c - 1。
我用Bellman_Ford写的:#include<stdio.h>#define INF 0xfffffff#define NN 104int index, n;int dis[NN];struct node{int s, e, v;}edge[NN];void add(int a, int b, int c){edge[index].s = a;edge[index].e = b;edge[index].v = c;index++;}void Init(int s){int i;for (i = 0; i <= n; i++){dis[i] = INF;}dis[s] = 0;}void Relax(int s, int e, int v){if (dis[e] > dis[s] + v){dis[e] = dis[s] + v;}}/*查找负边权回路,1表示存在*/int Bellman_Ford(){Init(0);int i, j;for (i = 1; i <= n; i++){for (j = 0; j < index; j++){Relax(edge[j].s, edge[j].e, edge[j].v);}}for (j = 0; j < index; j++){if (dis[edge[j].e] > dis[edge[j].s] + edge[j].v){return 1;}}return 0;}int main(){char str[4];int a, b, c, m;while (scanf("%d", &n) != EOF){if (n == 0) break;scanf("%d", &m);index = 0;while (m--){scanf("%d%d%s%d", &a, &b, str, &c);if (str[0] == 'l'){add(a - 1, a + b, c - 1); // c-1 使得< 变成<= 就能够判负环了}else{add(a + b, a - 1, -c - 1);}}if(Bellman_Ford()) puts("successful conspiracy");else puts("lamentable kingdom");}return 0;}做这题时,我用重新学习了下Bellman_Ford,感觉这个写的挺不错的。
差分线约束的实现
如何实现差分线的约束设计?一、差分线的一般要求一般而言,在PCB设计时对差分线的约束有:基本等长,两根差分线的长度差小于20~50mil;差分线在同一层走线,并尽可能的靠近;差分线和差分线间,差分线和其他网络间,要有20mil以上的间距对于有差分阻抗要求的差分线,严格控制差分线的宽度和间距,严格控制差分线在那一层走线二、在allegro中,实现差分线的约束设计基本步骤如下:1)定义差分线,告诉规则编辑器那些网络是差分线;2)在约束设置器的“spacing rule set”中设置差分线和差分线间,差分线和其他网络的间距;设置两根差分线间最大的长度差,默认得间距和最大的间距;3)在约束设置器的“physical rule set”中设置差分线的线宽;4)打开DRC;5)设置环境变量drc_diff_pair_overide or drc_diff_pair_primary_separation_tolerance三、例子:1)定义差分线。
点击菜单“logic”→“assign differential pair”,出现如下界面:在“Net Selection Area”中的下拉框中选择一对差分线,分别出现在“Rule Information”中“NET 1”和“NET 2”的位置上,在“Rule Name”中给这一对差分线一个名字,如:DIFFPAIR1、DIFFPAIR2等等,点击按钮ADD,这对差分线出现在“Rule Selection Area”中,对所有差分线重复上述步骤。
点击按钮APPL Y,点击OK退出。
2)在规则编辑器的“Spacing Rule Set”中设置差分线和差分线间,差分线和其他网络的间距;设置两根差分线间最大的长度差,默认得间距和最大的间距;点击菜单“Setup”→“Constraints…”→“Spacing Rule Set”→“Set Vaule”,依次出现如下两种界面:设置约束名为DIFF_TEST_1和DIFF_TEST_2,适用的SUBCLASS为ALL ETCH(根据实际情况定),差分线和差分线间,差分线和其他网络的间距line to line设置为20MIL;注意:在Differential Pair一栏中设置两根差分线间最大的长度差,默认的间距和最大的间距,这一栏有四个变量:Length Tolerance:两根差分线间最大的长度差,设置为20~50milPrimary Max Sep:一般情况下两根差分线间允许的最大间距,设为8milSecondary Max Sep:特殊情况下(如打过孔,从PIN出线等)两根差分线间允许比Primary Max Sep大的间距,设置为20Mil,这样在特殊情况下,两根差分线间允许有20+8MIL的间距,超过这个间距就会出DRC。
差分约束系统解析
差分约束系统poj1201 ,poj1275的解题报告现在发现刘汝佳写的书真的是给高手看的!。
要是一个半懂的人去看这本书根本不知所云。
简直就是晦涩难懂。
但是一旦把问题搞懂了再去看,就发现居然这个书全讲的是重点。
看来这本书只适合于做指导用。
我基本上没怎么看懂这个书。
这几天做差分系统的题的时候,经常碰到这种情况:为什么题目明明要求的是求某某值的最小值。
但找的资料上却说的用最长路求法。
还有的地方要求某函数值的最大值,但用的方法却是求最短路的方法。
到底是求最短路还是求最长路?最终我发现了。
只要是能用bellman_ford解决的差分约束系统,既可以用最长路求法求得,也可以用最短路求得。
并且部分可以用Dijkstra解决!其实个人觉得用“单原点最短路,单原点最长路求法”这个两个说法来描述用bellman_ford 解决差分约束系统是不准确的。
在一般的最短路径求法中对应的松弛操作为:If dist[b]》dist[a]+ w[a][b] thendist[b]= dist[a]+ w[a][b]。
(1)然而在所谓的最长路求法中松弛操作变为了If dist[b]《dist[a]+ w[a][b] thendist[b]= dist[a]+ w[a][b]。
(2)也就是说,最短路就是对应(1)号松弛方法,最长路对应(2)号而已。
现在先来看看一般的例子:假如有如下不等式组:(即求出来的最终答案要保证下列不等式成立)s[bi] -s[ai]>= ci; 0<=ai,bi<= max; i=1,2,3,。
现在求s[max]的最小值.用求最长路的方法:即用(2)号松弛方法先将不等式变形:s[bi]>=s[ai]+ci;即保证s[bi] 不小于s[ai]+ci;而(2)号松弛操作的作用也是这个。
即保证dist[b]不小于dist[a]+ w[a][b]于是这个个不等式便与这种松弛操作统一了。
所以就设a到b的路径为ci。
差分约束系统解析
差分约束系统poj1201 ,poj1275的解题报告现在发现刘汝佳写的书真的是给高手看的!。
要是一个半懂的人去看这本书根本不知所云。
简直就是晦涩难懂。
但是一旦把问题搞懂了再去看,就发现居然这个书全讲的是重点。
看来这本书只适合于做指导用。
我基本上没怎么看懂这个书。
这几天做差分系统的题的时候,经常碰到这种情况:为什么题目明明要求的是求某某值的最小值。
但找的资料上却说的用最长路求法。
还有的地方要求某函数值的最大值,但用的方法却是求最短路的方法。
到底是求最短路还是求最长路?最终我发现了。
只要是能用bellman_ford解决的差分约束系统,既可以用最长路求法求得,也可以用最短路求得。
并且部分可以用Dijkstra解决!其实个人觉得用“单原点最短路,单原点最长路求法”这个两个说法来描述用bellman_ford 解决差分约束系统是不准确的。
在一般的最短路径求法中对应的松弛操作为:If dist[b]》dist[a]+ w[a][b] thendist[b]= dist[a]+ w[a][b]。
(1)然而在所谓的最长路求法中松弛操作变为了If dist[b]《dist[a]+ w[a][b] thendist[b]= dist[a]+ w[a][b]。
(2)也就是说,最短路就是对应(1)号松弛方法,最长路对应(2)号而已。
现在先来看看一般的例子:假如有如下不等式组:(即求出来的最终答案要保证下列不等式成立)s[bi] -s[ai]>= ci; 0<=ai,bi<= max; i=1,2,3,。
现在求s[max]的最小值.用求最长路的方法:即用(2)号松弛方法先将不等式变形:s[bi]>=s[ai]+ci;即保证s[bi] 不小于s[ai]+ci;而(2)号松弛操作的作用也是这个。
即保证dist[b]不小于dist[a]+ w[a][b]于是这个个不等式便与这种松弛操作统一了。
所以就设a到b的路径为ci。
国家集训队论文分类
2007 - 胡伯涛:《最小割模型在信息学竞赛中的应用》
2007 - 王欣上:《浅谈基于分层思想的网络流算法》
2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》
最短路
2006 - 余远铭:《最短路算法及其应用》
2008 - 吕子鉷《浅谈最短径路问题中的分层思想》
2009 - 刘聪《浅谈数位类统计问题》
动态统计
2004 - 薛矛:《解决动态统计问题的两把利刃》
2007 - 余江伟:《如何解决动态统计问题》
博弈
2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》
2007 - 王晓珂:《解析一类组合游戏》
2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》
国家集训队论文分类
组合数学
计数与统计
2001 - 符文杰:《Pólya原理及其应用》
2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》
2007 - 周冬:《生成树的计数及其应用》
2008 - 陈瑜希《Pólya计数法的应用》
数位问题
2009 - 高逸涵《数位计数问题解法研究》
置换群
2005 - 潘震皓: - 高正宇:《答案只有一个——浅谈问答式交互问题》
猜数问题
2003 - 张宁:《猜数问题的研究:<聪明的学生>一题的推广》
2006 - 龙凡:《一类猜数问题的研究》
数据结构
数据结构
2005 - 何林:《数据关系的简化》
最小生成树
2004 - 吴景岳:《最小生成树算法及其应用》
算法 差分控制 -回复
算法差分控制-回复什么是差分控制算法及其应用?请谈谈差分控制算法的原理和优势。
差分控制算法是一种用于解决差分方程或差分代数方程的算法。
差分方程是一种描述离散时间系统行为的方程,其中时间以离散的间隔进行。
差分控制算法的核心思想是根据离散时间点之间的差异来进行控制和调节。
差分控制算法在许多领域都有广泛的应用,包括自动控制、机器学习、计算机视觉等。
在自动控制领域,差分控制算法常常用于设计控制器,以实现稳定和高效的控制系统。
在机器学习方面,差分控制算法可以用于参数优化和强化学习等任务。
在计算机视觉领域,差分控制算法可以用于图像处理和特征提取等任务。
差分控制算法的原理基于差分方程的特性。
差分方程通过记录连续时间点之间的差异来描述系统的演化。
差分控制算法将离散时间点上的观测数据和系统模型结合起来,通过分析差异来确定控制策略和参数。
差分控制算法常常使用迭代的方法,根据当前的观测输入和控制输出来更新控制参数,从而实现系统的稳定和性能优化。
差分控制算法的优势在于其适用于离散时间系统和离散时间数据的特性。
相比于连续时间系统和连续时间数据,离散时间系统和离散时间数据更易于处理和分析。
差分控制算法可以直接应用于离散时间系统,并且可以利用离散时间点之间的差异来进行控制和调整,从而更高效地实现系统的目标。
此外,差分控制算法还具有较强的鲁棒性,能够对系统噪声和不确定性进行较好的抵抗。
差分控制算法的实现步骤主要包括模型建立、观测数据收集、控制参数更新和控制策略调整。
首先,需要根据系统的动力学方程或模型建立差分方程模型。
其次,通过收集观测数据,获得系统在离散时间点上的输入和输出信息。
然后,根据差分方程模型和观测数据,利用适当的数值计算方法或优化算法来更新控制参数。
最后,根据更新后的控制参数,调整控制策略,以实现系统的稳定和性能优化。
在实际应用中,差分控制算法需要结合具体的系统和任务来进行调整和优化。
对于不同的系统和任务,可能需要选择不同的差分方程模型和数值计算方法。
差分对的约束设置第一步差分对的设...
差分对的约束设置第一步,差分对的设置差分对的设置有很多方法,下面介绍两种最常用的方法。
1.点击菜单Logic→Assign Differential Pair... 弹出以下对话框。
点击你想要创建差分对的Net1和Net2,填入差分的名字,点击Add后就成功创建了差分对。
点击Auto Generate按钮后,弹出以下对话框:在第一个输入框填入Net的主要名字后,在下面的框中填入差分线的标志如N,P。
点击Generate即可自动产生差分对。
2.在约束管理器中设置差分对。
在DSN上点击右键,在菜单中选择Create→Differential Pair。
即可弹出下面的对话框。
和上一种方法的设置差不多,这里就不再叙述了。
第二步差分对约束规则的设置差分对各项约束可以在约束管理器中的Electric→Net→routing→Different ial Pair中直接在各差分对上填入各项约束数值就可生效,但更好的方法是创建约束规则后赋给各个差分对。
在DSN上点击右键,在菜单中选择Create→Electrical CSet后,弹出下面的对话框;输入规则名后点Ok,在Electric→constraimt set→outing→Differential Pair中可以看到新规则。
在表格中输入各项数值即可完成新规则的设置。
如图所示差分对约束参数主要有以下几个:1coupling paramaters 主要包括了Primary Gap 差分对最优先线间距(边到边间距)。
Primary Width 差分对最优先线宽。
Neck Gap 差分对Neck模式下的线间距(边到边间距),用于差分对走线在布线密集区域时切换到Neck值。
Neck Width差分对Neck模式下的线宽,用于差分对走线在布线密集区域时切换到Neck值。
如图所示设置数值时在表格中右键菜单中选择change,会出现以下各层数值表格,可以在每一层上设置不同的数值。
差分约束系统详解
差分约束系统在一个差分约束系统(system of difference constraints)中,线性规划矩阵A的每一行包含一个1和一个-1,A的其他所有元素都为0。
因此,由Ax≤b给出的约束条件是m个差分约束集合,其中包含n个未知量,对应的线性规划矩阵A为m行n列。
每个约束条件为如下形式的简单线性不等式:xj-xi≤bk。
其中1≤i,j≤n,1≤k≤m。
例如,考虑这样一个问题,寻找一个5维向量x=(xi)以满足:这一问题等价于找出未知量xi,i=1,2,…,5,满足下列8个差分约束条件:x1-x2≤0x1-x5≤-1x2-x5≤1x3-x1≤5x4-x1≤4x4-x3≤-1x5-x3≤-3x5-x4≤-3该问题的一个解为x=(-5,-3,0,-1,-4),另一个解y=(0,2,5,4,1),这2个解是有联系的:y中的每个元素比x中相应的元素大5。
引理:设x=(x1,x2,…,xn)是差分约束系统Ax≤b的一个解,d为任意常数。
则x+d=(x1+d,x2+d,…,xn+d)也是该系统Ax≤b的一个解。
约束图在一个差分约束系统Ax≤b中,m X n的线性规划矩阵A可被看做是n顶点,m条边的图的关联矩阵。
对于i=1,2,…,n,图中的每一个顶点vi对应着n个未知量的一个xi。
图中的每个有向边对应着关于两个未知量的m个不等式中的一个。
给定一个差分约束系统Ax≤b,相应的约束图是一个带权有向图G=(V,E),其中V={v0,v1,…,vn},而且E={ (vi,vj) : xj-xi≤bk是一个约束}∪{ (v0,v1) , (v0,v2) , … , (v0,vn) }。
引入附加顶点v0是为了保证其他每个顶点均从v0可达。
因此,顶点集合V由对应于每个未知量xi的顶点vi和附加的顶点v0组成。
边的集合E由对应于每个差分约束条件的边与对应于每个未知量xi的边(v0,vi)构成。
如果xj-xi≤bk是一个差分约束,则边(vi,vj)的权w(vi,vj)=bk(注意i和j不能颠倒),从v0出发的每条边的权值均为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数与图的完美结合-------浅析差分约束系统华中师大一附中冯威[摘要]在面对多种多样的问题时,我们经常会碰到这样的情况:往往我们能够根据题目题面意思来建立一些简单的模型,但却面对这些模型无从下手。
这时我们应该意识到,也许能够将这种模型与其他的模型之间搭起一座桥梁,使我们能够用更简单直接的方式解决它。
这里我们介绍一种方法,它很好地将某些特殊的不等式组与图相联结,让复杂的问题简单化,将难处理的问题用我们所熟知的方法去解决,它便是差分约束系统。
这里我们着重介绍差分约束系统的原理和其需要掌握的bellman-ford算法。
然后通过zju1508和zju1420两道题目解析差分约束系统在信息学题目中的应用,并逐渐归纳解决这类问题的思考方向。
[目录]◆关键字 (2)◆Bellman-ford算法 (2)◇算法简单介绍 (2)◇算法具体流程 (2)◇例题一ZJU2008 (4)◆差分约束系统 (5)◇例题二ZJU1508 (5)◇线性程序设计 (7)◇差分约束系统 (7)◇例题三ZJU1420 (8)◆结语 (9)◆附录 (9)[关键字] 差分约束系统、不等式、单元最短路径、转化[正文]在分析差分约束系统之前,我们首先介绍一个解决单元最短路径问题的Bellman Ford算法,它的应用十分广泛,在差分约束系统中更充当着重要的角色。
Bellman-ford 算法算法简单介绍这个算法能在更一般的情况下解决最短路的问题。
何谓一般,一般在该算法下边的权值可以为负,可以运用该算法求有向图的单元最长路径或者最短路径。
我们这里仅以最短路径为例。
Bellman ford 类似于Dijkstra算法,对每一个节点v∈V,逐步减小从起点s到终点v最短路的估计量dist[v]直到其达到真正的最短路径值mindist[v]。
Bellman-ford算法同时返回一个布尔值,如果不存在从源结点可达的负权回路,算法返回布尔值TRUE,反之返回FALSE。
算法具体流程1.枚举每条边(u,v)∈E(G)。
2.对枚举到的边进行一次更新操作。
3.回到步骤1,此过程重复n-1次,以确定没有更可以优化的情况。
4.枚举每条边(u,v)若仍然存在可以更新的边,则说明有向图中出现了负权回路,于是返回布尔值FALSE。
5.返回布尔值TRUE。
注:这里的更新操作是一种松弛技术,以单元最短路径为例这个操作就是保证dist[v]<=dist[u]+w[u,v],即if dist[v]>dist[u]+w[u,v] then dist[v]=dist[u]+w[u,v],如果是最长路径则是保证dist[v]>=dist[u]+w[u,v]。
定义一个有向图G=(V,E),w(u,v)表示由结点u到v的边的权值。
伪代码如下:下图描述了该算法的操作过程,粗线条代表已更新线段图例中,S 为源节点,粗线断覆盖的边表示最近一次执行更新操作的边。
算法执行|V|-1次操作,每次操作都对所有可以进行松弛操作的边进行扩展。
证明一下Bellman-Ford 算法的正确性。
1.设G=(V ,E )为有向加权图,源节点为S ,加权函数为w :E-〉R 。
如果有负权回路则Bellman_ford 算法一定会返回布尔值false,否则返回TRUE 。
证明略。
2.设G=(V ,E )为有向加权图,源节点为S 加权函数为w :E-〉R ,并且G 不含从s 可达的负权回路,则算法Bellman_ford终止时,对所有从s 可达的结点v 有d[v]=mindist (s ,v )。
证明:设v 为从s 可达的节点,且p=<v0,v1,..,vk>为从s 到v 的一条最短路径,其中v0=s ,vk=v 。
因为路径p 是简单路径,所以k<=|V|-1。
我们希望通过归纳证明对i=0,1,…,k ,在对G 的边进行完第i 趟操作后有d[vi]=mindist(s,vi),且该等式此后一直保持成立,因为总共有|V|-1次操作,所以上述结论证明命题成立。
TTTTT我们发现与Dijkstra不同,Bellman ford更多的是对边进行操作,在稀疏图,即点多边少的图中,用Bellman Ford更能高效的解决单元最短路径问题。
下面一道例题来进一步熟悉Bellman Ford并与Dijkstra作一下简单的时间上的比较。
例题一:ZJU2008 Invitation Cards[题目大意]在有向加权图中G(V,E),邮局要从起点S向其他n个节点发送邮件,于是派出n个邮递员,分别到达其他n个地点发送,然后回到起点S,求出所有邮递员所经过的总路程的最小值。
[数据范围] 1 <= P,Q <= 1000000。
P表示节点数目,Q表示边的个数。
[题目分析]这道题算法很简单,即求出从s到任意点的最短路径,求其和ANS1,再将所有有向边反向(这个过程将求从另外n个结点到s的最短路径转化为从s到其他n个点的最短路径),再求一次s到任意点的最短路径,求其和ANS2,Ans=Ans1+Ans2即为所求。
V) 的算法,还是Bellmanford的O(VE)但是,此题难在数据量上,无论是Dijkstra的O(2的算法都无法在数据规模最大的情况下在5s的时间内得出结果,于是需要做出一点优化。
关于Dijkstra的优化:用堆维护使寻找需要扩展的点的过程复杂度降低为1。
复杂度大幅降低。
关于Bellman ford的优化:可以将Bellman ford需要扩展的点放进队列中,扩展顺序有了新的变化。
用一个队列queue表示需要更新的点,每次取队列头指针fp所指的点u,搜索所有的边(u,v)属于E,如果dist[u]+w[u,v] 比dist[v]更优则更新dist[v],尾指针rp后挪一位,将v点加入队列queue。
这样的优化避免了很多重复的操作,事实证明它的效率仅次于Dijkstra+heap的效率。
下面用3种不同的方法来解这道题目,看看结果如何。
我们用以下三种方法求最短路径:1.Dijkstra2.Bellman Ford3.Dijkstra&Heap差分约束系统对于解决差分约束系统问题的操作过程和使用原理,我们通过下面一道简单的题目进行了解。
引例:[例题二] Zju1508 Interval题目大意:有一个序列,题目用n 个整数组合 [ai,bi,ci]来描述它,[ai ,bi ,ci]表示在该序列中处于[ai ,bi]这个区间的整数至少有ci 个。
如果存在这样的序列,请求出满足题目要求的最短的序列长度是多少。
如果不存在则输出 -1。
输入:第一行包括一个整数n ,表示区间个数,以下n 行每行描述这些区间,第i+1行三个整数ai ,bi ,ci ,由空格隔开,其中0<=ai<=bi<=50000 而且 1<=ci<=bi-ai+1。
输出:一行,输出满足要求的序列的长度的最小值。
[浅析]初看此题感觉无从下手,我们将范围和个数进行量化,让问题看起来更加简单些。
将问题数字化:若记,不存在于序列中如果存在于序列之中如果i 0i 1{t i =那么本题约束条件即为n)1,2,...,(i c ti b a j jii=≥∑=建立不等式模型:这样的描述使一个约束条件所牵涉的变量太多,不妨设∑==i1j ji tS (i=1,2,…,n)约束条件即可用以下不等式表示:)n ,...,2,1i (c S S i 1a b i i =≥--值得注意的是,这样定义的S 若仅仅满足约束条件的要求是不能完整体现它的意义的,S 中的各个组成之间并不是相对独立的,他们存在着联系。
由于∑==i1j ji tS ,且t 要么为1,要么为0,则i S 一定比1-i S 大 ,且至多大1。
于是有:)n ,...,2,1i (1S S )n ,...,2,1i (0S S i 1-i 1i i =-≥-=≥--那么如何找到满足要求的这样一组S ,且使其个数最少呢?这里我们看到最少就会联想到贪心,确实这道题目用贪心可行,且不失为一种很好的做法,但在这里我们不作多的介绍。
我们将针对这个不等式组进行联想,迁移。
注意到不等式中只涉及到了2个未知数,用减号相连接。
这样的式子是否与过去曾经学过的Bellmanford 中的松弛操作所达到的效果相类似呢?联想:我们需要寻找一个满足以下要求的S 数组)n ,...,2,1i (1S S )n ,...,2,1i (0S S )n ,...,2,1i (c S S i 1-i 1i i i 1a b i i =-≥-=≥-=≥---而Bellman-Ford 每次的更新操作为v]w[u,d[u]d[v] then d[v]v]w[u,d[u] If +←≤+即在经过若干次更新操作将要保证 d[v]<=d[u]+w[u,v]这里我们也有一个已知量-----边的权值,即w[u,v],于是整理一下得d[u]-d[v]>=w[u,v]经过这样的变形,不难看出,两个式子有着极为惊人的相似! 于是做出如下的转化: 1. 我们将n 10S ,...,S ,S ,看作n+1个点n 10V ,...,V ,V 。
2.若i S 和j S 之间有着约束关系,例如S i-1-S i >= -1,那么我们从结点1i V - 向结点iV 连上一条有向边,边的权值为-1。
这样如果我们从0V 出发,求出结点0V 到n V 的最短路径,则n S 为满足要求情况下的最小值。
相反如果我们发现在Bellmanford 算法执行的过程中存在有负权回路,则说明不存在满足要求的式子。
于是通过合理地建立数学模型,将不等式图形化,用Bellmanford 作为武器,最终此题得到了圆满的解决!思考:本题只要求输出最少的个数,那么能否通过上述方法构造出相应的数列呢?答案是肯定的。
其实在Bellmanford 的过程中,我们已经得到了所有结点上S 的值,那么由1i i i S S T --=求出所有T ,当i T 为1则输出i ,即可输出满足题目要求的序列。
总结:对于ZJU1508的问题,最终可以化为一类线性不等式定义的线性函数。
而这类问题其实是可以转化为单元最短路径问题,从而用刚才所准备到的Bellman Ford 算法来解决它。
线性程序设计:我们为线性程序设计问题制定一个严格的数学描述:给定一个m*n 矩阵A ,维向量b 和维向量c ,我们希望找出由n 个元素组成的向量x ,在由Ax<=b 所给出的m 个约束条件下,使目标函数∑-n1i i i x c 达到最大值。
其实很多问题都可以通过这样一个线性程序设计框架来进行描述。
在实际的问题中,也经常要对其进行分析和解决。