取枝算法
① 博弈算法里的剪枝怎么用(具体的)
极大极小过程,以及阿尔法-贝塔剪纸。极小极大搜索方法是博弈树搜索的基本方法,现在博弈树搜索中最常用的α-β剪枝搜索方法,就是从这一方法发展而来的。
首先假定,有一个评价函数可以对所有的棋局进行评估。当评价函数值大于0时,表示棋局对我方有利,对对方不利。当评价函数小于0时,表示棋局对我方不利,对对方有利。而评价函数值越大,表示对我方越有利。当评价函数值等于正无穷大时,表示我方必胜。评价函数值越小,表示对我方越不利。当评价函数值等于负无穷大时,表示对方必胜。假设双方都是对弈高手,在只看一步棋的情况下,我方一定走评价函数值最大的一步棋,而对方一定走评价函数值最小的一步棋。会下棋的读者都知道,在只看一步的情况下最好的棋,从全局来说不一定就好,还可能很不好。因此为了走出好棋,必须多看几步,从多种可能状态中选择一步好棋。
想一想人是如何下棋的呢?人实际上采用的是一种试探性的方法。首先假定走了一步棋,看对方会有那些应法,然后再根据对方的每一种应法,看我方是否有好的回应......这一过程一直进行下去,直到若干步以后,找到了一个满意的走法为止。初学者可能只能看一、两个轮次,而高手则可以看几个,甚至十几个轮次。
极小极大搜索方法,模拟的就是人的这样一种思维过程。当轮到我方走棋时,首先按照一定的搜索深度生成出给定深度d以内的所有状态,计算所有叶节点的评价函数值。然后从d-1层节点开始逆向计算:对于我方要走的节点(用MAX标记,称为极大节点)取其子节点中的最大值为该节点的值(因为我方总是选择对我方有利的棋);对于对方要走的节点(用MIN标记,称为极小节点)取其子节点中的最小值为该节点的值(对方总是选择对我方不利的棋)。一直到计算出根节点的值为止。获得根节点取值的那一分枝,即为所选择的最佳走步。
在图3.5所示的例子中,假定搜索深度为2,D~J是7个叶节点,在它们下边括号中的数字是这些节点的评价函数值(假定可以计算得到)。A、B、C是三个极小节点,它们分别取各自子节点最小值为自己的值,得到三个节点的值分别为-6、-2和-4。s是极大节点,从A、B、C三个节点的值中取最大值,得到-2。由于-2来自于节点B,所以搜索的结果是应选择B作为我方的走步。对于我方来说,-2并不是一个好的结果,但却是在对方不犯错误的情况下,对我方最有利的结果。因为从图中可以看出,如果选择A为我方的走步,如果对方回应D的话,我方可以得到评价值9,固然对我方有利。但是如果对方是一个高手的话,他一定回选择E,而不是D。在这种情况下,我方只能得到-6,结果岂不是更差。因此,极小极大过程是一种假定对手每次回应都正确的情况下,如何从中找出对我方最有利的走步的搜索方法。
值得注意的是,不管设定的搜索深度是多少层,经过一次搜索以后,只决定了我方一步棋的走法。等到对方回应一步棋之后,需要在新的棋局下重新进行搜索,来决定下一步棋如何走。极小极大搜索策略是考虑双方对弈若干步之后,从可能的走步中选一步相对好棋的着法来走,即在有限的搜索深度范围内进行求解。为此要定义一个静态估计函数f,以便对棋局的势态(节点)作出优劣估值,这个函数可根据势态优劣特征来定义(主要用于对端节点的"价值"进行度量)。一般规定有利于MAX的势态,f(p)取正值,有利于MIN的势态,f(p)取负值,势均力敌的势态,f(p)取0值。若f(p)=+∞,则表示MAX赢,若f(p)=-∞,则表示MIN赢。下面的讨论规定:顶节点深度d=0,MAX代表程序方,MIN代表对手方,MAX先走。
图3.5是一个表示考虑两步棋的例子,图中端节点给出的数字是用静态函数f(p)计算得到,其他节点不用f(p)估计,因为不够精确,而应用倒推的办法取值。例如A、B、C是MIN走步的节点,MAX应考虑最坏的情况,故其估值应分别取其子节点f(p)估值中最小者,而s是MAX走步的节点,可考虑最好的情况,故估值应取A、B、C值中的最大者。这样求得f(s)=-2,依此确定了相对较优的走步应是走向B,因为从B出发,对手不可能产生比f(s)=-2更差的效果。实际上可根据资源条件,考虑更多层次的搜索过程,从而可得到更准确的倒推值,供MAX选取更正确的走步。当用端节点的静态估计函数f(p)求倒推值时,两位选手应采取不同的策略,从下往上逐层交替使用极小和极大的选值方法,故称极小极大过程。
② 什么是分支算法
分支限界算法:
分支定界 (branch and bound) 算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。
利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是:
1 .产生当前扩展结点的所有孩子结点;
2 .在产生的孩子结点中,抛弃那些不可能产生可行解(或最优解)的结点;
3 .将其余的孩子结点加入活结点表;
4 .从活结点表中选择下一个活结点作为新的扩展结点。
如此循环,直到找到问题的可行解(最优解)或活结点表为空。
从活结点表中选择下一个活结点作为新的扩展结点,根据选择方式的不同,分支定界算法通常可以分为两种形式:
1 . FIFO(First In First Out) 分支定界算法:按照先进先出原则选择下一个活结点作为扩展结点,即从活结点表中取出结点的顺序与加入结点的顺序相同。
2 .最小耗费或最大收益分支定界算法:在这种情况下,每个结点都有一个耗费或收益。如果要查找一个具有最小耗费的解,那么要选择的下一个扩展结点就是活结点表中具有最小耗费的活结点;如果要查找一个具有最大收益的解,那么要选择的下一个扩展结点就是活结点表中具有最大收益的活结点。
又称分支定界搜索法。过程系统综合的一类方法。该法是将原始问题分解,产生一组子问题。分支是将一组解分为几组子解,定界是建立这些子组解的目标函数的边界。如果某一子组的解在这些边界之外,就将这一子组舍弃(剪枝)。分支定界法原为运筹学中求解整数规划(或混合整数规划)问题的一种方法。用该法寻求整数最优解的效率很高。将该法原理用于过程系统综合可大大减少需要计算的方案数日。
分支定界法的思想是:首先确定目标值的上下界,边搜索边减掉搜索树的某些支,提高搜索效率。
在竞赛中,我们有时会碰到一些题目,它们既不能通过建立数学模型解决,又没有现成算法可以套用,或者非遍历所有状况才可以得出正确结果。这时,我们就必须采用搜索算法来解决问题。
搜索算法按搜索的方式分有两类,一类是深度优先搜索,一类是广度优先搜索。我们知道,深度搜索编程简单,程序简洁易懂,空间需求也比较低,但是这种方法的时间复杂度往往是指数级的,倘若不加优化,其时间效率简直无法忍受;而广度优先搜索虽然时间复杂度比前者低一些,但其庞大的空间需求量又往往让人望而却步。
所以,对程序进行优化,就成为搜索算法编程中最关键的一环。
本文所要讨论的便是搜索算法中优化程序的一种基本方法枣“剪枝”。
什么是剪枝
相信刚开始接触搜索算法的人,都做过类似迷宫这样的题目吧。我们在“走迷宫”的时候,一般回溯法思路是这样的:
1、这个方向有路可走,我没走过
2、往这个方向前进
3、是死胡同,往回走,回到上一个路口
4、重复第一步,直到找着出口
这样的思路很好理解,编程起来也比较容易。但是当迷宫的规模很大时,回溯法的缺点便暴露无遗:搜索耗时极巨,无法忍受。
我们可不可以在向某个方向前进时,先一步判断出这样走会不会走到死胡同里呢?这样一来,搜索的时间不就可以减少了吗?
答案是:可以的。
剪枝的概念,其实就跟走迷宫避开死胡同差不多。若我们把搜索的过程看成是对一棵树的遍历,那么剪枝顾名思义,就是将树中的一些“死胡同”,不能到达我们需要的解的枝条“剪”掉,以减少搜索的时间。
搜索算法,绝大部分需要用到剪枝。然而,不是所有的枝条都可以剪掉,这就需要通过设计出合理的判断方法,以决定某一分支的取舍。在设计判断方法的时候,需要遵循一定的原则。
剪枝的原则
1、正确性
正如上文所述,枝条不是爱剪就能剪的。如果随便剪枝,把带有最优解的那一分支也剪掉了的话,剪枝也就失去了意义。所以,剪枝的前提是一定要保证不丢失正确的结果。
2、准确性
在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的。可以说,剪枝的准确性,是衡量一个优化算法好坏的标准。
3、高效性 设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少。但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾。
因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的。倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了。
综上所述,我们可以把剪枝优化的主要原则归结为六个字:正确、准确、高效。
剪枝算法按照其判断思路可大致分成两类:可行性剪枝及最优性剪枝。
对于分支定界算法,上界是已求得的可行解的目标函数值中的最小者,分为初始上界和在探测过程中产生的动态上界.分支定界法在求最优解的迭代过程中, 若某结点估计的下界不小于已知的上界, 则不必从该节点往下继续搜索. 因此若能产生一个较好的上界, 可以消除许多不必要的列举计算.
分支定界算法的实现
在描述分支定界算法步骤之前, 先对算法涉及到的有关术语进行定义如下:
p —— 分支层数;
C*—— 当前最优目标函数值;
P*—— 相应于C*的工件顺序;
P1—— 当前节点(现在需要进行分支的节点)所对应的部分序列.
分支定界算法的实施步骤如下:
步骤1 初始化: 设置p = 0, P 1 = Á (空集) , C* = ∞.设当前节点总是与P 1 相对应. 此时, 当前节点即根节点.
步骤2 计算从当前节点分支得到的各个子节点的下界, 并按下界值由小到大对各子节点排序. 令p ←p + 1.
步骤3 如果当前节点被探测尽, 令p ←p - 1, 转步骤6. 否则, 设当前层(第p 层) 各活动子节点中具有最小下界值的节点为Q , 则在P 1末尾加入Q 对应第p 位置上的工件, 此时的当前节点转为Q , 转步骤4.
步骤4 因为当前节点是同层同父节点具有最小下界值的节点, 如果当前节点下界值大于或等于C* , 则不必再搜索当前节点及其同层同父的活动节点, 这样, 当前节点的上一层节点(父节点)被探测尽, p ←p - 1, 去掉P 1 中的最后一个工件,转步骤6. 否则, 转步骤5.
步骤5 如果p = n, 则得到一个较优顺序.令P* = P 1, C* 是当前节点的下界值, p ←p - 1,去掉P 1 中最后一个工件, 转步骤6; 否则转步骤2.
步骤6 若p ≠ 0, 去掉P 1 中最后一个工件,转步骤3; 否则, 算法停止. C* 是最优的目标函数值, P* 是最优顺序.
分支结构算法的实现(编程基础)
我现在学到了分支结构了。又遇到问题了,不知道你还在不在,可以帮我吗?(可以,没问题.)
1、用Pascal语言表示下列的条件表达式:
(1):x小于10;
(2):0<=y<=5;(‘小于等于’不会打)
(3):x大于5或x为负数;
(4):ch在“A”和“Z”之间(包括“A”和“Z”);
(5):年龄(age)不小于18,国籍(natioality)不是中国“CHINA”,也不是朝鲜“KOREA”的男性公民(sex=`maie`);
(6):正数,在2~100之间且不能被2,或3,或5整除。
2、试写出下列各项的Pascal语句:
(1):如果wage大于10000,便减去10%的wage.
(2):如果Choice的值为1,则读取x的值,并打印x的平方;否则读取y的值,并打印y的平方。
③ 什么叫取大取小算法
就是向上取整,或者向下取整
④ 在一个盒子中装有6枝圆珠笔,其中3枝一等品,2枝二等品,1枝三等品,从中任取3枝,求下列事件的概率
(1)从3个1等品中抽一个,在从剩下的3个非一等品中抽2个,就是C3,1C3,2总抽样是C6,3
所以:
P=C3,1C3,2/C6,3=9/20
(2)从3个1等品中抽2个,在从剩下的3个非一等品中抽1个,就是C3,2C3,1总抽样是C6,3
所以:
P=C3,2C3,1/C6,3=9/20
(3)从5个非三等品中抽3个,就是C5,3总抽样是C6,3
所以:P=C5,3/C6,3=1/2
⑤ 天干地支的算法
天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸
地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥
天干=(年份-3)/10……余数 余数为几就数几个
地支=(年份-3)/12……余数 同上
比如今年
(2013-3)/10……余数为0 数十个就是癸
(2013-3)/12……余数为6 数六个是巳
(5)取枝算法扩展阅读
来源浅考
相传早在公元前2697年,于中华始祖黄帝建国时,命大挠氏探察天地之气机,探究五行。
一些学者从中国上古的夏代帝王世系和商代汤王以下所有帝王的名字中,探究十天干中的字已被用于名号这一特有现象。郑文光在所着《中国天文学源流》一书中认为,十天干起源于中国古代羲和“生十日”的神话传说,是十进位法概念在纪时中的反映,应当产生于渔猎时代的原始社会;“十二地支”则由常羲“生月十有二”的神话传说演变而来,产生于殷商之前,后逐渐演变为十二辰。所以,郑文光推断:“十二支宜乎是夏人的创作。”
陈遵妫在《中国天文学史》中指出,“在四千多年前的夏代,可能已有干支产生了”。杜石然等则在编着的《中国科学技术史稿》一书中,主张夏代已有十天干纪日法,商代在夏代天干纪日的基础上,进一步使用干支纪法,从而把十天干和十二地支配合在一起形成六十循环的纪日法。
大约在战国末年,依据各国史官长期积累下来的材料编成的史书《世本》说:“容成作历,大桡作甲子”,《尚书正义》解释说:“二人皆黄帝之臣,盖自黄帝以来,始用甲子纪日,每六十日而甲子一周”。看来干支是大桡创制的,大桡“采五行之情,占斗机所建,始作甲乙以名日,谓之干;作子丑以名月,谓之枝,有事于天则用日,有事于地则用月,阴阳之别,故有枝干名也。”
⑥ 怎么计算天干地支的算法大神们帮帮忙
天干地支简称“干支”,取义于树木的干和枝 天干有十:甲、乙、丙、丁、戊(wù)、己、庚、辛、壬(rén)、癸(guǐ); 地支十二:子、丑、寅、卯(mǎo)、辰(chén)、巳(sì)、午、未(wèi)、申、酉(yǒu)、戌(xū)、亥。 天干地支组合成如下六十个计时序号,作为纪年、月、日、时的名称,叫“干支纪年法”。 编辑本段六十甲子顺序 1 ~10 甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 11~20 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 21~30 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 31~40甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 41~50甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 51 ~60甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥 用六十甲子依次纪年,六十年一个轮回。干支纪年法的新一年由立春开始,2009年的立春是二月四日,所以2009年2月4日立春之后才是己丑年,在此之前应是戊子年。公元纪年的一年以立春为界前后分属不同的干支纪年,这一点不熟悉的人容易搞错,应特别注意。 编辑本段与公元纪年的换算 第一种算法: 如何将公元纪年换算成干支纪年: 不同资料算法有所差异,有的给出公式,但本质上是一回事。这里介绍一种简易直观的算法。 首先给每个天干、地支一个编号,从头以4开始循序排下去,天干10后接1,。地支12后接1。 天干:甲4、乙5、丙6、丁7、戊8、己9、庚10、辛1、壬2、癸3 地支:子4、丑5、寅6、卯7、辰8、巳9、午10、未11、申12、酉1、戌2、亥3 以公元年的尾数在天干中找出对应该尾数的天干,再将公元纪年除以12,用除不尽的余数在地支中查出对应该余数的地支,这样就得到了公元纪年的干支纪年。如2003年,其尾数为3,对应的天干为“癸”;以12除2003得166,余数为11,对应的地支为未。于是2003年的干支纪年为“癸未”年。注意这是指2003年立春之后,立春之前应是“壬午”年。赵达先生在“祭文”中指出的时间是“癸未清明”,清明是立春之后的第四个节气(立春、雨水、惊蛰、春分、清明),所以赵先生说岁在癸未,而非壬午。 第二种算法: 1. 天干算法:用公元纪年数减3,除以10(不管商数)所得余数,就是天干所对应的位数; 2. 地支算法:用公元纪年数减3,除以12(不管商数)所得余数,就是地支所对应的位数; 天干:甲、乙、丙、丁、戊、已、庚、辛、壬、癸 地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 例1. 我们以2010年为例; 天干算法: 2010-3=2007, 2007/10=200余7, 7对应天干第7位是庚,即天干为庚; 地支算法: 2010-3=2007, 2007/12=167余3, 3对应地支第3位是寅,即地支为寅; 综上公元2010是用天干地支纪年为庚寅年。为使各位信任此算法,本人再举一例来说明: 例2. 我们再以1987年为例; 天干算法: 1987-3=1984, 1984/10=198余4, 4对应天干第4位是丁,即天干为丁; 地支算法: 1987-3=1984, 1984/12=165余4, 4对应地支第4位是卯,即地支为卯; 综上公元1987是用天干地支纪年为丁卯年。 第三种算法: 首先,将天干、地支编号如下: 天干:甲、乙、丙、丁、戊、已、庚、辛、壬、癸 4 5 6 7 8 9 10 1 2 3 地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 4 5 6 7 8 9 10 11 12 1 2 3 如要将公元纪年换算成干支纪年,以公元年的尾数在天干中找出相对应。然后,将公元纪年除以12,用余数在地支中找出所对应的地支。这样,公元纪年就换算成了干支纪年。 如:公元1995年 用该年尾数5找出对应的天干为“乙”;然后,用1995除以12得余数为3,用余数3找出相对应的地支为“亥”。 那么,公元1995年则为农历乙亥年。 再如:公元1861年 用尾数1查天干为“辛”,用1861除以12得余数为1,再用余数1查找地支为“酉”。那么,公元1861年则为农历辛酉年。 如果某一年的尾数为0或者用该年除以12的余数为0,则取天干中的第10位“庚”和地支中的第12位“申”。 如:公元120年 尾数0则取天干中的“庚”;除以12余数为0,则取地支中的第12位“申”。 那么,公元120年则为庚申年。 如果公元纪年是单个数字,就用该数字在天干、地支中查找即可。如:公元6年,则在天干、地支中找出6相对应的“丙”和“寅”,那么该年则为丙寅年。公元8年则为戊辰年。 公元11年,则取尾数1对应的天干中的“辛”和11对应的地支中的“未”。那么,该年则为辛未年。 公元12年则为壬申年。 公元前纪年与干支纪年的换算 将天干、地支编号如下: 天干:甲、乙、丙、丁、戊、已、庚、辛、壬、癸 7 6 5 4 3 2 1 10 9 8 地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 9 8 7 6 5 4 3 2 1 12 11 10 具体换算方法同一 如:公元前155年 用尾数5取天干中的“丙”; 155除以12得余数11,对应地支中的“戌”。那么,该年则为丙戌年。 公元前8年则为癸丑年 天干地支纪月 干支纪月时,每个地支对应二十四节气自某节气(非中气)至下一个节气,以交节时间决定起始的一个月期间,不是农历某月初一至月底。许多历书注明某农历月对应某干支,只是近似而非全等对应。若遇甲或己的年份,正月大致是丙寅;遇上乙或庚之年,正月大致为戊寅;丙或辛之年正月大致为庚寅,丁或壬之年正月大致为壬寅,戊或癸之年正月大致为甲寅。依照正月之干支,其余月份按干支推算。60个月合5年一个周期;一个周期完了重复使用,周而复始,循环下去。东汉光武帝建武二十九年癸丑年(公元53年)冬至月(大雪至小寒的月份,近似农历十一月)就是“甲子月”。有歌诀为证:甲己之年丙作首,乙庚之岁戊为头;丙辛必定寻庚起,丁壬壬位顺行流;更有戊癸何方觅,甲寅之上好追求。 下表是地支纪月时对应的节气时间段、中气、近似农历月份、近似阳历月份、以及年天干和月地支构成的月干支: 月地支 节气时间段 中气 近似农历月份 近似阳历月份 甲或己年 乙或庚年 丙或辛年 丁或壬年 戊或癸年 寅月 立春—惊蛰 雨水 正月 2月 丙寅月 戊寅月 庚寅月 壬寅月 甲寅月 卯月 惊蛰—清明 春分 二月 3月 丁卯月 己卯月 辛卯月 癸卯月 乙卯月 辰月 清明—立夏 谷雨 三月 4月 戊辰月 庚辰月 壬辰月 甲辰月 丙辰月 巳月 立夏—芒种 小满 四月 5月 己巳月 辛巳月 癸巳月 乙巳月 丁巳月 午月 芒种—小暑 夏至 五月 6月 庚午月 壬午月 甲午月 丙午月 戊午月 未月 小暑—立秋 大暑 六月 7月 辛未月 癸未月 乙未月 丁未月 己未月 申月 立秋—白露 处暑 七月 8月 壬申月 甲申月 丙申月 戊申月 庚申月 酉月 白露—寒露 秋分 八月 9月 癸酉月 乙酉月 丁酉月 己酉月 辛酉月 戌月 寒露—立冬 霜降 九月 10月 甲戌月 丙戌月 戊戌月 庚戌月 壬戌月 亥月 立冬—大雪 小雪 十月 11月 乙亥月 丁亥月 己亥月 辛亥月 癸亥月 子月 大雪—小寒 冬至 十一月 12月 丙子月 戊子月 庚子月 壬子月 甲子月 丑月 小寒—立春 大寒 十二月 1月 丁丑月 己丑月 辛丑月 癸丑月 乙丑月 干支纪月法未普遍实行,主要为星相家推算八字用。 推算实例:2004年大致是农历甲申年。那次甲申年自2004年2月4日19时56分立春起,至2005年2月4日1时43分立春止。这里的时刻是东经120度标准时。 丙寅月,2004年2月4日19时56分立春~2004年3月5日13时56分惊蛰 丁卯月,2004年3月5日13时56分惊蛰~2004年4月4日18时43分清明 戊辰月,2004年4月4日18时43分清明~2004年5月5日12时2分立夏 己巳月,2004年5月5日12时2分立夏~2004年6月5日16时14分芒种 庚午月,2004年6月5日16时14分芒种~2004年7月7日2时31分小暑 辛未月,2004年7月7日2时31分小暑~2004年8月7日12时20分立秋 壬申月,2004年8月7日12时20分立秋~2004年9月7日15时13分白露 癸酉月,2004年9月7日15时13分白露~2004年10月8日6时49分寒露 甲戌月,2004年10月8日6时49分寒露~2004年11月7日9时59分立冬 乙亥月,2004年11月7日9时59分立冬~2004年12月7日2时49分大雪 丙子月,2004年12月7日2时49分大雪~2005年1月5日14时3分小寒 丁丑月,2005年1月5日14时3分小寒~2005年2月4日1时43分大寒 天干地支纪日 干支纪日,60日大致合2个月一个周期;一个周期完了重复使用,周而复始,循环下去。确定的文献指出干支纪日始于鲁隐公三年夏历二月己巳日(公元前720年二月初十)。 因为儒略历的平年有365日,而每4年一次,公元年能被4整除,闰年有366日,平均一年365.25日,所以4年1461日和一甲子的60日,最小公倍数是29220日,合80年。这就是说,每80年,干支纪日对应的儒略历月日日期会反复一次循环。(公元4年本来应为闰年,但因为公元前45年开始实施儒略历后,“每隔3年”加一次闰日被误为“每3年”加一次闰日,所以罗马皇帝屋大维下令前5年、前1年、4年停闰以修正错误置闰。) 因为格里历的平年有365日,而每4年一次闰年,但是如果遇上整百年,公元年能被400整除才能认定为闰年(这是因为按照现在立法计算,四年一闰的规定使每年多出0.0078天,经过400年大约会多出3天,如果在能被400整除年份的前面3个百年不算闰年,则正好平衡),闰年有366日,平均一年365.2425日,所以400年146097日和一甲子的60日,最小公倍数是2921940日,合8000年。这就是说,每80年,干支纪日对应的格里历月日日期若没有遇到能被100但非400整除的公元年,会反复一次循环,但整体而言,假设未来从不改格里历,每8000年,干支纪日对应的格里历月日日期才会反复一次完整的循环。1912年2月18日,合农历壬子年正月初一,以及9912年2月18日,都是“甲子日”。 天干地支纪时 干支纪时,60时辰合5日一个周期;一个周期完了重复使用,周而复始,循环下去。必须注意的是子时分为0时到1时的早子时和23时到24时的晚子时,所以遇到甲或己之日,0时到1时是甲子时,但23时到24时是丙子时。晚子时又称子夜或夜子。日上起时亦有歌诀:甲己还加甲,乙庚丙作初;丙辛从戊起,丁壬庚子居;戊癸何方发,壬子是真途。下表列出日天干和时辰地支构成的时辰干支,以北京时间(UTC+8)为准: 时辰地支 北京时间(UTC+8)甲或己日 乙或庚日 丙或辛日 丁或壬日 戊或癸日 子时 23时—1时 甲子时 丙子时 戊子时 庚子时 壬子时 丑时 1时—3时 乙丑时 丁丑时 己丑时 辛丑时 癸丑时 寅时 3时—5时 丙寅时 戊寅时 庚寅时 壬寅时 甲寅时 卯时 5时—7时 丁卯时 己卯时 辛卯时 癸卯时 乙卯时 辰时 7时—9时 戊辰时 庚辰时 壬辰时 甲辰时 丙辰时 巳时 9时—11时 己巳时 辛巳时 癸巳时 乙巳时 丁巳时 午时 11时—13时 庚午时 壬午时 甲午时 丙午时 戊午时 未时 13时—15时 辛未时 癸未时 乙未时 丁未时 己未时 申时 15时—17时 壬申时 甲申时 丙申时 戊申时 庚申时 酉时 17时—19时 癸酉时 乙酉时 丁酉时 己酉时 辛酉时 戌时 19时—21时 甲戌时 丙戌时 戊戌时 庚戌时 壬戌时 亥时 21时—23时 乙亥时 丁亥时 己亥时 辛亥时 癸亥时 天干地支次序表 1. 甲子 2.乙丑 3.丙寅 4.丁卯 5.戊辰 6.己巳 7.庚午 8.辛未 9.壬申 10.癸酉 11.甲戌 12.乙亥 13.丙子 14.丁丑 15.戊寅 16.己卯 17.庚辰 18.辛巳 19.壬午 20.癸未 21.甲申 22.乙酉 23.丙戌 24.丁亥 25.戊子 26.己丑 27.庚寅 28.辛卯 29.壬辰 30.癸巳 31.甲午 32.乙未 33.丙申 34.丁酉 35.戊戌 36.己亥 37.庚子 38.辛丑 39.壬寅 40.癸卯 41.甲辰 42.乙巳 43.丙午 44.丁未 45.戊申 46.己酉 47.庚戌 48.辛亥 49.壬子 50.癸丑 51.甲寅 52.乙卯 53.丙辰 54.丁巳 55.戊午 56.己未 57.庚申 58.辛酉 59.壬戌 60.癸亥 天干地支的计算方法 (年份- 3)/10余数对天干 如1894-3=1891 ,1891除以10余数是1即为甲 (年份- 3)/12余数对地支 如1894-3=1891 ,1891除以12余数是7即为午 即1894年是甲午年 编辑本段其他相关 天干地支纪年法同时可纪年、月、日、时,分别称为“年柱、月柱、日柱、时柱”。此八个字就是俗称的“八字”。一个人的八字就是他出生时间的四柱记录。关于月、日、时的天干地支纪法,已使用不多,有兴趣的读者可去查阅有关资料。 十二地支与十二生肖对应,即子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪。
⑦ 剪枝算法怎么弄 大数取模
α-β剪枝技术
首先分析极小极大分析法效率,上述的极小极大分析法,实际是先生成一棵博弈树,然后再计算其倒推值,至使极小极大分析法效率较低。于是在极小极大分析法的基础上提出了α-β剪枝技术。
α-β剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。具体的剪枝方法如下:
(1) 对于一个与节点MIN,若能估计出其倒推值的上确界β,并且这个β值不大于 MIN的父节点(一定是或节点)的估计倒推值的下确界α,即α≥β,则就不必再扩展该 MIN节点的其余子节点了(因为这些节点的估值对MIN父节点的倒推值已无任何影响 了)。这一过程称为α剪枝。
(2) 对于一个或节点MAX,若能估计出其倒推值的下确界α,并且这个α值不小于 MAX的父节点(一定是与节点)的估计倒推值的上确界β,即α≥β,则就不必再扩展该MAX节点的其余子节点了(因为这些节点的估值对MAX父节点的倒推值已无任何影响 了)。这一过程称为β剪枝。
⑧ 数据结构有哪些基本算法
一、排序算法 1、有简单排序(包括冒泡排序、插入排序、选择排序) 2、快速排序,很常见的 3、堆排序, 4、归并排序,最稳定的,即没有太差的情况 二、搜索算法 最基础的有二分搜索算法,最常见的搜索算法,前提是序列已经有序 还有深度优先和广度有限搜索;及使用剪枝,A*,hash表等方法对其进行优化。 三、当然,对于基本数据结构,栈,队列,树。都有一些基本的操作 例如,栈的pop,push,队列的取队头,如队;以及这些数据结构的具体实现,使用连续的存储空间(数组),还是使用链表,两种具体存储方法下操作方式的具体实现也不一样。 还有树的操作,如先序遍历,中序遍历,后续遍历。 当然,这些只是一些基本的针对数据结构的算法。 而基本算法的思想应该有:1、回溯2、递归3、贪心4、动态规划5、分治有些数据结构教材没有涉及基础算法,lz可以另外找一些基础算法书看一下。有兴趣的可以上oj做题,呵呵。算法真的要学起来那是挺费劲。