私は、粒子間のエネルギー交換をシミュレートするために、プログラムを作成する必要があります 私は説明しましょう:私は1000粒子の各粒子のリストを作成しなければなりません エネルギー= 5量子で始まり、無作為に2つの粒子 (P1とP2)を1つの量子エネルギー(E1-1とE2 + 1)を交換するために選択すると、これは1 の交換になります、私はboltzmannの分配に達するまで交換をしなければなりません。SWI-PROLOGのループ
パーティクルはエネルギーをそれ自身と交換できないことを覚えておいてください。 パーティクルはエネルギー量が1キロバイトありません。
%リスト(パーティクル/エネルギー)[1/5,2/5,3/5 ... 1000/5]を作成します。
粒子の間のエネルギーのfrom_to2(P1, P1000, List) :-
bagof(N/5, between(P1,P1000,N), List),!.
from_to2(_,_,[]).
%所1量子:E1 + 1、E2-1
energexchange(L1,L2):-
choose(L1,Px/Ex),
delete(Px/Ex,L1,Listsem1),
choose(Listsem1,Py/Ey),
delete(Py/Ey,Listsem1,Listsem2),
Ex > 1, Ex2 is Ex - 1, add(Px/Ex2,Listsem2,Listcom1),
Ey2 is Ey + 1, add(Py/Ey2,Listcom1,L2).
例: -from_to2(1,1000、L)、energexchange(L、L2 )。 L2 = [3/4,1/6,2/5,4/5,5/5 ... 1000/5]
L2は次の交換でL2を使用する必要があります、energexchange(L2、L3)。 2回目の交換など...
失敗回数をカウントせずにenergexchangeを1000回繰り返すにはどうすればよいですか?
コード内で可能な限り早く失敗する可能性のある述語を呼び出す必要があります。 Exが1より大きい場合、 'Ex> 1'が失敗する可能性があります。' choose(L1、Px/Ex) 'の直後に置いてください。そうしないと、以下のリスト操作をすべて静脈で行います! 'Ey2'と同じです。また、あなたの 'add'述語が常にあなたのリストの最後に変更された粒子を挿入するので、リストからの選択が本当にランダムであるかどうかはわかりません - したがって、すでに変更されたパーティクルを再度選択する機会おそらく他のパーティクルを選択するチャンスよりも低いでしょう。 –