取枝演算法
① 博弈演算法里的剪枝怎麼用(具體的)
極大極小過程,以及阿爾法-貝塔剪紙。極小極大搜索方法是博弈樹搜索的基本方法,現在博弈樹搜索中最常用的α-β剪枝搜索方法,就是從這一方法發展而來的。
首先假定,有一個評價函數可以對所有的棋局進行評估。當評價函數值大於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做題,呵呵。演算法真的要學起來那是挺費勁。