这个内容是用来回忆一下EDA2涉及的算法和解题的主要步骤:
有疑问或发现错误可以私信来讨论
高级综合概述
柏拉图优化:这个是来判断是否有哪些节点能完全被其他节点优化掉。比如(1,2)这个节点就可以完全优化(3,4)(3,2)这些节点。判断的方式就是两个值都比已经存在的其他节点大或相等(也可以使用坐标系向坐标轴做垂线,如果完全某节点的区域完全包裹另外一个就说明它会被优化)
操作调度
最小延迟无约束调度
没有约束可以直接理解为没有处理机资源数量的限制,只考虑先后次序
ASAP 从前向后
这个算法就是针对有向图,从前向后先把无前驱的节点标成1,之后根据后继顺序依次标为2、3、4直到完成所有节点的标注
ALAP 从后向前
这个算法会给出一个时间限制,是从最后一个节点按照这个根据这个时间限制的数值来进行标注。
看一下上图F的区别,就可以看出来前向后调度和后向前调度的区别
上述的ALAP和ASAP是下面这些算法中的一种调度思路
有约束调度
有约束和上面
Hu调度算法
这个算法针对的有限个是同种处理机资源进行的调度
1. 划分出优先级(使用ALAP)
2.根据优先级进行调度(考虑每个时刻处理机的使用量)
列表调度
这个算法是针对不同处理机进行的调度,有MR-LCS(对时间有具体限制,处理机数量是未知量表示)与ML-RCS(对处理机数量有明显显示,但是对于时间并无要求)。
这个调度会使用下面的ILP进行数字化处理(画的图用于对ILP的唯一约束化简)
ILP优化(x 数值上只能为1或0)
ML-RCS中有三个约束
1.唯一约束:每个节点只被调度一次
2.顺序约束:后继节点时间必须大于等于 前驱节点时间+处理前驱节点所用时间
3.资源约束:在同一时刻某一类资源被调度的数量必须小于等于该类资源的处理机的数量
对于这种题的做法就是根据上面的列表调度,使用ALSP算法画图,对唯一限制的式子进行优化
MR-LCS中有三个约束
1.唯一约束:每个节点只被调度一次
2.顺序约束:后继节点时间必须大于等于 前驱节点时间+处理前驱节点所用时间
3.时间约束:最终的时间必须小于 给出时间+1(调度最后一个节点的时间)
对于这种题需要将处理机数量设置为a1 a2这种,之后进行类型资源约束的写法,之后按照ML-RCS的方法进行化简
MIN 权重*资源数量+权重*资源数量(这个是最终的表达式,列出来化简就行,不用全算出来)
时间分析
关键节点关键性
这种题的步骤:
1.标出:需要时间/到达时间(第一个节点前后都有、后面节点的都是后面)
2.裕量=需要时间-到达时间
3.裕量为零的节点是关键节点,这些节点形成的路径是关键路径
4.关键性=1-(裕量/图中最大裕量)
绑定问题
兼容图和冲突图
这个也是针对有向图,一般是使用优化算法处理过的
兼容图:节点之间不存在并发关系(说白了就是在ASAP这种图里面不在同一排)
冲突图:兼容图的补图
左边缘算法
放两张图就明白了
两级逻辑优化
优化目标
假设一家公司有很多人,有会前端和后端的、有会后端和运维的......
最小覆盖:裁员之后在所有技术栈都被覆盖的情况下剩余的人数最少
非冗余覆盖:不一定人数最少,但每个人都不可或缺(再裁谁就必然会有某个技术栈没被覆盖)
单个蕴含项下的非冗余覆盖:一个人被另一个人完全替代(技术栈被完全包括)
精确两级优化逻辑
Quine算法
On数组(1),Off数组(0),Dc数组(非0也非1)
比如F=abcd+ab(非c)d+a(非b)cd这种形式,要求出其一次的最小蕴涵项:
1.枚举出可以使F=1的情况,比如abcd就是1111,ac(非c)d就是1101
2.两两对比,找出可以概括的项合并为*,比如1111和1101可以合并成11*1
3.再次合并直到无法合并为止
列出合并的最终结果和合并过程中没有合并进去的列在一起
分支优化
这个不会考递归那个式子,考的是矩阵的缩减
1. 按照题目给出蕴涵项那一列(打勾),划掉那一列所含1所在的行
2.之后进行列之间的支配(1被全覆盖),不打勾
3.之后扫描每一列,发现进出现一个1的话就这一列打勾,并且划掉那一列所含1所在的行
4.直到不存在1为止
打勾的行头部的式子就是蕴含式
启发式两级优化逻辑
矩阵表示法
首先两个操作:
1.Intersection:同1才为1
2.supercube:存1即为1
之后有一个操作:
求余子式Fa:
F先对a进行Inter操作、操作结果对a取反的结果进行supercube操作
重言式:
1.余子式存在全为1的一行
2.对于唯一决定项,每一列都不全为0
非重言式:
对于唯一决定项,存在一列都全为0
单调性:
对于F中的某一个元素,比如是a,若只存在a即a为单调增,若只存在(非a)则a为单调减
操作
取反
使用德摩根律和矩阵计算对F去某一个因子的反,如果算不出来就接着取
拓展
会让尝试拓展某一项
1.F取反
2.检查F中某一个项是否可以简化,比如abc是否可以简化成ab(F反和ab进行Inter运算)
3.若运算结果为空(存在00项的话该行直接划掉),则可以拓展
4.之后可以进一步拓展,比如ab可否简化为a,即F反与a进行Inter运算,看结果是否为空
缩减
其实是增加了字母(抽象程度降低)
下面这个例子说的很明白,这是者怒地某一个元素进行的缩减尝试
1.对剩余子式取反
2.之后求该反式对a取余因子的结果
3.之后对于该结果进行supercube运算
4.最后看选出项和3的运算结果交集是否等于选出项
5.若相等说明无法化简,不相等更新原函数该项
去冗余
非冗余覆盖是Rp中的元素+Er中的元素
Er存放必须存在的项(处理之后不是重言式)
Rp存放不存在的项(处理之后无法判断不是重言式)
1.在F中去除一个项
2.剩余项对该项取余子式
3.余子式不是重言式的话就放入Er,反之先放入Rp
Rt
对于Rp中的元素进行如下判定:
1.H=Rp中的元素+Er中的元素-选出来接受判定的元素
2.H对该元素求余因子,若结果不是重言式,就不可以去掉该元素
3.去掉的元素放入Rt,并从Rp中删去