You selected sea2.pl
title:-
T=['The secretary problem and the optimal stopping rule '
,'% file: sea2.pl'
,'% created: 14-19 Dec 2002.(by Kenryo INDO @ Kanto Gakuen University) '
,'% revised: 2 July 2004. '
,'% main: go/0. '
,'% reference: '
,'% [1] Y.S. Chow, S.Moriguti, H.Robins, and S.M. Samuels (1964). '
,'% Optimal selection based on relative rank (the "secretary problem"). Israel Journal of Mathematics 2:81-90.'
,'% [2] 森口繁一(1984).「海辺の美女の問題」所収『数学100の問題』日本評論社. p.39.'
],forall(member(C,T),(nl,write(C))).
/*
% 問題の説明:連続して提示される有限n 個の選択対象について、好みの順序(全部でn!とおり)が
等確率で発生する。しかしどの選好順序が発生したのか、選ぶ方は事前に知らない。実際に、
一つずつ、後戻りせず取り出して、採否を判断する。最後のn回まできたてしまったら必ず採択し
なければならないとする。この問題に対する最適停止ルールは、各回kについて、期待順位Ckと
留保順位Skが求まり、これを用いて途中までのサンプル列{X1,...,Xk}におけるXkの相対的順位yk
が留保順位Sk以下ならば採択、さもなくば探索を続けるというもの(上記文献[1,2]を参照)。
ちなみに文献[2]のBASICプログラムは13行である。
*/
% Expected Rank
%--------------------------------
% C: expected rank.
% K: time.
% S: reservation level.
% B: coefficient for update expected_rank.
steps(20).
expected_rank(N0,[C],[S]):-
steps(N),
N0 is N - 1,
C is (N + 1) / 2,
reservation(N0,C,S).
expected_rank(K,[C|[C1|C0]],[S|[S1|S0]]):-
expected_rank(K1,[C1|C0],[S1|S0]),
((K1 =< 0; var(K1); var(C1))->!,fail;true),
K is K1 - 1,
steps(N),
B is (N + 1) / (K1 + 1) * (S1 + 1) / 2 - C1,
C is C1 + B * S1 / K1,
reservation(K,C,S).
reservation(K,C,S):-
% S: reservation level.
\+ (var(K); var(C)),
steps(N),
N1 is N + 1,
K1 is K + 1,
S is integer( C * K1 / N1 - 0.5).
%-----------------------------------
% Stopping Rule
%-----------------------------------
% S: reservation levels.
% C: expected ranks.
sea(accept(P),(time(H),exp(C),rsrv(S),data(Q),rel_rank(R)),Mode):-
member(Mode,[prety,random]),
steps(N),
rank(Q,N,Mode),
stopping_rule(S,N,H,P,Q,R,C).
stopping_rule(S,N,H,P,Q,R,C):-
expected_rank(1,C1,S1),
append(C1,[N],Cr),
append(S1,[N],Sr),
reverse(Cr,C),
reverse(Sr,S),
accept(N,H,Q,S,R,P).
accept(0,[],[],[],[],init).
accept(T,[T0|H],[O|W],[S|U],[Y|R],P):-
relative_rank(O,[O|W],Y),
accept(T0,H,W,U,R,Q),
T is T0 + 1,
accept_rule(T,Q,Y,S,P).
relative_rank(_A,[],0).
relative_rank(O,[W|E],Y):-
relative_rank(O,E,Y1),
(W =< O -> Y is Y1 + 1; Y is Y1).
accept_rule(_,Q,_Y,_S,P):-
Q = accept(_,_,_),
!,
P = Q.
accept_rule(T,_Q,Y,S,P):-
Y =< S,
!,
P = accept(time(T),reservation(S),relative_rank(Y)).
accept_rule(N,_Q,_Y,_S,P):-
P = pass(N).
%--------------------------------
% a script program
%--------------------------------
go:-
sea(A,(time(H),exp(B),rsrv(C),data(D),rel_rank(E)),random),nl,
wln,
forall(nth1(K,H,T0),
(
nl,
nth1(K,B,B1),
nth1(K,C,C1),nth1(K,D,D1),nth1(K,E,E1),
tab(5),
T is T0 + 1,
write((time(T),exp(B1),rsv(C1),sampl(D1),r_rank(E1))),
(C1 >= E1 -> write(' *') ;true)
)
),
wln,
nl,tab(5),write(A).
wln:-
nl,
tab(5),
write('-----------------------------------------------').
ask_steps:-
write('How many goods ?'),
read(N1),
set_steps(N1).
set_steps(N1):-
abolish(steps,1),
assert(steps(N1)).
% rank /1 and ordering /3
%--------------------------------
rank(O,N,prety):-steps(N),nlist(L1,N),ordering(O,L1,prety).
rank(O,N,random):-steps(N),nlist(L1,N),ordering(O,L1,random).
nlist(L,N):-
length(L1,N),bagof(K,L1^nth1(K,L1,K),L).
ordering(X,A,Type):-
length(A,N),
length(X1,N),
nlist(B1,N),
ordering(X1,B,A,Type),
sort(B,B1),
reverse(X1,X).
ordering([],[],_A,_).
ordering([X|Y],[K|B],A,prety):-
\+ var(A),
ordering(Y,B,A,prety),
\+ (stop_ordering(A,Y),!,fail),
subtract(A,Y,Z),
member(X, Z),
nth1(K,A,X).
ordering([X|Y],[K|B],A,random):-
\+ var(A),
ordering(Y,B,A,random),
\+ (stop_ordering(A,Y),!,fail),
subtract(A,Y,Z),
sampling(A,K,Z,X),
nth1(K,A,X).
stop_ordering(A,Y):-sort(A,N),sort(Y,N).
sampling(A,K,Z,X):-
Z\=[],
length(Z,Nz),
K1 is random(Nz),write(K1),
Kz is K1 + 1,
nth1(Kz,Z,X),
nth1(K,A,X).
:-title,nl,write('go?'),read(y),go.
%end
return to front page.