人工神經網絡(Artificial Neural Network)是一種新興的具有自我學習能力的計算系統,在模式識別、函數逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網絡的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網絡的入門書籍後,提出了一個簡化模型,他希望你能幫助他用程序檢驗這個神經網絡模型的實用性。
在蘭蘭的模型中,神經網絡就是一張有向圖,圖中的節點稱為神經元,而且兩個神經元之間至多有一條邊相連,下圖是一個神經元的例子:神經元〔編號為1)
圖中,X1—X3是信息輸入渠道,Y1-Y2是信息輸出渠道,C1表示神經元目前的狀態,Ui是阈值,可視為神經元的一個內在參數。神經元按一定的順序排列,構成整個神經網絡。在蘭蘭的模型之中,神經網絡中的神經元分為幾層;稱為輸入層、輸出層,和若干個中間層。每層神經元只向下一層的神經元輸出信息,只從上一層神經元接受信息。上圖是一個簡單的三層神經網絡的例子。蘭蘭規定,Ci服從公式:(其中n是網絡中所有神經元的數目)
公式中的Wji(可能為負值)表示連接j號神經元和 i號神經元的邊的權值。當 Ci大於0時,該神經元處於興奮狀態,否則就處於平靜狀態。當神經元處於興奮狀態時,下一秒它會向其他神經元傳送信號,信號的強度為Ci。如此.在輸入層神經元被激發之後,整個網絡系統就在信息傳輸的推動下進行運作。現在,給定一個神經網絡,及當前輸入層神經元的狀態(Ci),要求你的程序運算出最後網絡輸出層的狀態。
5 6
1 0
1 0
0 1
0 1
0 1
1 3 1
1 4 1
1 5 1
2 3 1
2 4 1
2 5 1
3 1
4 1
5 1
本題為NOIP2003提高組第一題,看了很多題解,包括官方給出的該題考查的知識點,很多都寫著拓撲排序,為什麼我沒用拓撲排序呢?(我不會告訴你們我對拓撲排序還不熟練的)其實這道題完全不需要用拓撲排序,直接一個簡單的搜索(或者叫枚舉)就夠了,不用剪枝,不用遞歸,不用回溯,直接從1開始把所有點搜一遍,然後把輸出層的點記錄下來。計算公式的時候有幾個很關鍵的地方,最後的Ui只要減一次,因為∑後面-Ui沒有打括號……被坑了一次(如果只減了一次Ui,恭喜你,得20分)……還有就是輸入層不需要減Ui(如果沒減,恭喜你,得40分),其次就是對於最後的輸出層的點如果它的C值小於0應當做0處理(如果處理了,當年的省一到手),最後一個最坑的也是最難以引人注目的但是在問題描述中擺在最起眼的位置,同時也是得滿分最關鍵的一點就是:只有Ci大於0的才會往下傳……(本人這裡沒注意少了20分)下面上程序。
1 var a:array[1..200,1..200] of longint; 2 i,j,n,p,q,w:longint; 3 f:array[1..200] of boolean; 4 c,u:array[1..200] of longint; 5 flag:boolean; 6 b:array[1..200] of longint; 7 begin 8 fillchar(f,sizeof(f),true); 9 readln(n,p); 10 for i:=1 to n do 11 readln(c[i],u[i]); 12 for i:=1 to n do 13 for j:=1 to n do 14 a[i,j]:=-maxint; 15 for i:=1 to p do 16 begin 17 read(q,w); 18 read(a[q,w]); 19 end; 20 for i:=1 to n do 21 begin 22 flag:=true; 23 for j:=1 to n do 24 if a[j,i]<>-maxint then 25 if c[j]>0 then//大於0的才會往下傳 26 begin 27 flag:=false; 28 f[j]:=false; 29 c[i]:=c[i]+a[j,i]*c[j]; 30 end; 31 if not flag then//輸出層不要-Ui,同時只要減一次Ui 32 c[i]:=c[i]-u[i]; 33 end; 34 w:=0;flag:=true; 35 for i:=1 to n do 36 if f[i] then 37 begin 38 inc(w); 39 b[w]:=i; 40 if c[i]>0 then 41 flag:=false; 42 end; 43 if flag then 44 writeln('NULL') 45 else 46 for i:=1 to w do 47 if c[b[i]]>0 then//大於0的才要輸出 48 writeln(b[i],' ',c[b[i]]); 49 end.