Es ist immer noch nicht 100% klar, was dein Herz begehrt, aber das Thema ist ziemlich interessant.
Erstens: Das Github-Projekt, auf das Sie sich beziehen, ist nicht gut genug dokumentiert, um zu sagen, was genau es als Input erwartet und ich habe nicht genug Wissen über Markov-Prozesse, um zu sagen, dass der kontinuierliche Teil falsch ist, aber für mich macht nicht viel Sinn.
Zweitens: Die Summe einer Zeile einer Übergangsrate Matrix ist 0 für alle Markov-Prozesse, nicht nur für Geburt-Tod-Prozesse.
Das ist, wie ich einen Lauf simulieren würde:
Gegeben: der Startzustand (wahrscheinlich 0
) S
, Übergangsrate Matrix Q
(definiert über P'=PQ
), die Anzahl der Übergänge n
von Interesse.
Ausgabe: times
- Zeiten, zu denen die Übergänge aufgetreten sind, states
- die Reihe der besuchten Staaten.
Hier gehen wir mit einer wilden Mischung aus C++ und Pseudo-Code:
std::default_random_engine rnd;//ini
double current_time=0.0;
int current_state=S;
vector<doubles> times={current_time};
vector<int> states={current_state};
for (int i=0;i<n;i++){
//Part 1: simulate the time staying in current state:
double decay_rate=-Q[current_state][current_state];
if(decay_rate==0.0){
//that means we are not going anywhere anymore and staying for ever in this state:
return;
}
//we don't do error checking and expect rate to be positive, because diagonal elements of Q must be 0.0 or negative
//The current state will decay with the decay_rate, so the life time in this state until the decay is exponentially distributed with parameter decay_rate
//simulate the life time:
std::exponential_distribution<> life_time_generator(decay_rate);
double life_time=life_time_generator(rnd);
times.push_back(times.back()+life_time);
//Part2: to which state have we actually decayed?
// The probability to decay to the state new_state is proportional to transition rate Q[current_state][new_state]
//thus generate an uniformly distributed random variable [0, decay_rate] (decay_rate - sum of transition rates of all possible new states) and map it on the states:
double target_value=std::generate_canonical<double,10>(rnd)*decay_rate;
double sum=0.0;
for (int new_state=0;new_state<Q.size();new_state++){
if (new_state==current_state)//don't forget to skip the state itself
continue;
sum+=Q[current_state][new_state];
if (sum>target_value){//we found our next state!
current_state=new_state;
states.push_back(current_state);
break;
}
//there are still a some precision issues, if the sum of all transition rates is slightly under 1.0
//the issues should be handled somehow but not in this pseudo-code.
}
}
// do whatever you want with times/states
Ich hoffe, dass es etwas, das Sie im Sinn hatte.
Edit:
Als kurze Erklärung:
Für den ersten Teil - die Zeit bis zum Übergang. Der Code basiert auf der bekannten Tatsache, dass, wenn die Ankünfte Poisson mit der Rate Lambda verteilt sind, die Wartezeiten exponentiell mit dem Parameter Lambda verteilt sind. Siehe zum Beispiel here
Für den zweiten Teil - es ist nur die conditional probability: Die Übergangswahrscheinlichkeit für einen sehr kurzen Zeitraum dt
ist -Q[current_state][current_state]dt
. Diese Bedingung ist erfüllt, da wir wissen, dass der Übergang stattgefunden hat.Die Wahrscheinlichkeit, in den Zustand new_state
zu gelangen, ist Q[current_state][new_state]*dt
, aber unter der Bedingung, dass der Übergang passiert ist, ist es Q[current_state][new_state]/-Q[current_state][current_state]
- und das ist, was im zweiten Teil berechnet wird.
Versuchen Sie, einen M/M/c/k-Prozess zu simulieren oder mathematisch zu typisieren? Ersteres ist nicht zu schwer ... lassen Sie einfach eine Ereigniswarteschlange verfolgen, wenn ein Server die Verarbeitung eines Auftrags beendet und ein neuer Auftrag in der Auftragswarteschlange eintrifft. – Sneftel
Ich muss simulieren, wie im github Projekt CTMC Beispiel. Außer meiner ist M/M/c/K. Ich habe die Übergangsratenmatrix erzeugt (die Zeilensumme ist Null), aber ich bin mir nicht sicher, wie es in diesem GitHub-Beispiel simuliert wird. – Sharath
Es gibt keinen überwältigenden Grund, in Übergangsmatrizen für etwas Ähnliches zu denken, das in einfachere simultane Prozesse aufgeteilt werden kann. Haben Sie einfach einen Prozess für die Ankunft, einen pro-Server-Verarbeitungsprozess und eine Ereigniswarteschlange, um alle zu synthetisieren. – Sneftel