मान लीजिए मेरे पास संभाव्य ग्राफ का प्रतिनिधित्व करने वाले दो सरणी हैं:

      2
     / \
1 ->     4 -> 5 -> 6 -> 7
     \ /
      3  

जहां राज्य 2 में जाने की संभावना 0.81 है और राज्य 3 में जाने की संभावना (1-0.81) = 0.19 है। मेरी सरणियाँ राज्यों के अनुमानित मूल्यों के साथ-साथ पुरस्कारों का प्रतिनिधित्व करती हैं। (नोट: सरणी की प्रत्येक अनुक्रमणिका अपनी संबंधित स्थिति का प्रतिनिधित्व करती है)

V = [0, 3, 8, 2, 1, 2, 0]
R = [0, 0, 0, 4, 1, 1, 1]

संदर्भ इतना मायने नहीं रखता है, यह सिर्फ यह बताने के लिए है कि मैं कहां से आ रहा हूं। मुझे एक के-स्टेप लुक फॉरवर्ड फ़ंक्शन लिखना होगा जहां मैं पुरस्कारों के रियायती मूल्य को जोड़ता हूं और इसे के-राज्य के अनुमानित मूल्य में जोड़ता हूं।

मैं अब तक प्रत्येक चरण के आगे देखने के लिए अलग-अलग फ़ंक्शन बनाकर ऐसा करने में सक्षम हूं। इस प्रश्न को पूछने का मेरा लक्ष्य यह पता लगाना है कि इस कोड को कैसे रिफैक्टर किया जाए ताकि मैं खुद को न दोहराऊं और मुहावरेदार जूलिया का उपयोग न करूं।

मैं जिस बारे में बात कर रहा हूं उसका एक उदाहरण यहां दिया गया है:

function E₁(R::Array{Float64,1}, V::Array{Float64, 1}, P::Float64)
    V[1] + 0.81*(R[1] + V[2]) + 0.19*(R[2] + V[3])
end

function E₂(R::Array{Float64,1}, V::Array{Float64, 1}, P::Float64)
    V[1] + 0.81*(R[1] + R[3]) + 0.19*(R[2] + R[4]) + V[4]
end

function E₃(R::Array{Float64,1}, V::Array{Float64, 1}, P::Float64)
    V[1] + 0.81*(R[1] + R[3]) + 0.19*(R[2] + R[4]) + R[5] + V[5]
end

.
.
.

इसी तरह आगे भी। ऐसा लगता है कि अगर मैं E₁() को अनदेखा कर दूं तो यह रिफैक्टर के लिए असाधारण रूप से आसान होगा। लेकिन क्योंकि मुझे दो अलग-अलग राज्यों में मूल्य अनुमान को छूट देना है, मुझे इसे के-चरणों के लिए सामान्यीकृत करने के तरीके के बारे में सोचने में परेशानी हो रही है।

मुझे लगता है कि स्पष्ट रूप से मैं एक एकल फ़ंक्शन लिख सकता हूं जो एक पूर्णांक को मान के रूप में लेता है और फिर if-statement का एक समूह उपयोग करता है लेकिन यह जूलिया की भावना में प्रतीत नहीं होता है। मैं इसे कैसे दोबारा कर सकता हूं इस पर कोई विचार? किसी तरह का बंद? आर और वी स्टोर करने के लिए एक अलग डेटा प्रकार?

1
dylanjm 15 सितंबर 2019, 01:06

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि आपके पास अनिवार्य रूप से एक अलग मार्कोव चेन है। तो मानक तरीका ग्राफ को इसके संक्रमण मैट्रिक्स के रूप में स्टोर करना होगा:

T = zeros(7,7)
T[1,2] = 0.81
T[1,3] = 0.19
T[2,4] = 1
T[3,4] = 1
T[5,4] = 1
T[5,6] = 1
T[6,7] = 1

फिर आप बाईं ओर से T' गुणा करके, प्रत्येक राज्य में समाप्त होने की संभावनाओं की गणना कर सकते हैं, एक प्रारंभिक वितरण दिया गया है (क्योंकि आमतौर पर, संक्रमण मैट्रिक्स को ट्रांसपोज़्ड रूप से परिभाषित किया जाता है):

julia> T' * [1,0,0,0,0,0,0] # starting from (1)
7-element Array{Float64,1}:
 0.0 
 0.81
 0.19
 0.0 
 0.0 
 0.0 
 0.0 

इसी तरह, k चरणों के बाद प्रत्येक राज्य में समाप्त होने की संभावना की गणना T' की शक्तियों का उपयोग करके की जा सकती है:

julia> T' * T' * [1,0,0,0,0,0,0]
7-element Array{Float64,1}:
 0.0
 0.0
 0.0
 1.0
 0.0
 0.0
 0.0

अब जब आपके पास k चरणों के बाद सभी संभावनाएं हैं, तो आप आसानी से अपेक्षाओं की गणना भी कर सकते हैं। शायद यह T को एक विरल मैट्रिक्स के रूप में परिभाषित करने का भुगतान करता है।

2
phipsgabler 15 सितंबर 2019, 10:21