> Help16 := proc() print(`RP(n,v), inv(pi) , Cij(P,i,j), RandP(n,v), Tour(P), SV(T) `); end proc; > with(combinat); > inv := proc(pi) local T, i; for i to nops(pi) do T[pi[i]] := i; end do; [seq(T[i], i = 1 .. nops(pi))]; end proc; > RandP := proc(n, v) local i; [seq(randperm(n), i = 1 .. v)]; end proc; > RP := proc(n, v) local S, P1, p, s; option remember; S := permute(n); if v = 1 then RETURN({seq([s], s in S)}); end if; P1 := RP(n, v - 1); {seq(seq([op(p), s], s in S), p in P1)}; end proc; > Cij := proc(P, i, j) local k1, co, pi; co := 0; for k1 to nops(P) do pi := inv(P[k1]); if pi[i] < pi[j] then co := co + 1; end if; end do; co; end proc; > Tour := proc(P) local n, T, i, j; n := nops(P[1]); for i to n do T[i, i] := 0; end do; for i to n do for j from i + 1 to n do if Cij(P, j, i) < Cij(P, i, j) then T[i, j] := 1; T[j, i] := -1; else T[i, j] := -1; T[j, i] := 1; end if; end do; end do; [seq([seq(T[i, j], j = 1 .. n)], i = 1 .. n)]; end proc; > SV := proc(T) local n, S, i, j; n := nops(T); for i to n do S[i] := 0; end do; for i to n do for j from i + 1 to n do if T[i][j] = 1 then S[i] := S[i] + 1; elif T[i][j] = 0 then S[i] := S[i] + 1/2; S[j] := S[j] + 1/2; else S[j] := S[j] + 1; end if; end do; end do; [seq(S[i], i = 1 .. n)]; end proc; > IsCondorcet := proc(P) local n, v, T, i, Score; n := nops(P[1]); v := nops(P); Score := SV(Tour(P)); for i from 0 to n - 1 do T[i] := 0; end do; for i to n do T[Score[i]] := T[Score[i]] + 1; if 1 < T[Score[i]] then return true; end if; end do; return false; end proc; > ExactCond := proc(n, v) local s, S, i, co; S := RP(n, v); i := nops(S); co := 0; for s in S do if IsCondorcet(s) then co := co + 1; end if; end do; evalf(co/i); end proc; > ExactCond(3, 3); 0.05555555556 ; > EstCond := proc(n, v, K) local i, S, co; co := 0; for i to K do S := RandP(n, v); if IsCondorcet(S) then co := co + 1; end if; end do; print(" The random process yielded " + evalf(co/K)); end proc; > EstCond(3, 10, 10); " The random process yielded " ; > Borda := proc(P) local i, n, j, T, s; n := nops(P[1]); T := [0 $ n]; for s in P do for i to n do T[s[i]] := T[s[i]] + n + 1 - i; end do; end do; T; end proc; > P := RandP(3, 6); P := [[1, 2, 3], [2, 3, 1], [3, 1, 2], [2, 1, 3], [3, 1, 2], [1, 3, 2]] ; > Borda(P); [16, 7, 13] ; > CondorcetRank := proc(P) local S, F, i, T, j, Opu; S := SV(Tour(P)); F := copy(S); i := 1000000; Opu := []; while -1 < i do T := {}; i := max(F); for j to nops(P[1]) do if F[j] = i then T := T union {j}; F[j] := -1; end if; end do; Opu := [op(Opu), T]; end do; Opu; end proc; > BordaRank := proc(P) local S, F, i, T, j, Opu; S := Borda(P); i := 1000000; Opu := []; while -1 < i do T := {}; i := max(F); for j to nops(P[1]) do if F[j] = i then T := T union {j}; F[j] := -1; end if; end do; Opu := [op(Opu), T]; end do; Opu; end proc; > F[1]; 1 ; > F[1] := 1; F := [1, 0, 2] ; > F[1] := 3; F := [3, 0, 2] ; > F[1] := -1; F := [-1, 0, 2] ; > max(F); 2 ; > max[index](F); 3 ; > F; [-1, 0, 2] ; > F[2]; 0 ; > NULL; > ;