導航:首頁 > 源碼編譯 > ate數據演算法

ate數據演算法

發布時間:2022-05-09 17:33:32

⑴ 如何得到當日(僅指當日)獲利盤10%的價格不是Cost(10)這個用法!

HIGH 最高價
返回該周期最高價。
用法: HIGH

H 最高價
返回該周期最高價。
用法: H

LOW 最低價
返回該周期最低價。
用法: LOW

L 最低價
返回該周期最低價。
用法: L

CLOSE 收盤價
返回該周期收盤價。
用法: CLOSE

C 收盤價
返回該周期收盤價。
用法: C

VOL 成交量
返回該周期成交量。
用法: VOL

V 成交量
返回該周期成交量。
用法: V

OPEN 開盤價
返回該周期開盤價。
用法: OPEN

O: 開盤價
返回該周期開盤價。
用法: O

ADVANCE 上漲家數
返回該周期上漲家數。
用法: ADVANCE (本函數僅對大盤有效)

DECLINE 下跌家數
返回該周期下跌家數。
用法: DECLINE (本函數僅對大盤有效)

AMOUNT 成交額
返回該周期成交額。
用法: AMOUNT

ASKPRICE 委賣價
返回委賣1--委賣3價格。
用法: ASKPRICE(N) N取1—3。
(本函數僅個股在分筆成交分析周期有效)

ASKVOL 委賣量
返回委賣1--委賣3量。
用法: ASKVOL(N) N取1—3。
(本函數僅個股在分筆成交分析周期有效)

BIDPRICE 委買價
返回委買1--委買3價格。
用法: BIDPRICE(N) N取1—3。
(本函數僅個股在分筆成交分析周期有效)

BIDVOL 委買量
返回委買1--委買3量。
用法: BIDVOL(N) N取1—3。
(本函數僅個股在分筆成交分析周期有效)

BUYVOL 主動性買盤
返回主動性買單量。
用法: BUYVOL 當本筆成交為主動性買盤時,其數值等於成交量,否則為0。
(本函數僅個股在分筆成交分析周期有效)

SELLVOL 主動性賣盤
返回主動性賣單量。
用法: SELLVOL 當本筆成交為主動性賣盤時,其數值等於成交量,否則為0。
(本函數僅個股在分筆成交分析周期有效)

ISBUYORDER 主動性買單
返回該成交是否為主動性買單。
用法: ISBUYORDER 當本筆成交為主動性買盤時,返回1,否則為0。
(本函數僅個股在分筆成交分析周期有效)

ISSELLORDER 主動性賣單
返回該成交是否為主動性賣單。
用法: ISSELLORDER 當本筆成交為主動性賣盤時,返回1,否則為0。
(本函數僅個股在分筆成交分析周期有效)

ATE 日期
取得該周期從1900以來的年月日。
用法: DATE 例如函數返回1000101,表示2000年1月1日。

TIME 時間
取得該周期的時分秒。
用法: TIME 函數返回有效值范圍為(000000-235959)。

YEAR 年份
取得該周期的年份。
用法:YEAR

MONTH 月份
取得該周期的月份。
用法:MONTH 函數返回有效值范圍為(1-12)。

WEEK 星期
取得該周期的星期數。
用法: WEEK 函數返回有效值范圍為(0-6),0表示星期天。

DAY 日期
取得該周期的日期。
用法: DAY 函數返回有效值范圍為(1-31)。

HOUR 小時
取得該周期的小時數。
用法: HOUR 函數返回有效值范圍為(0-23),對於日線及更長的分析周期值為0。

MINUTE 分鍾
取得該周期的分鍾數。
用法: MINUTE 函數返回有效值范圍為(0-59),對於日線及更長的分析周期值為0。

FROMOPEN 分鍾
求當前時刻距開盤有多長時間。
用法: FROMOPEN 返回當前時刻距開盤有多長時間,單位為分鍾。
例如: FROMOPEN 當前時刻為早上十點,則返回31。

DRAWNULL 無效數
返回無效數。
用法: DRAWNULL
例如: IF(CLOSE>REF(CLOSE,1),CLOSE,DRAWNULL) 表示下跌時分析圖上不畫線。

BACKSET 向前賦值
將當前位置到若干周期前的數據設為1。
用法: BACKSET(X,N) 若X非0,則將當前位置到N周期前的數值設為1。
例如: BACKSET(CLOSE>OPEN,2) 若收陽則將該周期及前一周期數值設為1,否則為0。

BARSCOUNT 有效數據周期數
求總的周期數。
用法: BARSCOUNT(X) 第一個有效數據到當前的天數。
例如: BARSCOUNT(CLOSE) 對於日線數據取得上市以來總交易日數,對於分筆成交取得當日成交筆數,對於1分鍾線取得當日交易分鍾數。

CURRBARSCOUNT 到最後交易日的周期數
求到最後交易日的周期數.
用法:
CURRBARSCOUNT 求到最後交易日的周期數

TOTALBARSCOUNT 總的周期數
求總的周期數.
用法:
TOTALBARSCOUNT 求總的周期數

BARSLAST 上一次條件成立位置
上一次條件成立到當前的周期數。
用法: BARSLAST(X) 上一次X不為0到現在的天數。
例如: BARSLAST(CLOSE/REF(CLOSE,1)>=1.1) 表示上一個漲停板到當前的周期數。

BARSSINCE 第一個條件成立位置
第一個條件成立到當前的周期數。
用法: BARSSINCE(X) 第一次X不為0到現在的天數。
例如: BARSSINCE(HIGH>10) 表示股價超過10元時到當前的周期數。

COUNT 統計
統計滿足條件的周期數。
用法: COUNT(X,N) 統計N周期中滿足X條件的周期數,若N=0則從第一個有效值開始。
例如: COUNT(CLOSE>OPEN,20) 表示統計20周期內收陽的周期數。

HHV 最高值
求最高值。
用法: HHV(X,N) 求N周期內X最高值,N=0則從第一個有效值開始。
例如: HHV(HIGH,30) 表示求30日最高價。

HHVBARS 上一高點位置
求上一高點到當前的周期數。
用法: HHVBARS(X,N) 求N周期內X最高值到當前周期數,N=0表示從第一個有效值開始統計。
例如: HHVBARS(HIGH,0) 求得歷史新高到到當前的周期數。

LLV 最低值
求最低值。
用法: LLV(X,N) 求N周期內X最低值,N=0則從第一個有效值開始。
例如: LLV(LOW,0) 表示求歷史最低價。

LLVBARS 上一低點位置
求上一低點到當前的周期數。
用法: LLVBARS(X,N) 求N周期內X最低值到當前周期數,N=0表示從第一個有效值開始統計。
例如: LLVBARS(HIGH,20) 求得20日最低點到當前的周期數。

REVERSE 求相反數
求相反數。
用法: REVERSE(X) 返回-X。
例如: REVERSE(CLOSE) 返回-CLOSE。

REF 向前引用
引用若干周期前的數據。
用法: REF(X,A) 引用A周期前的X值。
例如: REF(CLOSE,1) 表示上一周期的收盤價,在日線上就是昨收。

REFDATE 指定引用
引用指定日期的數據。
用法: REFDATE(X,A) 引用A日期的X值。
例如: REF(CLOSE,20011208) 表示2001年12月08日的收盤價。

SUM 總和
求總和。
用法: SUM(X,N) 統計N周期中X的總和,N=0則從第一個有效值開始。
例如: SUM(VOL,0) 表示統計從上市第一天以來的成交量總和。

FILTER 過濾
過濾連續出現的信號。
用法: FILTER(X,N) X滿足條件後,刪除其後N周期內的數據置為0。
例如: FILTER(CLOSE>OPEN,5) 查找陽線,5天內再次出現的陽線不被記錄在內。

SUMBARS 累加到指定值的周期數
向前累加到指定值到現在的周期數。
用法: SUMBARS(X,A) 將X向前累加直到大於等於A,返回這個區間的周期數。
例如: SUMBARS(VOL,CAPITAL) 求完全換手到現在的周期數。

SMA 移動平均
返回移動平均。
用法: SMA(X,N,M) X的M日移動平均,M為權重,如Y=(X*M+Y'*(N-M))/N

MA 簡單移動平均
返回簡單移動平均。
用法: MA(X,M) X的M日簡單移動平均。

DMA 動態移動平均
求動態移動平均。
用法: DMA(X,A) 求X的動態移動平均。
演算法: 若Y=DMA(X,A)則 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必須小於1。
例如: DMA(CLOSE,VOL/CAPITAL) 表示求以換手率作平滑因子的平均價。

EMA(或EXPMA) 指數移動平均
返回指數移動平均。
用法: EMA(X,M) X的M日指數移動平均。

MEMA 平滑移動平均
返回平滑移動平均
用法: MEMA(X,M) X的M日平滑移動平均。

MEMA(X,N)與MA的差別在於起始值為一平滑值,而不是初始值
EXPMEMA 指數平滑移動平均
返回指數平滑移動平均。
用法: EXPMEMA(X,M) X的M日指數平滑移動平均。

EXPMEMA同EMA(即EXPMA)的差別在於他的起始值為一平滑值
RANGE 介於某個范圍之間
用法: RANGE(A,B,C) A在B和C。
例如: RANGE(A,B,C)表示A大於B同時小於C時返回1,否則返回0。

CONST 取值設為常數
用法: CONST(A) 取A最後的值為常量.
例如: CONST(INDEXC)表示取大盤現價。

CROSS 上穿
兩條線交叉。
用法: CROSS(A,B) 表示當A從下方向上穿過B時返回1,否則返回0。
例如: CROSS(MA(CLOSE,5),MA(CLOSE,10)) 表示5日均線與10日均線交金叉。

LONGCROSS 維持一定周期後上穿
兩條線維持一定周期後交叉。
用法: LONGCROSS(A,B,N) 表示A在N周期內都小於B,本周期從下方向上穿過B時返回1,否則返回0。

UPNDAY 連漲
返回是否連漲周期數。
用法: UPNDAY(CLOSE,M) 表示連漲M個周期。

DOWNNDAY 連跌
返回是否連跌周期。
用法: DOWNNDAY(CLOSE,M) 表示連跌M個周期。

NDAY 連大
返回是否持續存在X>Y。
用法: NDAY(CLOSE,OPEN,3) 表示連續3日收陽線。

EXIST 存在
是否存在。
用法: EXIST(CLOSE>OPEN,10) 表示前10日內存在著陽線。

EVERY 一直存在
一直存在。
用法: EVERY(CLOSE>OPEN,10) 表示前10日內一直陽線。

LAST 持續存在
用法: LAST(X,A,B) A>B,表示從前A日到前B日一直滿足X條件。若A為0,表示從第一天開始,B為0,表示到最後日止。
例如: LAST(CLOSE>OPEN,10,5) 表示從前10日到前5日內一直陽線。

NOT 取反
求邏輯非。
用法: NOT(X) 返回非X,即當X=0時返回1,否則返回0。
例如: NOT(ISUP) 表示平盤或收陰。

IF 邏輯判斷
根據條件求不同的值。
用法: IF(X,A,B) 若X不為0則返回A,否則返回B。
例如: IF(CLOSE>OPEN,HIGH,LOW)表示該周期收陽則返回最高值,否則返回最低值。

IFF 邏輯判斷
根據條件求不同的值。
用法: IFF(X,A,B) 若X不為0則返回A,否則返回B。
例如: IFF(CLOSE>OPEN,HIGH,LOW) 表示該周期收陽則返回最高值,否則返回最低值。

IFN 邏輯判斷
根據條件求不同的值。
用法: IFN(X,A,B) 若X不為0則返回B,否則返回A。
例如: IFN(CLOSE>OPEN,HIGH,LOW) 表示該周期收陰則返回最高值,否則返回最低值。

MAX 較大值
求最大值。
用法: MAX(A,B) 返回A和B中的較大值。
例如: MAX(CLOSE-OPEN,0) 表示若收盤價大於開盤價返回它們的差值,否則返回0。

MIN 較小值
求最小值。
用法: MIN(A,B) 返回A和B中的較小值。
例如: MIN(CLOSE,OPEN) 返回開盤價和收盤價中的較小值。

ACOS 反餘弦
反餘弦值。
用法: ACOS(X) 返回X的反餘弦值。

ASIN 反正弦
反正弦值。
用法: ASIN(X) 返回X的反正弦值。

ATAN 反正切
反正切值。
用法: ATAN(X) 返回X的反正切值。

COS 餘弦
餘弦值。
用法: COS(X) 返回X的餘弦值。

SIN 正弦
正弦值。
用法: SIN(X) 返回X的正弦值。

TAN 正切
正切值。
用法: TAN(X) 返回X的正切值。

EXP 指數
指數。
用法: EXP(X) e的X次冪。
例如: EXP(CLOSE) 返回e的CLOSE次冪。

LN 自然對數
求自然對數。
用法: LN(X) 以e為底的對數。
例如: LN(CLOSE) 求收盤價的對數。

LOG 對數
求10為底的對數。
用法: LOG(X) 取得X的對數。
例如: LOG(100) 等於2。

SQRT 開方
開平方。
用法: SQRT(X) 求X的平方根。
例如: SQRT(CLOSE) 收盤價的平方根。

ABS 絕對值
求絕對值。
用法: ABS(X) 返回X的絕對值。
例如: ABS(-34) 返回34。

POW 乘冪
乘冪。
用法: POW(A,B) 返回A的B次冪。
例如: POW(CLOSE,3) 求得收盤價的3次方。

CEILING 向上舍入
向上舍入。
用法: CEILING(A) 返回沿A數值增大方向最接近的整數。
例如: CEILING(12.3) 求得13,CEILING(-3.5)求得-3。

FLOOR 向下舍入
向下舍入。
用法: FLOOR(A) 返回沿A數值減小方向最接近的整數。
例如: FLOOR(12.3) 求得12,FLOOR(-3.5)求得-4。

INTPART 取整
用法: INTPART(A) 返回沿A絕對值減小方向最接近的整數。
例如: INTPART(12.3) 求得12,INTPART(-3.5)求得-3。

BETWEEN: 介於
介於。
用法: BETWEEN(A,B,C) 表示A處於B和C之間時返回1,否則返回0。
例如: BETWEEN(CLOSE,MA(CLOSE,10),MA(CLOSE,5))表示收盤價介於5日均線和10日均線之間。

AVEDEV 平均絕對方差
AVEDEV(X,N) 返回平均絕對方差。

DEVSQ 數據偏差平方和
DEVSQ(X,N) 返回數據偏差平方和。

FORCAST 線性回歸預測值
FORCAST(X,N) 返回線性回歸預測值。

SLOPE 線性回歸斜率
SLOPE(X,N) 返回線性回歸斜率。

STD 估算標准差
STD(X,N) 返回估算標准差。

STDP 總體標准差
STDP(X,N) 返回總體標准差。

VAR 估算樣本方差
VAR(X,N) 返回估算樣本方差。

VARP 總體樣本方差
VARP(X,N) 返回總體樣本方差 。

BLOCKSETNUM 板塊股票個數
用法: BLOCKSETNUM(板塊名稱) 返回該板塊股票個數。

HORCALC 多股統計
用法: HORCALC(板塊名稱,數據項,計算方式,權重)
數據項:100-HIGH,101-OPEN,102-LOW,103-CLOSE,104-VOL,105-漲幅
計算方式: 0-累加,1-排名次
權重: 0-總股本,1-流通股本,2-等同權重,3-流通市值

COST 成本分布
成本分布情況。
用法: COST(10),表示10%獲利盤的價格是多少,即有10%的持倉量在該價格以下,其餘90%在該價格以上,為套牢盤。
該函數僅對日線分析周期有效。

PEAK 波峰值
前M個ZIG轉向波峰值。
用法: PEAK(K,N,M) 表示之字轉向ZIG(K,N)的前M個波峰的數值,M必須大於等於1。
例如: PEAK(1,5,1) 表示%5最高價ZIG轉向的上一個波峰的數值。

PEAKBARS 波峰位置
前M個ZIG轉向波峰到當前距離。
用法: PEAKBARS(K,N,M) 表示之字轉向ZIG(K,N)的前M個波峰到當前的周期數,M必須大於等於1。
例如: PEAKBARS (0,5,1) 表示%5開盤價ZIG轉向的上一個波峰到當前的周期數。

SAR 拋物轉向
拋物轉向。
用法: SAR(N,S,M),N為計算周期,S為步長,M為極值。
例如: SAR(10,2,20) 表示計算10日拋物轉向,步長為2%,極限值為20%。

SARTURN 拋物轉向點
拋物轉向點。
用法: SARTURN(N,S,M) N為計算周期,S為步長,M為極值,若發生向上轉向則返回1,若發生向下轉向則返回-1,否則為0。
其用法與SAR函數相同。

TROUGH 波谷值
前M個ZIG轉向波谷值。
用法: TROUGH(K,N,M) 表示之字轉向ZIG(K,N)的前M個波谷的數值,M必須大於等於1。
例如: TROUGH(2,5,2) 表示%5最低價ZIG轉向的前2個波谷的數值。

TROUGHBARS 波谷位置
前M個ZIG轉向波谷到當前距離。
用法: TROUGHBARS(K,N,M) 表示之字轉向ZIG(K,N)的前M個波谷到當前的周期數,M必須大於等於1。
例如: TROUGH(2,5,2) 表示%5最低價ZIG轉向的前2個波谷到當前的周期數。

WINNER 獲利盤比例
獲利盤比例。
用法: WINNER(CLOSE) 表示以當前收市價賣出的獲利盤比例。
例如: 返回0.1表示10%獲利盤,WINNER(10.5)表示10.5元價格的獲利盤比例。
該函數僅對日線分析周期有效。

LWINNER 近期獲利盤比例
近期獲利盤比例。
用法: LWINNER(5,CLOSE) 表示最近5天的那部分成本以當前收市價賣出的獲利盤比例。例如返回0.1表示10%獲利盤。

PWINNER 遠期獲利盤比例
遠期獲利盤比例。
用法: PWINNER(5,CLOSE) 表示5天前的那部分成本以當前收市價賣出的獲利盤比例。例如返回0.1表示10%獲利盤。

COSTEX 區間成本
區間成本。
用法: COSTEX(CLOSE,REF(CLOSE)),表示近兩日收盤價格間籌碼的成本,例如返回10表示區間成本為20元。
該函數僅對日線分析周期有效。

PPART 遠期成本分布比例
遠期成本分布比例。
用法: PPART(10),表示10前的成本占總成本的比例,0.2表示20%。

ZIG 之字轉向
之字轉向。
用法: ZIG(K,N) 當價格變化量超過N%時轉向,K表示0:開盤價,1:最高價,2:最低價,3:收盤價,其餘:數組信息
例如: ZIG(3,5) 表示收盤價的5%的ZIG轉向。

INDEXA 返回大盤成交額
INDEXADV 返回上漲家數
INDEXDEC 返回下跌家數
INDEXC 返回大盤收盤價
INDEXH 返回大盤最高價
INDEXL 返回大盤最低價
INDEXO 返回大盤開盤價
INDEXV 返回大盤成交量

PLOYLINE 折線段

在圖形上繪制折線段。

用法: PLOYLINE(COND,PRICE),當COND條件滿足時,以PRICE位置為頂點畫折線連接。

例如: PLOYLINE(HIGH>=HHV(HIGH,20),HIGH)表示在創20天新高點之間畫折線。

DRAWLINE 繪制直線段

在圖形上繪制直線段。

用法: DRAWLINE(COND1,PRICE1,COND2,PRICE2,EXPAND)

當COND1條件滿足時,在PRICE1位置畫直線起點,當COND2條件滿足時,在PRICE2位置畫直線終點,EXPAND為延長類型。

例如: DRAWLINE(HIGH>=HHV(HIGH,20),HIGH,LOW<=LLV(LOW,20),LOW,1) 表示在創20天新高與創20天新低之間畫直線並且向右延長。

DRAWKLINE 繪制K線

用法: DRAWKLINE(HIGH,OPEN,LOW,CLOSE) 以HIGH為最高價,OPEN為開盤價,LOW為最低,CLOSE收盤畫K線。

STICKLINE 繪制柱線

在圖形上繪制柱線。

用法: STICKLINE(COND,PRICE1,PRICE2,WIDTH,EMPTY),當COND條件滿足時,在PRICE1和PRICE2位置之間畫柱狀線,寬度為WIDTH(10為標准間距),EMPTH不為0則畫空心柱。

例如: STICKLINE(CLOSE>OPEN,CLOSE,OPEN,0.8,1)表示畫K線中陽線的空心柱體部分。

DRAWICON 繪制圖標

在圖形上繪制小圖標。

用法: DRAWICON(COND,PRICE,TYPE),當COND條件滿足時,在PRICE位置畫TYPE號圖標。

例如: DRAWICON(CLOSE>OPEN,LOW,1) 表示當收陽時在最低價位置畫1號圖標。圖標一共有九個,圖形如附圖。序號,最下面的是「1」號,最上面的是「9」號。

DRAWTEXT 顯示文字

在圖形上顯示文字。

用法: DRAWTEXT(COND,PRICE,TEXT),當COND條件滿足時,在PRICE位置書寫文字TEXT。

例如: DRAWTEXT(CLOSE/OPEN>1.08,LOW,'大陽線')表示當日漲幅大於8%時在最低價位置顯示'大陽線'字樣。

FINANCE(1) 總股本(萬股)
FINANCE(2) 國家股(萬股)
FINANCE(3) 發起人法人股(萬股)
FINANCE(4) 法人股(萬股)
FINANCE(5) B股(萬股)
FINANCE(6) H股(萬股)
FINANCE(7) 流通股本(萬股)
CAPITAL 流通股本(手)
FINANCE(8) 職工股(萬股)
FINANCE(10) 總資產
FINANCE(11) 流動資產
FINANCE(12) 固定資產
FINANCE(13) 無形資產
FINANCE(14) 長期投資
FINANCE(15) 流動負債
FINANCE(16) 長期負債
FINANCE(17) 資本公積金
FINANCE(18) 每股公積金
FINANCE(19) 股東權益
FINANCE(20) 主營收入
FINANCE(21) 主營利益
FINANCE(22) 其它利益
FINANCE(23) 營業利益
FINANCE(24) 投資收益
FINANCE(25) 補貼收入
FINANCE(26) 營業外收支
FINANCE(27) 上年損益調整
FINANCE(28) 利益總額
FINANCE(29) 稅後利益
FINANCE(30) 凈利益
FINANCE(31) 未分配利益
FINANCE(32) 每股未分配利潤
FINANCE(33) 每股收益
FINANCE(34) 每股凈資產
FINANCE(35) 調整每股凈資產
FINANCE(36) 股東權益比
FINANCE(40) 流通市值
FINANCE(41) 總市值
FINANCE(42) 上市日期

DYNAINFO(3) 前收盤價
DYNAINFO(4) 今開
DYNAINFO(5) 最高
DYNAINFO(6) 最低
DYNAINFO(7) 現價
DYNAINFO(8) 總手
DYNAINFO(9) 現手
DYNAINFO(10) 總成交金額
DYNAINFO(11) 均價
DYNAINFO(12) 日升跌
DYNAINFO(13) 振幅度
DYNAINFO(14) 漲幅度
DYNAINFO(15) 委託比
DYNAINFO(16) 委量差
DYNAINFO(17) 量比
DYNAINFO(20) 最新叫買價
DYNAINFO(21) 最新叫賣價
DYNAINFO(22) 內盤
DYNAINFO(23) 外盤
DYNAINFO(25) 買一量
DYNAINFO(26) 買二量
DYNAINFO(27) 買三量
DYNAINFO(28) 買一價
DYNAINFO(29) 買二價
DYNAINFO(30) 買三價
DYNAINFO(31) 賣一量
DYNAINFO(32) 賣二量
DYNAINFO(33) 賣三量
DYNAINFO(34) 賣一價
DYNAINFO(35) 賣二價
DYNAINFO(36) 賣三價
DYNAINFO(37) 換手率
DYNAINFO(39) 市盈率
DYNAINFO(40) 成交方向
DYNAINFO(50) 采樣點數
DYNAINFO(51) 內外比
DYNAINFO(52) 多空平衡
DYNAINFO(53) 多頭獲利
DYNAINFO(54) 空頭回補
DYNAINFO(55) 多頭止損
DYNAINFO(56) 空頭止損
DYNAINFO(57) 筆升跌
COLOR 自定義色
格式為COLOR+「RRGGBB」:RR、GG、BB表示紅藍色、綠色和藍色的分量,每種顏色的取值范圍是00-FF,採用了16進制。
例如:MA5:MA(CLOSE,5),COLOR00FFFF 表示純紅色與純綠色的混合色:COLOR808000表示淡藍色和淡綠色的混合色。
COLORBLACK 畫黑色
COLORBLUE 畫藍色
COLORGREEN 畫綠色
COLORCYAN 畫青色
COLORRED 畫紅色
COLORMAGENTA 畫洋紅色
COLORBROWN 畫棕色
COLORLIGRAY 畫淡灰色
COLORGRAY 畫深灰色
COLORLIBLUE 畫淡藍色
COLORLIGREEN 畫淡綠色
COLORLICYAN 畫淡青色
COLORLIRED 畫淡紅色
COLORLIMAGENTA 畫淡洋紅色
COLORYELLOW 畫黃色
COLORWHITE 畫白色
LINETHICK 線型粗細
格式:「LINETHICK+(1-9)」 參數的取值范圍在1—9之間,「LINETHICK1」表示最細的線,而「LINETHICK9」表示最粗的線。
STICK 畫柱狀線
COLORSTICK 畫彩色柱狀線
VOLSTICK 畫彩色柱狀線
成交量柱狀線,當股價上漲時顯示紅色空心柱,則顯示綠色實心柱
LINESTICK 同時畫出柱狀線和指標線
CROSSDOT 畫小叉線
CIRCLEDOT 畫小圓圈線
POINTDOT 畫小圓點線

⑵ void push(SqStack &S,int e)有什麼錯誤

函數類型應為int型,因為之後存在函數調用,有返回值return ok(0);
即:
int push(Sqstack &s,int e){
*s.top++=e;
return ok;
}

⑶ C++,ios::ate和ios::app

用ios::ate的話,輸出結果是這樣的:1236而不是你說的456。
根據定義,ate的用法是:輸入的第一個位元組被放在文件最後,而剩下輸入的字元將覆蓋之前輸入的字元,也就是游標仍然在原來文件的末尾,也就是3的後面。4和5都被6覆蓋掉了。
希望採納

⑷ ate,bake,excel怎麼分列

選中該列,數據,分列,勾選分隔符號,下一步,勾選逗號,或者其它,空格中輸入

完成。

⑸ 如何看sci論文crosscheck / ithenticate查重報告

1)、報告中的內容會有各種顏色標示,標示了顏色的說明是檢測到重復的,不同的顏色只是用於區分重復源不同;
2)、顏色上方的數字是序號,跟報告後面的重復來源對應,方便同學們查閱,序號越小說明與此重復源的相同內容越多;
3)、SIMILARITY INDEX是指檢測的總重復率,雜志社一般是看這個指標(也有部分雜志對單重復源有要求,具體請咨詢對應期刊),總重復率是由下面的Crossref、Internet、Publications等資料庫的重復通過程序演算法權加得到;
以上答案來源於ithenticate中文官網,更多的信息可到官網上查看了

⑹ 網路安全 簡述RSA演算法的原理和特點

1978年就出現了這種演算法,它是第一個既能用於數據加密也能用於數字簽名的演算法。
它易於理解和操作,也很流行。演算法的名字以發明者的名字命名:Ron Rivest, Adi
Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理論上的證明。

RSA的安全性依賴於大數分解。公鑰和私鑰都是兩個大素數( 大於 100
個十進制位)的函數。據猜測,從一個密鑰和密文推斷出明文的難度等同於分解兩個
大素數的積。

密鑰對的產生。選擇兩個大素數,p 和q 。計算:

n = p * q

然後隨機選擇加密密鑰e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互質。最後,利用
Euclid 演算法計算解密密鑰d, 滿足

e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )

其中n和d也要互質。數e和
n是公鑰,d是私鑰。兩個素數p和q不再需要,應該丟棄,不要讓任何人知道。

加密信息 m(二進製表示)時,首先把m分成等長數據塊 m1 ,m2,..., mi ,塊長s
,其中 2^s <= n, s 盡可能的大。對應的密文是:

ci = mi^e ( mod n ) ( a )

解密時作如下計算:

mi = ci^d ( mod n ) ( b )

RSA 可用於數字簽名,方案是用 ( a ) 式簽名, ( b )
式驗證。具體操作時考慮到安全性和 m信息量較大等因素,一般是先作 HASH 運算。

RSA 的安全性。
RSA的安全性依賴於大數分解,但是否等同於大數分解一直未能得到理論上的證明,因
為沒有證明破解
RSA就一定需要作大數分解。假設存在一種無須分解大數的演算法,那它肯定可以修改成
為大數分解演算法。目前, RSA
的一些變種演算法已被證明等價於大數分解。不管怎樣,分解n是最顯然的攻擊方法。現
在,人們已能分解140多個十進制位的大素數。因此,模數n
必須選大一些,因具體適用情況而定。

RSA的速度。
由於進行的都是大數計算,使得RSA最快的情況也比DES慢上100倍,無論是軟體還是硬
件實現。速度一直是RSA的缺陷。一般來說只用於少量數據加密。

RSA的選擇密文攻擊。
RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝(
Blind),讓擁有私鑰的實體簽署。然後,經過計算就可得到它所想要的信息。實際上
,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:

( XM )^d = X^d *M^d mod n

前面已經提到,這個固有的問題來自於公鑰密碼系統的最有用的特徵--每個人都能使
用公鑰。但從演算法上無法解決這一問題,主要措施有兩條:一條是採用好的公鑰協議
,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息
簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way Hash
Function
對文檔作HASH處理,或同時使用不同的簽名演算法。在中提到了幾種不同類型的攻擊方
法。

RSA的公共模數攻擊。
若系統中共有一個模數,只是不同的人擁有不同的e和d,系統將是危險的。最普遍的
情況是同一信息用不同的公鑰加密,這些公鑰共模而且互質,那末該信息無需私鑰就
可得到恢復。設P為信息明文,兩個加密密鑰為e1和e2,公共模數是n,則:

C1 = P^e1 mod n

C2 = P^e2 mod n

密碼分析者知道n、e1、e2、C1和C2,就能得到P。

因為e1和e2互質,故用Euclidean演算法能找到r和s,滿足:

r * e1 + s * e2 = 1

假設r為負數,需再用Euclidean演算法計算C1^(-1),則

( C1^(-1) )^(-r) * C2^s = P mod n

另外,還有其它幾種利用公共模數攻擊的方法。總之,如果知道給定模數的一對e和d
,一是有利於攻擊者分解模數,一是有利於攻擊者計算出其它成對的e』和d』,而無
需分解模數。解決辦法只有一個,那就是不要共享模數n。

RSA的小指數攻擊。 有一種提高
RSA速度的建議是使公鑰e取較小的值,這樣會使加密變得易於實現,速度有所提高。
但這樣作是不安全的,對付辦法就是e和d都取較大的值。

RSA演算法是第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。RSA是被研
究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為
人們接受,普遍認為是目前最優秀的公鑰方案之一。RSA
的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難
度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學界多數
人士傾向於因子分解不是NPC問題。
RSA的缺點主要有:A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次
一密。B)分組長度太大,為保證安全性,n 至少也要 600 bits
以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大
數分解技術的發展,這個長度還在增加,不利於數據格式的標准化。目前,SET(
Secure Electronic Transaction
)協議中要求CA採用2048比特長的密鑰,其他實體使用1024比特的密鑰。

DSS/DSA演算法

Digital Signature Algorithm
(DSA)是Schnorr和ElGamal簽名演算法的變種,被美國NIST作為DSS(Digital Signature
Standard)。演算法中應用了下述參數:
p:L bits長的素數。L是64的倍數,范圍是512到1024;
q:p - 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h滿足h < p - 1, h^((p-1)/q) mod p > 1;
x:x < q,x為私鑰 ;
y:y = g^x mod p ,( p, q, g, y )為公鑰;
H( x ):One-Way Hash函數。DSS中選用SHA( Secure Hash Algorithm )。
p, q,
g可由一組用戶共享,但在實際應用中,使用公共模數可能會帶來一定的威脅。簽名及
驗證協議如下:
1. P產生隨機數k,k < q;
2. P計算 r = ( g^k mod p ) mod q
s = ( k^(-1) (H(m) + xr)) mod q
簽名結果是( m, r, s )。
3. 驗證時計算 w = s^(-1)mod q
u1 = ( H( m ) * w ) mod q
u2 = ( r * w ) mod q
v = (( g^u1 * y^u2 ) mod p ) mod q
若v = r,則認為簽名有效。

DSA是基於整數有限域離散對數難題的,其安全性與RSA相比差不多。DSA的一個重要特
點是兩個素數公開,這樣,當使用別人的p和q時,即使不知道私鑰,你也能確認它們
是否是隨機產生的,還是作了手腳。RSA演算法卻作不到。

本文來自CSDN博客,

⑺ 自動測試設備(ATE)

自動化測試設備,用AG3070成本太貴,可以定做非標自動化測試設備,由電腦,數據採集卡,控制卡,電源等儀器,治具....等組成。
深圳市中譽達自動化測試設備有限公司(英文名ZYATE):是一家專業從事PCBA、手機、電視、音響、冰箱、洗衣機、空調、電源等電子產品的自動化功能測試方案設計的現代化高科技企業,公司主要產品有:FCT fixture、ICT fixture、MCU fixture、自動化測試設備、自動化測試系統、功能測試夾具等,均是各大電子產品廠商常用的提高產品質量和工作效率的自動化測試系統。
我公司採用的開發工具主要有:NI Labview、Teststand、labwindows CVI、Vision Builder、Vision Assistant、VB、VC++等,測試產品類別極其廣闊,有洗衣機自動化測試設備/系統、電烤箱自動化測試設備/系統、冰箱自動化測試設備/系統、變壓器自動化測試設備/系統、電感自動化測試設備/系統、貼片電阻自動測試分選設備/系統、電子書自動化測試設備/系統、LCD/LED字元自動讀取測試設備/系統、液晶電視機的自動化測試設備/系統、空調自動化測試設備/系統、節能燈自動化測試設備/系統、醫療器械自動化測試設備、老化自動化測試設備、閃光燈自動化測試設備/系統、FPC自動化測試設備/軟板自動化測試設備、手機自動化測試設備、微針測試設備、邊界掃描測試設備.....等所有電子產品相關的PCBA自動化測試設備/測試系統。
公司擁有一支高素質的管理、研發、生產、服務專業團隊,為適應現代化企業的高速發展,公司一直秉承「以客戶需求為標准」的宗旨,「以人為本」的經營理念,不斷更新技術,開拓創新,努力發展成為國內外具備相當規模及知名度的自動化測試設備的提供者。

⑻ 鍰ATE數據到MySQL資料庫為什麼存入的時

如果mysql的數據類型是date的話 用date('Y-m-d')獲取時間
如果是datetime類型,用date('Y-m-d H:i:s')獲取時間
個人建議,用int存儲,這樣佔用的的資源小,查詢的速度也會快,用time()方法獲取時間戳,在調用的時候根據你想要的形式,將時間戳轉換成你要的時間,如果只顯示年月日的話,用date('Y-m-d',$date),如果需要顯示精確時間,用date('Y-m-d H:i:s')就可以了

⑼ 求八數碼問題演算法,並說明下該演算法優缺點,要演算法,不是源代碼(可以沒有)。

八數碼問題

一.八數碼問題
八數碼問題也稱為九宮問題。在3×3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有一個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是:給出一個初始狀態和一個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟。所謂問題的一個狀態就是棋子在棋盤上的一種擺法。棋子移動後,狀態就會發生改變。解八數碼問題實際上就是找出從初始狀態到達目標狀態所經過的一系列中間過渡狀態。
八數碼問題一般使用搜索法來解。搜索法有廣度優先搜索法、深度優先搜索法、A*演算法等。這里通過用不同方法解八數碼問題來比較一下不同搜索法的效果。

二.搜索演算法基類
1.八數碼問題的狀態表示
八數碼問題的一個狀態就是八個數字在棋盤上的一種放法。每個棋子用它上面所標的數字表示,並用0表示空格,這樣就可以將棋盤上棋子的一個狀態存儲在一個一維數組p[9]中,存儲的順序是從左上角開始,自左至右,從上到下。也可以用一個二維數組來存放。
2.結點
搜索演算法中,問題的狀態用結點描述。結點中除了描述狀態的數組p[9]外,還有一個父結點指針last,它記錄了當前結點的父結點編號,如果一個結點v是從結點u經狀態變化而產生的,則結點u就是結點v的父結點,結點v的last記錄的就是結點u的編號。在到達目標結點後,通過last 可以找出搜索的路徑。
3.類的結構
在C++中用類來表示結點,類將結點有關的數據操作封裝在一起。
不同的搜索演算法具有一定共性,也有各自的個性,因此這里將不同搜索演算法的共有的數據和功能封裝在一個基類中,再通過繼承方式實現不同的搜索演算法。
4.結點擴展規則
搜索就是按照一定規則擴展已知結點,直到找到目標結點或所有結點都不能擴展為止。
八數碼問題的結點擴展應當遵守棋子的移動規則。按照棋子移動的規則,每一次可以將一個與空格相鄰棋子移動到空格中,實際上可以看作是空格作相反移動。空格移動的方向可以是右、下、左、上,當然不能移出邊界。棋子的位置,也就是保存狀態的數組元素的下標。空格移動後,它的位置發生變化,在不移出界時,空格向右、下、左和上移動後,新位置是原位置分別加上1、3、-1、-3,如果將空格向右、下、左和上移動分別用0、1、2、3表示,並將-3、3、-1、1放在靜態數組d[4]中,空格位置用spac表示,那麼空格向方向i移動後,它的位置變為spac+d[i]。空格移動所產生的狀態變化,反映出來則是將數組p[]中,0的新位置處的數與0交換位置。
5.八數碼問題的基類

八數碼問題的基類及其成員函數的實現如下:
#define Num 9
class TEight
{
public:
TEight(){}
TEight(char *fname); //用文件數據構造節點
virtual void Search()=0; //搜索
protected:
int p[Num];
int last,spac;
static int q[Num],d[],total;
void Printf();
bool operator==(const TEight &T);
bool Extend(int i);
};
int TEight::q[Num];//儲存目標節點
int TEight::d[]={1,3,-1,-3};//方向
int TEight::total=0;//步數

TEight::TEight(char *fname)
{
ifstream fin;
fin.open(fname,ios::in);
if(!fin)
{
cout<<"不能打開數據文件!"<<endl;
return;
}
int i;
for(i=0;i<Num;)//得到源節點
fin>>p[i++];
fin>>spac;
for(i=0;i<Num;)//得到目標節點
fin>>q[i++];
fin.close();
last=-1;
total=0;
}

void TEight::Printf()//把路徑列印到結果文件
{
ofstream fout;
fout.open("eight_result.txt",ios::ate|ios::app);
fout<<total++<<"t";
for(int i=0;i<Num;)
fout<<" "<<p[i++];
fout<<endl;
fout.close();
}

bool TEight::operator==(const TEight &T)//判斷兩個狀態是否相同
{
for(int i=0;i<Num;)
if(T.p[i]!=p[i++])
return 0;
return 1;
}

bool TEight::Extend(int i)//擴展
{
if(i==0 && spac%3==2 || i==1 && spac>5
|| i==2 && spac%3==0 || i==3 && spac<3)
return 0;
int temp=spac;
spac+=d[i];
p[temp]=p[spac];
p[spac]=0;
return 1;
}

數據文件的結構:
一共三行,第一行是用空格隔開的九個數字0~8,這是初始狀態。第二行是一個數字,空格(數字0)的位置,第三行也是用空格隔開的九個數字0~8,這是目標狀態。

三.線性表
搜索法在搜索過程中,需要使用一個隊列存儲搜索的中間結點,為了在找到目標結點後,能夠找到從初始結點到目標結點的路徑,需要保留所有搜索過的結點。另一方面,不同問題甚至同一問題的不同搜索方法中,需要存儲的結點數量相差很大,所以這里採用鏈式線性表作為存儲結構,同時,為適應不同問題,線性表設計成類模板形式。
template<class Type> class TList; //線性表前視定義

template<class Type> class TNode //線性表結點類模板
{
friend class TList<Type>;
public:
TNode(){}
TNode(const Type& dat);
private:
TNode<Type>* Next;
Type Data;
};

template<class Type> class TList
{
public:
TList(){Last=First=0;Length=0;} //構造函數
int Getlen()const{return Length;} //成員函數,返回線性表長度
int Append(const Type& T); //成員函數,從表尾加入結點
int Insert(const Type& T,int k); //成員函數,插入結點
Type GetData(int i); //成員函數,返回結點數據成員
void SetData(const Type& T,int k); //成員函數,設置結點數據成員
private:
TNode<Type> *First,*Last; //數據成員,線性表首、尾指針
int Length; //數據成員,線性表長度
};

template<class Type> int TList<Type>::Append(const Type& T)
{
Insert(T,Length);
return 1;
}

template<class Type> int TList<Type>::Insert(const Type& T,int k)
{
TNode<Type> *p=new TNode<Type>;
p->Data=T;
if(First)
{
if(k<=0)
{
p->Next=First;
First=p;
}
if(k>Length-1)
{
Last->Next=p;
Last=Last->Next;
Last->Next=0;
}
if(k>0 && k<Length)
{
k--;
TNode<Type> *q=First;
while(k-->0)
q=q->Next;
p->Next=q->Next;
q->Next=p;
}
}
else
{
First=Last=p;
First->Next=Last->Next=0;
}
Length++;
return 1;
}

template<class Type> Type TList<Type>::GetData(int k)
{
TNode<Type> *p=First;
while(k-->0)
p=p->Next;
return p->Data;
}

template<class Type> void TList<Type>::SetData(const Type& T,int k)
{
TNode<Type> *p=First;
while(k-->0)
p=p->Next;
p->Data=T;
}
線性表單獨以頭文件形式存放。

四.廣度優先搜索法
在搜索法中,廣度優先搜索法是尋找最短路經的首選。
1.廣度優先搜索演算法的基本步驟
1)建立一個隊列,將初始結點入隊,並設置隊列頭和尾指針
2)取出隊列頭(頭指針所指)的結點進行擴展,從它擴展出子結點,並將這些結點按擴展的順序加入隊列。
3)如果擴展出的新結點與隊列中的結點重復,則拋棄新結點,跳至第六步。
4)如果擴展出的新結點與隊列中的結點不重復,則記錄其父結點,並將它加入隊列,更新隊列尾指針。
5)如果擴展出的結點是目標結點,則輸出路徑,程序結束。否則繼續下一步。
6)如果隊列頭的結點還可以擴展,直接返回第二步。否則將隊列頭指針指向下一結點,再返回第二步。
2.搜索路徑的輸出
搜索到目標結點後,需要輸出搜索的路徑。每個結點有一個數據域last,它記錄了結點的父結點,因此輸出搜索路徑時,就是從目標結點Q出發,根據last找到它的父結點,再根據這個結點的last找到它的父結點,....,最後找到初始結點。搜索的路徑就是從初始結點循相反方向到達目標結點的路徑。
3.廣度優先搜索法TBFS類的結構
廣度優先搜索法TBFS類是作為TEight類的一個子類。其類的結構和成員函數的實現如下:
class TBFS:public TEight
{
public:
TBFS(){}
TBFS(char *fname):TEight(fname){}
virtual void Search();
private:
void Printl(TList<TBFS> &L);
int Repeat(TList<TBFS> &L);
int Find();
};

void TBFS::Printl(TList<TBFS> &L)
{
TBFS T=*this;
if(T.last==-1)
return;
else
{
T=L.GetData(T.last);
T.Printl(L);
T.Printf();
}
}

int TBFS::Repeat(TList<TBFS> &L)
{
int n=L.Getlen();
int i;
for(i=0;i<n;i++)
if(L.GetData(i)==*this)
break;
return i;
}

int TBFS::Find()
{
for(int i=0;i<Num;)
if(p[i]!=q[i++])
return 0;
return 1;
}

void TBFS::Search()
{
TBFS T=*this;
TList<TBFS> L;
L.Append(T);
int head=0,tail=0;
while(head<=tail)
{
for(int i=0;i<4;i++)
{
T=L.GetData(head);
if(T.Extend(i) && T.Repeat(L)>tail)
{
T.last=head;
L.Append(T);
tail++;
}
if(T.Find())
{
T.Printl(L);
T.Printf();
return;
}
}
head++;
}
}
4.廣度優先搜索法的缺點
廣度優先搜索法在有解的情形總能保證搜索到最短路經,也就是移動最少步數的路徑。但廣度優先搜索法的最大問題在於搜索的結點數量太多,因為在廣度優先搜索法中,每一個可能擴展出的結點都是搜索的對象。隨著結點在搜索樹上的深度增大,搜索的結點數會很快增長,並以指數形式擴張,從而所需的存儲空間和搜索花費的時間也會成倍增長。

五、A*演算法
1.啟發式搜索
廣度優先搜索和雙向廣度優先搜索都屬於盲目搜索,這在狀態空間不大的情況下是很合適的演算法,可是當狀態空間十分龐大時,它們的效率實在太低,往往都是在搜索了大量無關的狀態結點後才碰到解答,甚至更本不能碰到解答。
搜索是一種試探性的查尋過程,為了減少搜索的盲目性引,增加試探的准確性,就要採用啟發式搜索了。所謂啟發式搜索就是在搜索中要對每一個搜索的位置進行評估,從中選擇最好、可能容易到達目標的位置,再從這個位置向前進行搜索,這樣就可以在搜索中省略大量無關的結點,提高了效率。
2.A*演算法
A*演算法是一種常用的啟發式搜索演算法。
在A*演算法中,一個結點位置的好壞用估價函數來對它進行評估。A*演算法的估價函數可表示為:
f'(n) = g'(n) + h'(n)
這里,f'(n)是估價函數,g'(n)是起點到終點的最短路徑值(也稱為最小耗費或最小代價),h'(n)是n到目標的最短路經的啟發值。由於這個f'(n)其實是無法預先知道的,所以實際上使用的是下面的估價函數:
f(n) = g(n) + h(n)
其中g(n)是從初始結點到節點n的實際代價,h(n)是從結點n到目標結點的最佳路徑的估計代價。在這里主要是h(n)體現了搜索的啟發信息,因為g(n)是已知的。用f(n)作為f'(n)的近似,也就是用g(n)代替g'(n),h(n)代替h'(n)。這樣必須滿足兩個條件:(1)g(n)>=g'(n)(大多數情況下都是滿足的,可以不用考慮),且f必須保持單調遞增。(2)h必須小於等於實際的從當前節點到達目標節點的最小耗費h(n)<=h'(n)。第二點特別的重要。可以證明應用這樣的估價函數是可以找到最短路徑的。
3.A*演算法的步驟
A*演算法基本上與廣度優先演算法相同,但是在擴展出一個結點後,要計算它的估價函數,並根據估價函數對待擴展的結點排序,從而保證每次擴展的結點都是估價函數最小的結點。
A*演算法的步驟如下:
1)建立一個隊列,計算初始結點的估價函數f,並將初始結點入隊,設置隊列頭和尾指針。
2)取出隊列頭(隊列頭指針所指)的結點,如果該結點是目標結點,則輸出路徑,程序結束。否則對結點進行擴展。
3)檢查擴展出的新結點是否與隊列中的結點重復,若與不能再擴展的結點重復(位於隊列頭指針之前),則將它拋棄;若新結點與待擴展的結點重復(位於隊列頭指針之後),則比較兩個結點的估價函數中g的大小,保留較小g值的結點。跳至第五步。
4)如果擴展出的新結點與隊列中的結點不重復,則按照它的估價函數f大小將它插入隊列中的頭結點後待擴展結點的適當位置,使它們按從小到大的順序排列,最後更新隊列尾指針。
5)如果隊列頭的結點還可以擴展,直接返回第二步。否則將隊列頭指針指向下一結點,再返回第二步。
4.八數碼問題的A*演算法的估價函數
估價函數中,主要是計算h,對於不同的問題,h有不同的含義。那麼在八數碼問題中,h的含意是各什麼?八數碼問題的一個狀態實際上是數字0~8的一個排列,用一個數組p[9]來存儲它,數組中每個元素的下標,就是該數在排列中的位置。例如,在一個狀態中,p[3]=7,則數字7的位置是3。如果目標狀態數字3的位置是8,那麼數字7對目標狀態的偏移距離就是3,因為它要移動3步才可以回到目標狀態的位置。
八數碼問題中,每個數字可以有9個不同的位置,因此,在任意狀態中的每個數字和目標狀態中同一數字的相對距離就有9*9種,可以先將這些相對距離算出來,用一個矩陣存儲,這樣只要知道兩個狀態中同一個數字的位置,就可查出它們的相對距離,也就是該數字的偏移距離:
0 1 2 3 4 5 6 7 8
0 0 1 2 1 2 3 2 3 4
1 1 0 1 2 1 2 3 2 3
2 2 1 0 3 2 1 4 3 2
3 1 2 3 0 1 2 1 2 3
4 2 1 2 1 0 1 2 1 2
5 3 2 1 2 1 0 3 2 1
6 2 3 4 1 2 3 0 1 2
7 3 2 3 2 1 2 1 0 1
8 4 3 2 3 2 1 2 1 0
例如在一個狀態中,數字8的位置是3,在另一狀態中位置是7,那麼從矩陣的3行7列可找到2,它就是8在兩個狀態中的偏移距離。
估價函數中的h就是全體數字偏移距離之和。顯然,要計算兩個不同狀態中同一數字的偏移距離,需要知道該數字在每個狀態中的位置,這就要對數組p[9]進行掃描。由於狀態發生變化,個數字的位置也要變化,所以每次計算h都沿線掃描數組,以確定每個數字在數組中的位置。為了簡化計算,這里用一個數組存儲狀態中各個數字的位置,並讓它在狀態改變時隨著變化,這樣就不必在每次計算h時,再去掃描狀態數組。
例如,某個狀態中,數字5的位置是8,如果用數組r[9]存儲位置,那麼就有r[5]=8。
現在用數組r[9]存儲當前狀態的數字位置,而用s[9]存儲目標狀態的數字位置,那麼當前狀態數字i對目標狀態的偏移距離就是矩陣中r[i]行s[i]列對應的值。
5.A*演算法的類結構
A*演算法的類聲明如下:
class TAstar:public TEight
{
public:
TAstar(){} //構造函數
TAstar(char *fname); //帶參數構造函數
virtual void Search(); //A*搜索法
private:
int f,g,h; //估價函數
int r[Num]; //存儲狀態中各個數字位置的輔助數組
static int s[Num]; //存儲目標狀態中各個數字位置的輔助數組
static int e[]; //存儲各個數字相對距離的輔助數組
void Printl(TList<TAstar> L); //成員函數,輸出搜索路徑
int Expend(int i); //成員函數,A*演算法的狀態擴展函數
int Calcuf(); //成員函數,計算估價函數
void Sort(TList<TAstar>& L,int k); //成員函數,將新擴展結點按f從小到大順序插入待擴展結點隊列
int Repeat(TList<TAstar> &L); //成員函數,檢查結點是否重復
};

int TAstar::s[Num],TAstar::e[Num*Num];

TAstar::TAstar(char *fname):TEight(fname)
{
for(int i=0;i<Num;)
{
r[p[i]]=i; //存儲初始狀態個個數字的位置
s[q[i]]=i++; //存儲目標狀態個個數字的位置
}
ifstream fin;
fin.open("eight_dis.txt",ios::in); //打開數據文件
if(!fin)
{
cout<<"不能打開數據文件!"<<endl;
return;
}
for(int i=0;i<Num*Num;i++) //讀入各個數字相對距離值
fin>>e[i];
fin.close();
f=g=h=0; //估價函數初始值
}

void TAstar::Printl(TList<TAstar> L)
{
TAstar T=*this;
if(T.last==-1) return;
else
{
T=L.GetData(T.last);
T.Printl(L);
T.Printf();
}
}

int TAstar::Expend(int i)
{
if(Extend(i)) //結點可擴展
{
int temp=r[p[r[0]]]; //改變狀態後數字位置變化,存儲改變後的位置
r[p[r[0]]]=r[0];
r[0]=temp;
return 1;
}
return 0;
}

int TAstar::Calcuf()
{
h=0;
for(int i=0;i<Num;i++) //計算估價函數的 h
h+=e[Num*r[i]+s[i]];
return ++g+h;
}

void TAstar::Sort(TList<TAstar>& L,int k)
{
int n=L.Getlen();
int i;
for(i=k+1;i<n;i++)
{
TAstar T=L.GetData(i);
if(this->f<=T.f)
break;
}
L.Insert(*this,i);
}

int TAstar::Repeat(TList<TAstar> &L)
{
int n=L.Getlen();
int i;
for(i=0;i<n;i++)
if(L.GetData(i)==*this)
break;
return i;
}

void TAstar::Search()
{
TAstar T=*this; //初始結點
T.f=T.Calcuf(); //初始結點的估價函數
TList<TAstar> L; //建立隊列
L.Append(T); //初始結點入隊
int head=0,tail=0; //隊列頭和尾指針
while(head<=tail) //隊列不空則循環
{
for(int i=0;i<4;i++) //空格可能移動方向
{
T=L.GetData(head); //去隊列頭結點
if(T.h==0) //是目標結點
{
T.Printl(L);//輸出搜索路徑
T.Printf(); //輸出目標狀態
return; //結束
}
if(T.Expend(i)) //若結點可擴展
{
int k=T.Repeat(L); //返回與已擴展結點重復的序號
if(k<head) //如果是不能擴展的結點
continue; //丟棄
T.last=head; //不是不能擴展的結點,記錄父結點
T.f=T.Calcuf(); //計算f
if(k<=tail) //新結點與可擴展結點重復
{
TAstar Temp=L.GetData(k);
if(Temp.g>T.g) //比較兩結點g值
L.SetData(T,k); //保留g值小的
continue;
}
T.Sort(L,head) ; //新結點插入可擴展結點隊列
tail++; //隊列尾指針後移
}
}
head++; //一個結點不能再擴展,隊列頭指針指向下一結點
}
}

六、測試程序
A*演算法的測試:
int main()
{
TAstar aStar("eight.txt");
aStar.Search();
system("pauze");
return 0;
}
eight.txt文件中的數據(初始態和目標態):
一共三行,第一行是用空格隔開的九個數字0~8,這是初始狀態。第二行是一個數字,空格(數字0)的位置,第三行也是用空格隔開的九個數字0~8,這是目標狀態。

8 3 5 1 2 7 4 6 0
8
1 2 3 4 5 6 7 8 0

eight_dis.txt中的數據(估計函數使用)
0 1 2 1 2 3 2 3 4
1 0 1 2 1 2 3 2 3
2 1 0 3 2 1 4 3 2
1 2 3 0 1 2 1 2 3
2 1 2 1 0 1 2 1 2
3 2 1 2 1 0 3 2 1
2 3 4 1 2 3 0 1 2
3 2 3 2 1 2 1 0 1
4 3 2 3 2 1 2 1 0

eight_Result.txt中的結果(運行後得到的結果)

七、演算法運行結果
1.BFS演算法只能適用於到達目標結點步數較少的情況,如果步數超過15步,運行時間太長,實際上不再起作用。
2.對於隨機生成的同一個可解狀態,BFS演算法最慢,DBFS演算法較慢,A*演算法較快。但在15步以內,DBFS演算法與A*演算法相差時間不大,超過15步後,隨步數增加,A*演算法的優勢就逐漸明顯,A*演算法要比DBFS演算法快5倍以上,並隨步數增大而增大。到25步以上,DBFS同樣因運行時間過長而失去價值。
3.一般來說,解答的移動步數每增加1,程序運行時間就要增加5倍以上。由於八數碼問題本身的特點,需要檢查的節點隨步數增大呈指數形式增加,即使用A*演算法,也難解決移動步數更多的問題。

八、問題可解性
八數碼問題的一個狀態實際上是0~9的一個排列,對於任意給定的初始狀態和目標,不一定有解,也就是說從初始狀態不一定能到達目標狀態。因為排列有奇排列和偶排列兩類,從奇排列不能轉化成偶排列或相反。
如果一個數字0~8的隨機排列871526340,用F(X)表示數字X前面比它小的數的個數,全部數字的F(X)之和為Y=∑(F(X)),如果Y為奇數則稱原數字的排列是奇排列,如果Y為偶數則稱原數字的排列是偶排列。
例如871526340這個排列的
Y=0+0+0+1+1+3+2+3+0=10
10是偶數,所以他偶排列。871625340
Y=0+0+0+1+1+2+2+3+0=9
9是奇數,所以他奇排列。
因此,可以在運行程序前檢查初始狀態和目標狀態的窘是否相同,相同則問題可解,應當能搜索到路徑。否則無解。

PS:整理自網路

⑽ 象棋對弈軟體是如何編制出來的

呵呵,開始我也覺得沒有破綻,後來發現了軟體也會出昏招。原來原理很簡單,只是把基本的開局定式以及常見的對弈拆解局面轉換成資料庫函數,當出現資料庫招數,便調出同類型的宏功能。說到底,只是電腦軟體做到了更多的對弈棋局收集,把相關的招數進行了數碼匯編。比如:仙人指路開局,軟體就會自動把存儲在資料庫中的符合這一定式類型的所有函數自動調出,選擇基本應招(根據用戶選手游戲難度不同,軟體也會選擇相應招數致勝比率和復雜程度)。所以按一般局面和軟體玩,就等於和一個熟讀兵法的謀士作戰,很難贏。你會有看不透,想不到的時候,軟體按步就班,資料庫就是它的眼睛和腦袋。但是編制軟體的並不是一流大師,他們手頭上有的都是找得到的棋局,但是棋盤千變萬化,有很多招式不可能存在軟體中,所以軟體也會碰到出昏招的時候。我們可以做一個小實驗,兩台電腦玩相同的象棋游戲,如果以A電腦進行先手,B電腦進行後手,以B電腦的招式來和A電腦下。百分之九十九的機率是和棋。如果我們用自己的方式操作B電腦和A電腦進行至中局(有一方有多子優勢),然後再讓兩台電腦自己下,肯定有一台電腦是輸的。你就會發現輸的電腦下的棋局很一般,因為它還是在以應對的形式開展,試問沒有優勢的情況下,那台資料庫一樣的電腦軟體會出現奇招嘛?也就是說軟體也是會輸的。我記得國際象棋那個深藍也輸給過卡斯帕羅夫,然後那個更深的藍贏了卡斯帕羅夫。還是贏在數據採集啊。

閱讀全文

與ate數據演算法相關的資料

熱點內容
梁箍筋未標注加密區 瀏覽:627
自家網路連不上上面顯示加密 瀏覽:386
編譯後無法運行圖片 瀏覽:592
linux系統修改文件命令 瀏覽:702
iphone如何安裝中國石化app 瀏覽:176
app怎麼寫簡歷 瀏覽:680
金蝶kis雲app怎麼樣 瀏覽:708
cad命令xr 瀏覽:295
f如何設置ftp伺服器 瀏覽:833
編程題兔子生兔子python 瀏覽:421
加密數字卡專利申請 瀏覽:783
我的世界命令方塊該怎麼拿 瀏覽:785
浙江容錯伺服器廠家雲空間 瀏覽:196
linuxpython3idle 瀏覽:741
程序員成就感從哪來 瀏覽:547
游資抄底源碼公式 瀏覽:804
用VF命令 瀏覽:950
解壓速度14m 瀏覽:332
php獲取httpheader 瀏覽:301
什麼軟體可以修改pdf文件 瀏覽:869