我必须创建一个程序,来模拟粒子之间的能量交换,让我解释一下:我必须创建一个1000个粒子的列表,每个粒子 开始的能量= 5个量子,然后我必须随机选择2个粒子(P1和P2)交换一个量子能量(E1-1和E2 + 1),这将是交换,我必须进行交换直到达到boltzmann分布。SWI-PROLOG中的循环
请记住,粒子不能与自己交换能量,并且粒子不能具有量子能量。
%创建一个列表(粒子/能量)[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 ,能量交换(L2,L3)。做第二次交换等等......
我应该怎样做1000次重复energygexchange而不计算失败(当Ex = 1时)?
您应该调用可能在代码中尽早失败的谓词:例如,如果Ex不大于1,那么`Ex> 1`可能会失败 - 所以把它放在`选择(L1,Px/Ex)`之后,否则你会做所有下面的列表操作! `Ey2`一样。另外,我不确定你的列表中的选择是否真的是随机的,因为你的`add`谓词将总是在你列表的最后插入改变的粒子 - 因此,再次选择一个已经改变的粒子的机会可能会低于选择任何其他粒子的机会。 – 2011-01-31 02:53:05