程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 神經網絡 (codevs 1088) 題解,codevs1088

神經網絡 (codevs 1088) 題解,codevs1088

編輯:Delphi

神經網絡 (codevs 1088) 題解,codevs1088


【問題描述】

    人工神經網絡(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.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved