P1038 神經網路(60)

2022-06-20 06:06:10 字數 3584 閱讀 7403

ps:我真的是無語了,敲了兩個半小時結果還只有60分qwq

覺得自己的思路好像沒什麼bug,但是程式輸出就是有幾個點w掉t掉(好像時間複雜度也不是很高?)

難過嚶嚶嚶(╥╯^╰╥)

好啦,回歸正題,來講一下我的思路以及我的艱難踩雷過程....

人工神經網路(artificial neural network)是一種新興的具有自我學習能力的計算系統,在模式識別、函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗這個神經網路模型的實用性。

在蘭蘭的模型中,神經網路就是一張有向圖,圖中的節點稱為神經元,而且兩個神經元之間至多有一條邊相連,下圖是乙個神經元的例子:

神經元〔編號為111)

圖中,x1x3​是資訊輸入渠道,y1y2  ​是資訊輸出渠道,c1表示神經元目前的狀態,ui ​是閾值,可視為神經元的乙個內在引數。

神經元按一定的順序排列,構成整個神經網路。在蘭蘭的模型之中,神經網路中的神經元分為幾層;稱為輸入層、輸出層,和若干個中間層。每層神經元只向下一層的神經元輸出資訊,只從上一層神經元接受資訊。下圖是乙個簡單的三層神經網路的例子。

蘭蘭規定,cic_ici​服從公式:(其中nnn是網路中所有神經元的數目)

ci=∑(j,i)∈ewjicj−uic_i=\sum\limits_ w_c_-u_ci​=(j,i)∈e∑​wji​cj​−ui​

公式中的wjiw_wji​(可能為負值)表示連線jjj號神經元和iii號神經元的邊的權值。當 cic_ici​大於000時,該神經元處於興奮狀態,否則就處於平靜狀態。當神經元處於興奮狀態時,下一秒它會向其他神經元傳送訊號,訊號的強度為cic_ici​。

如此.在輸入層神經元被激發之後,整個網路系統就在資訊傳輸的推動下進行運作。現在,給定乙個神經網路,及當前輸入層神經元的狀態(cic_ici​),要求你的程式運算出最後網路輸出層的狀態。

輸入檔案第一行是兩個整數n(1≤n≤100)n(1 \le n \le 100)n(1≤n≤100)和ppp。接下來nnn行,每行222個整數,第i+1i+1i+1行是神經元iii最初狀態和其閾值(uiu_iui​),非輸入層的神經元開始時狀態必然為000。再下面ppp行,每行由222個整數i,ji,ji,j及111個整數wijw_wij​,表示連線神經元i,ji,ji,j的邊權值為wijw_wij​。

輸出檔案包含若干行,每行有222個整數,分別對應乙個神經元的編號,及其最後的狀態,222個整數間以空格分隔。僅輸出最後狀態大於0的輸出層神經元狀態,並且按照編號由小到大順序輸出。

若輸出層的神經元最後狀態均為 000,則輸出 「null」。

輸入 #1

5 6

1 01 0

0 10 1

0 11 3 1

1 4 1

1 5 1

2 3 1

2 4 1

2 5 1

輸出 #1

3 1

4 15 1

其實根據題意我們很快就可以發現這道題好像只要模擬一下就可以(所以題解中的拓撲?什麼鬼?),我們發現,其實原式可以改寫成

$c[i]+u[i]=\sum\limits_}*c[j]

所以我們一開始不需要管u的值,只需要在迴圈結束時直接減去u即可。

核心**,兩層for迴圈判斷鄰接表中是否存在與當前節點相連的節點,然後直接將wi和cj相乘即可,最後把所有的滿足條件的點加起來,就是當前節點的c值(好像是在把公式翻譯了一遍....)

但是注意:這裡其實有乙個坑點(莫問偶是咋知道滴),題目中要求輸入層神經元的c必須為1,但是上面的演算法卻是更改c值的!所以我們要加一層特判,來避免失誤

#includeusing

namespace

std;

struct

noed ;

struct

n ;int chu[102

];int ru[102

];n a[

102];

int w[102][102

];int

n,m;

int ans[102

];bool vis[102

];int fa[102][102

];int num[102

];int

main()

for(int i=1; i<=m; i++)

for(int i=1; i<=n; i++)

}if(!ans) a[i].c -=a[i].u ;//坑點啊,所以記得加特判

if(a[i].c <=0) vis[a[i].c ]=1

;//還是坑點,意思是,如果這個節點已經沒法走了,那麼它接下來的節點自然也無法利用它的c值,所以我們這裡的vis判斷這個節點的c值是否還可以用

}/*for(int i=1; i<=n; i++) cout

memset(vis,

1,sizeof

(vis));

for(int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

}bool p=0

;

for(int i=1; i<=n; i++)

}if(!p) cout<

null

"<

return0;

}/*4 31 0

0 10 1

0 11 2 2

2 3 2

3 4 2

*//*

1.沒有特判最後的c可能<=0的情況

2.一開始的找c值寫掛了

3.也不知道為什麼好好的常量a[3].c在程式執行過程中為啥會變值

(沒有判斷輸入源的值不可更改,必須為1)

*/

總結:1.敲完題之後一定一定一定一定一定要!造資料!!!!在平時練習中就要養成這個習慣!!!!!必須!!!!!!

2.認真讀題,等你把題敲完之後再去回看一遍題目(然後你會發現你漏掉了許多題目限制)(*^▽^*)『』

3.思考縝密一點,(當然這可能要在長期的做題刷題中鍛鍊了扶額),盡量思考得全面一點,在你動手敲**之前多造幾組資料找找感覺,多造幾種特殊資料看一看(比如圖論裡面的特殊資料就是鏈啊,樹啊,有環圖啊等等)

但是總的來說還是很開心的(雖然第一次提交只得了20分,雖然浪費了三個測試點之後還是只有60分)

但畢竟!!!這是你憑自己的力量做出來的啊!!!!

加油ヾ(◍°∇°◍)ノ゙!!!!

----------------end----------------

P1038 神經網路

n 一張神經網路可以看做乙個dag dagda g,它由三種層組成 輸入層,傳輸層,輸出層 輸入層 初始c i 0c i 0 ci 0的層 輸出層 沒有出邊的層 傳輸層 輸入層和輸出層相對於整張圖的補層 規定傳輸時要減去閾值u iu i ui 求輸出層經過傳輸後仍然滿足c i 0c i 0 ci 0...

P1038 神經網路

直接用拓撲排序,套用題目給的公式就行了。include include include include include include include include include include include include include using namespace std define...

P1038 神經網路

人工神經網路 artificial neural network 是一種新興的具有自我學習能力的計算系統,在模式識別 函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗這個神經網...