*2010年6月17日編集
私は自分のコードを改善する方法を理解しようとしています(よりPythonicにします)。また、生化学で一般的なシナリオを説明する、より直感的な「条件文」を書くことに興味があります。以下のプログラムの条件付き基準は、回答#2で説明しましたが、コードに満足していません。正常に機能しますが、明確ではなく、より複雑な条件付きシナリオに実装するのは簡単ではありません。アイデアは大歓迎です。コメント/批評を歓迎します。最初の投稿体験@stackoverflow-必要に応じてエチケットについてコメントしてください。
このコードは、次の演習の解決策となる値のリストを生成します。
「選択したプログラミング言語で、GillespieのFirst Reaction Algorithmを実装して、反応A ---> Bの時間的動作を研究します。この場合、AからBへの遷移は、別の化合物Cが存在する場合にのみ発生します。ここで、以下のペトリネットでモデル化されているように、Cは動的にDと相互変換します。100分子のA、1のCがあり、反応の開始時にBまたはDが存在しないと仮定します。kABを0.1s-1に設定します。 kCDとkDCの両方を1.0秒に-1。100秒以上のシステムの動作をシミュレートします。」
def sim():
# Set the rate constants for all transitions
kAB = 0.1
kCD = 1.0
kDC = 1.0
# Set up the initial state
A = 100
B = 0
C = 1
D = 0
# Set the start and end times
t = 0.0
tEnd = 100.0
print "Time\t", "Transition\t", "A\t", "B\t", "C\t", "D"
# Compute the first interval
transition, interval = transitionData(A, B, C, D, kAB, kCD, kDC)
# Loop until the end time is exceded or no transition can fire any more
while t <= tEnd and transition >= 0:
print t, '\t', transition, '\t', A, '\t', B, '\t', C, '\t', D
t += interval
if transition == 0:
A -= 1
B += 1
if transition == 1:
C -= 1
D += 1
if transition == 2:
C += 1
D -= 1
transition, interval = transitionData(A, B, C, D, kAB, kCD, kDC)
def transitionData(A, B, C, D, kAB, kCD, kDC):
""" Returns nTransition, the number of the firing transition (0: A->B,
1: C->D, 2: D->C), and interval, the interval between the time of
the previous transition and that of the current one. """
RAB = kAB * A * C
RCD = kCD * C
RDC = kDC * D
dt = [-1.0, -1.0, -1.0]
if RAB > 0.0:
dt[0] = -math.log(1.0 - random.random())/RAB
if RCD > 0.0:
dt[1] = -math.log(1.0 - random.random())/RCD
if RDC > 0.0:
dt[2] = -math.log(1.0 - random.random())/RDC
interval = 1e36
transition = -1
for n in range(len(dt)):
if dt[n] > 0.0 and dt[n] < interval:
interval = dt[n]
transition = n
return transition, interval
if __name__ == '__main__':
sim()