このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1255709298/697 
#  [1] 授業単元: 
#  アルゴリズムとプログラミング 
#  [2] 問題文(含コード&リンク): 
# 初めて呼損が起こるまでに確率できた通信回数を評価したい。 
# 次のプログラムに追加して、以下の方法で評価を行うプログラムを完成させてください。 
#  
# 1、ランダムに送受信ノードを決定する 
# 2、与えられた送受信ノード間の経路を決定する 
# (a)その経路上の全てのリンクに空き容量がある場合、それらを1Mbpsだけ減少させ、「確率できた通信回数」を1増やし、手続き1に戻る 
# (b)その経路上に空き容量のないリンクが存在する場合、呼損とし、その時点までの「確率できた通信回数」を記録して手続き3に進む。 
# 3、全リンクの空き容量を初期状態に戻し、手続き1に戻る 
# 4、1〜3の手続きを1000回行い、「初めて呼損が起こるまでに確立できた通信回数」の平均を算出する。 


送受信ノード(a,10000).
送受信ノード(b,10000).
送受信ノード(c,10000).
送受信ノード(d,10000).
送受信ノード(e,10000).

経路(a,b).
経路(b,a).
経路(b,c).
経路(c,b).
経路(b,d).
経路(c,e).
経路(e,c).
経路(d,e).
経路(e,d).
経路(e,a).
経路(e,c).

初めて呼損が起こるまでに確率できた通信回数を評価(0,_平均値) :-
    findavg(_接続数,経路点情報(_接続数),_平均値).
初めて呼損が起こるまでに確率できた通信回数を評価(N,_平均値) :-
    ノードの総数を調べる(_ノードの総数,_ノードならび),
    ノード空き容量の初期化(_ノード空き容量ならび),
    組み合わせの総数を調べる(_ノードならび,_組み合わせの総数,_組み合わせ),
    ランダムに送受信ノードを決定する(1,1000,_ノードの総数,_ノードならび,_組み合わせ総数,_組み合わせ,_ノードの空き容量ならび,_経路情報).
初めて呼損が起こるまでに確率できた通信回数を評価(N) :-
    N1 is N -1,
    初めて呼損が起こるまでに確率できた通信回数を評価(N1,_平均値).

ランダムに送受信ノードを決定する(_接続数1,_接続数,_ノードの総数,_ノードならび,_組み合わせ総数,_組み合わせ,_ノードの空き容量ならび,[[X,Y]|R]) :-
    経路の選択(_組み合わせの総数,_組み合わせ,X,Y),
    接続(1,M,X,Y,_ノード空き容量ならび,_更新されたノード空き容量ならび),
    _接続数2 is _接続数1 + M,
    ランダムに送受信ノードを決定する(_接続数2,_接続数,_ノードの総数,_ノードならび,_組み合わせ総数,_組み合わせ,_ノードの空き容量ならび,R).

ランダムに送受信ノードを決定する(_接続数,_接続数,_ノードの総数1,_ノードならび1,_組み合わせ総数1,_組み合わせ1,_ノードの空き容量ならび1,[]) :-
    assertz(経路点情報(_接続数)),!,fail.

ランダムに送受信ノードを決定する(_ノードの総数,_ノードならび,_組み合わせ総数,_組み合わせ,_ノードの空き容量ならび,[[X,Y]|R]).

経路の選択(_組み合わせの総数,_組み合わせ,X,Y) :-
    乱数の発生(_組み合わせの総数,_乱数),
    list_nth(_乱数,_組み合わせ,[X,Y]),!.
経路の選択(_組み合わせの総数,_組み合わせ,X,Y) :-
    経路の選択(_組み合わせの総数,_組み合わせ,X,Y).

乱数の発生(_組み合わせの総数,_乱数) :-
    _乱数 is (random mod _組み合わせの総数) + 1.

ノードの総数を調べる(_ノードの総数,_ノードならび) :-
    findall(A1,送受信ノード(A1,_),_ノードならび),
    length(_ノードならび,_ノードの総数).

ノード空き容量の初期化(_ノード空き容量ならび) :-
    findall([A,B],送受信ノード(A,B),_ノード空き容量ならび),!.

組み合わせの総数を調べる(_ノードならび,_組み合わせの総数,_組み合わせ) :-
    findall(L2,組み合わせ(_ノードならび,2,L2),_組み合わせ),
    length(_組み合わせ,_組み合わせの総数).

接続(N,N,X,X,_ノード空き容量ならび,_更新されたノード空き容量ならび) :-
    容量更新(X,_ノード空き容量ならび,_ノード空き容量ならび),!.
接続(N,M,X,Y,_ノード空き容量ならび,_更新されたノード空き容量ならび) :-
    経路(X,Z),
    容量更新(X,_ノード空き容量ならび,_ノード空き容量ならび2),
    N2 is N + 1,
    接続(N2,M,Z,Y,_ノード空き容量ならび2,_更新されたノード空き容量ならび).

容量更新(X,[[X,N]|R],[[X,N1]|R]) :- N < 1000,!,fail.
容量更新(X,[[X,N]|R],[[X,N1]|R]) :- N1 is N - 1000,!.
容量更新(X,[A|R1],[A|R2]) :-
    容量更新(X,R1,R2).