> Help5 := proc() print(` IsNE(G,a1,a2), NE(G), BestTot(G) , BetterForBoth(G,a1,a2), RG(a,b,K) `); end proc; > BetterForBoth := proc(G, a1, a2) local b1, b2, S; S := {}; for b1 to nops(G) do for b2 to nops(G[1]) do if G[a1][a2][1] < G[b1][b2][1] and G[a1][a2][2] < G[b1][b2][2] then S := S union {[b1, b2]}; end if; end do; end do; S; end proc; > BestTot := proc(G) local a1, a2, S, rec; S := {[1, 1]}; rec := G[1][1][1] + G[1][1][2]; for a1 to nops(G) do for a2 to nops(G[1]) do if rec < G[a1][a2][1] + G[a1][a2][2] then S := {[a1, a2]}; rec := G[a1][a2][1] + G[a1][a2][2]; elif G[a1][a2][1] + G[a1][a2][2] = rec then S := S union {[a1, a2]}; end if; end do; end do; S, rec; end proc; > IsNE := proc(G, a1, a2) member(a1, BR1(G, a2)) and member(a2, BR2(G, a1)); end proc; > NE := proc(G) local a1, a2, S; S := {}; for a1 to nops(G) do for a2 to nops(G[1]) do if IsNE(G, a1, a2) then S := S union {[a1, a2]}; end if; end do; end do; S; end proc; > RG := proc(a, b, K) local ra, i, j; ra := rand(0 .. K); [seq([seq([ra(), ra()], j = 1 .. b)], i = 1 .. a)]; end proc; > Help4 := proc() print(` FP(F), BR12(G), BR21(G) `); end proc; > FP := proc(L) local S, i; S := {}; for i to nops(L) do if L[i] = i then S := S union {i}; end if; end do; S; end proc; > BR12 := proc(G) local L1, L2, a1; L1 := BR1dv(G); L2 := BR2dv(G); [seq(L1[L2[a1]], a1 = 1 .. nops(L2))]; end proc; > BR21 := proc(G) local L1, L2, a2; L1 := BR1dv(G); L2 := BR2dv(G); [seq(L2[L1[a2]], a2 = 1 .. nops(L1))]; end proc; > Help3 := proc() print(`RandDisGame(a,b), BR1d(G,a2), BR2d(G,a1), BR1dv(G), BR2dv(G), DynRC(G), DynCR(G) `); end proc; > with(combinat); > RandDisGame := proc(a, b) local pi1, pi2, i1, j1; pi1 := randperm(b*a); pi2 := randperm(b*a); [seq([seq([pi1[b*i1 + j1], pi2[b*i1 + j1]], j1 = 1 .. b)], i1 = 0 .. a - 1)]; end proc; > BR1d := proc(G, a2) local a1; max[index]([seq(G[a1][a2][1], a1 = 1 .. nops(G))]); end proc; > BR2d := proc(G, a1) local a2; max[index]([seq(G[a1][a2][2], a2 = 1 .. nops(G[a1]))]); end proc; > BR1dv := proc(G) local a2; [seq(BR1d(G, a2), a2 = 1 .. nops(G[1]))]; end proc; > BR2dv := proc(G) local a1; [seq(BR2d(G, a1), a1 = 1 .. nops(G))]; end proc; > DynRC := proc(G) local L, i, iBest, jBest; L := BR2dv(G); iBest := max[index]([seq(G[i][L[i]][1], i = 1 .. nops(G))]); jBest := L[iBest]; [iBest, jBest], G[iBest][jBest]; end proc; > DynCR := proc(G) local L, j, iBest, jBest; L := BR1dv(G); jBest := max[index]([seq(G[L[j]][j][2], j = 1 .. nops(L))]); iBest := L[jBest]; [iBest, jBest], G[iBest][jBest]; end proc; > Help2 := proc() print(` GameDB(), Rand2PlayerGame(a,b,K), IsStictDom(v1,v2), FindR(G), FindC(G), ShrinkGame(G), ReducedGame(G) , MyMaxIndex(L), LoadedCoin(p), BR1(G,a2), BR2(G,a1), BR1v(G), BR2v(G) `); end proc; > GameDB := proc() [[[[[-1, -1], [-9, 0]], [[0, -9], [-6, -6]]], [Mum, Fink], [Mum, Fink]], [[[[2, 1], [0, 0]], [[0, 0], [1, 2]]], [Box, Opera], [Box, Opera]], [[[[-1, 1], [1, -1]], [[1, -1], [-1, 1]]], [Odd, Even], [Odd, Even]], [[[[1, 0], [1, 2], [0, 1]], [[0, 3], [0, 1], [2, 0]]], [Up, Down], [Left, Middle, Right]], [[[[0, 4], [4, 0], [5, 3]], [[4, 0], [0, 4], [5, 3]], [[3, 5], [3, 5], [6, 6]]], [T, M, B], [L, C, R]], [[[[0, 0], [-1, 1], [1, -1]], [[1, -1], [0, 0], [-1, 1]], [[-1, 1], [1, -1], [0, 0]]], [Scissors, Rock, Paper], [Scissors, Rock, Paper]]]; end proc; > PrintGame := proc(G) local i; matrix([[" ", op(G[3])], seq([G[2][i], op(G[1][i])], i = 1 .. nops(G[2]))]); end proc; > Rand2PlayerGame := proc(a, b, K) local ra, i, j; ra := rand(0 .. K); [[seq([seq([ra(), ra()], j = 1 .. b)], i = 1 .. a)], [seq(i, i = 1 .. a)], [seq(j, j = 1 .. b)]]; end proc; > IsStrictDom := proc(v1, v2) local i; for i to nops(v1) do if v2[i] <= v1[i] then RETURN(false); end if; end do; true; end proc; > FindR := proc(G) local G1, RowS, i1, i2, j, v1, v2; G1 := G[1]; RowS := G[2]; for i1 to nops(RowS) do for i2 from i1 + 1 to nops(RowS) do v1 := [seq(G1[i1][j][1], j = 1 .. nops(G1[i1]))]; v2 := [seq(G1[i2][j][1], j = 1 .. nops(G1[i2]))]; if IsStrictDom(v1, v2) then RETURN(i1); elif IsStrictDom(v2, v1) then RETURN(i2); end if; end do; end do; FAIL; end proc; > FindC := proc(G) local G1, ColS, j1, j2, i, v1, v2; G1 := G[1]; ColS := G[3]; for j1 to nops(ColS) do for j2 from j1 + 1 to nops(ColS) do v1 := [seq(G1[i][j1][2], i = 1 .. nops(G1))]; v2 := [seq(G1[i][j2][2], i = 1 .. nops(G1))]; if IsStrictDom(v1, v2) then RETURN(j1); elif IsStrictDom(v2, v1) then RETURN(j2); end if; end do; end do; FAIL; end proc; > ShrinkGame := proc(G) local i, j, G1, RowS, ColS, i1; G1 := G[1]; RowS := G[2]; ColS := G[3]; i := FindR(G); if i <> FAIL then RETURN([[op(1 .. i - 1, G1), op(i + 1 .. nops(G1), G1)], [op(1 .. i - 1, RowS), op(i + 1 .. nops(RowS), RowS)], ColS]); end if; j := FindC(G); if j <> FAIL then RETURN([[seq([op(1 .. j - 1, G1[i1]), op(j + 1 .. nops(G1[i1]), G1[i1])], i1 = 1 .. nops(G1))], RowS, [op(1 .. j - 1, ColS), op(j + 1 .. nops(ColS), ColS)]]); end if; FAIL; end proc; > ReducedGame := proc(G) local G1, G2; G1 := G; G2 := ShrinkGame(G1); while G2 <> FAIL do G1 := G2; G2 := ShrinkGame(G1); end do; G1; end proc; > MyMaxIndex := proc(L) local i, m, S; m := max(L); S := {}; for i to nops(L) do if L[i] = m then S := S union {i}; end if; end do; S; end proc; > BR1 := proc(G, a2) local a1; MyMaxIndex([seq(G[a1][a2][1], a1 = 1 .. nops(G))]); end proc; > BR2 := proc(G, a1) local a2; MyMaxIndex([seq(G[a1][a2][2], a2 = 1 .. nops(G[a1]))]); end proc; > BR1v := proc(G) local a2; [seq(BR1(G, a2), a2 = 1 .. nops(G[1]))]; end proc; > BR2v := proc(G) local a1; [seq(BR2(G, a1), a1 = 1 .. nops(G))]; end proc; > LoadedCoin := proc(p) local m, n, ra; m := numer(p); n := denom(p); ra := rand(1 .. n)(); if ra <= m then 1; else 2; end if; end proc; > NULL; > IsNash := proc(G, a1, a2) RETURN(member(a1, BR1(G, a2)) and member(a2, BR2(G, a1))); end proc; > PureNashEqui := proc(G) local i, j, S; S := {}; for i to nops(G) do for j to nops(G[1]) do if IsNash(G, i, j) then S := S union {[i, j]}; end if; end do; end do; S; end proc; > with(combinat); > AllGames := proc(a, b) local p1, p2, i1, j1, i2, L, i; p1 := permute(b*a); p2 := permute(b*a); L := []; for i to (b*a)! do L := [op(L), op([seq([seq([seq([p1[i2][b*i1 + j1], p2[i][b*i1 + j1]], j1 = 1 .. b)], i1 = 0 .. a - 1)], i2 = 1 .. (b*a)!)])]; end do; L; end proc; > G := RG(30, 30, 10000); > PureNashEqui(G); {} ; > BestTot(G); {[6, 18]}, 18956 ; > NULL; > G2 := RG(30, 30, 10000); > PureNashEqui(G2); {[7, 28]} ; > BestTot(G2); {[29, 26]}, 19310 ; > BetterForBoth(G2, 7, 28); {} ; > NULL; > G3 := RG(30, 30, 10000); > PureNashEqui(G3); {[1, 12], [26, 29]} ; > BestTot(G3); {[26, 29]}, 19881 ; > BetterForBoth(G3, 1, 12); {[26, 29]} ; > NULL; > BeatNE := proc(a, b) local i, S, T; T := AllGames(a, b); S := {}; for i to nops(T) do if nops(PureNashEqui(T[i])) = 1 then if 0 < nops(BetterForBoth(T[i], PureNashEqui(T[i])[1][1], PureNashEqui(T[i])[1][2])) then S := S union {T[i]}; end if; end if; end do; S; end proc; > EstBeatNE := proc(a, b, K, M) local i, j, G, S; S := [0, 0, 0]; for i to M do G := RG(a, b, K); if nops(PureNashEqui(G)) = 1 then S[1] := S[1] + 1; if G[PureNashEqui(G)[1][1]][PureNashEqui(G)[1][2]][1] + G[PureNashEqui(G)[1][1]][PureNashEqui(G)[1][2]][2] < BestTot(G)[1][1][1] + BestTot(G)[1][1][2] then S[2] := S[2] + 1; end if; if 0 < nops(BetterForBoth(G, PureNashEqui(G)[1][1], PureNashEqui(G)[1][2]) minus PureNashEqui(G)) then S[3] := S[3] + 1; end if; end if; end do; S[1] := evalf(S[1]/K); S[2] := evalf(S[2]/K); S[3] := evalf(S[3]/K); S; end proc; > BeatNE(2, 2); {[[[1, 1], [3, 2]], [[4, 3], [2, 4]]], [[[1, 1], [3, 4]], [[2, 3], [4, 2]]], [[[1, 2], [3, 4]], [[2, 3], [4, 1]]], [[[1, 3], [3, 4]], [[2, 2], [4, 1]]], [[[1, 4], [3, 3]], [[2, 2], [4, 1]]], [[[1, 4], [4, 3]], [[2, 2], [3, 1]]], [[[1, 4], [4, 3]], [[3, 2], [2, 1]]], [[[2, 1], [3, 2]], [[4, 3], [1, 4]]], [[[2, 2], [3, 1]], [[1, 4], [4, 3]]], [[[2, 2], [4, 1]], [[1, 3], [3, 4]]], [[[2, 2], [4, 1]], [[1, 4], [3, 3]]], [[[2, 3], [4, 1]], [[1, 2], [3, 4]]], [[[2, 3], [4, 2]], [[1, 1], [3, 4]]], [[[2, 4], [4, 3]], [[3, 2], [1, 1]]], [[[3, 1], [2, 2]], [[4, 3], [1, 4]]], [[[3, 2], [1, 1]], [[2, 4], [4, 3]]], [[[3, 2], [2, 1]], [[1, 4], [4, 3]]], [[[3, 3], [1, 4]], [[4, 1], [2, 2]]], [[[3, 4], [1, 1]], [[4, 2], [2, 3]]], [[[3, 4], [1, 2]], [[4, 1], [2, 3]]], [[[3, 4], [1, 3]], [[4, 1], [2, 2]]], [[[4, 1], [2, 2]], [[3, 3], [1, 4]]], [[[4, 1], [2, 2]], [[3, 4], [1, 3]]], [[[4, 1], [2, 3]], [[3, 4], [1, 2]]], [[[4, 2], [2, 3]], [[3, 4], [1, 1]]], [[[4, 3], [1, 4]], [[2, 1], [3, 2]]], [[[4, 3], [1, 4]], [[3, 1], [2, 2]]], [[[4, 3], [2, 4]], [[1, 1], [3, 2]]]} ; > BeatNE(2, 3); [Length of output exceeds limit of 1000000] ; > EstBeatNE(10, 10, 1000, 1000); [0.4130000000, 0., 0.1100000000] ; > EstBeatNE(10, 10, 1000, 1000); [0.3850000000, 0., 0.08600000000] ; > EstBeatNE(10, 10, 1000, 1000); [0.3990000000, 0., 0.09500000000] ; > EstBeatNE(10, 10, 1000, 1000); [0.3730000000, 0., 0.08400000000] ; > EstBeatNE(10, 10, 1000, 1000); [0.4130000000, 0., 0.1020000000] ; > u1 := q1*(1 - q1 - q2)^d1; d1 u1 := q1 (1 - q1 - q2) ; > u2 := q2*(1 - q1 - q2)^d2; d2 u2 := q2 (1 - q1 - q2) ; > assume(0 < d1 and d1 < 1); > assume(0 < d2 and d2 < 1); > L := diff(u1, q1); d1 d1 q1 (1 - q1 - q2) d1 L := (1 - q1 - q2) - --------------------- 1 - q1 - q2 ; > L2 := diff(u2, q2); d2 d2 q2 (1 - q1 - q2) d2 L2 := (1 - q1 - q2) - --------------------- 1 - q1 - q2 ; > t := solve(L = 0, q1); q2 - 1 - ------ d1 + 1 ; > r := solve(L2 = 0, q2); q1 - 1 - ------ d2 + 1 ; > solve({q1 = -(q2 - 1)/(d1 + 1), q2 = -(q1 - 1)/(d2 + 1)}, {q1, q2}); / d2 d1 \ { q1 = ---------------, q2 = --------------- } \ d1 d2 + d1 + d2 d1 d2 + d1 + d2/ ; > with(plots); [animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, densityplot, display, dualaxisplot, fieldplot, fieldplot3d, gradplot, gradplot3d, implicitplot, implicitplot3d, inequal, interactive, interactiveparams, intersectplot, listcontplot, listcontplot3d, listdensityplot, listplot, listplot3d, loglogplot, logplot, matrixplot, multiple, odeplot, pareto, plotcompare, pointplot, pointplot3d, polarplot, polygonplot, polygonplot3d, polyhedra_supported, polyhedraplot, rootlocus, semilogplot, setcolors, setoptions, setoptions3d, shadebetween, spacecurve, sparsematrixplot, surfdata, textplot, textplot3d, tubeplot] ; > profit1 := (a - p1 + bp2)*(p1 - c); > profit2 := (a - p2 + bp1)*(p2 - c); profit1 := (a - p1 + bp2) (p1 - c) profit2 := (a - p2 + bp1) (p2 - c) ; > P1 := diff(profit1, p1); P1 := -2 p1 + c + a + bp2 ; > P2 := diff(profit2, p2); P2 := -2 p2 + c + a + bp1 ; > solve(P1 = 0, p1); 1 1 1 - c + - a + - bp2 2 2 2 ; > solve(P2 = 0, p2); 1 1 1 - c + - a + - bp1 2 2 2 ; > solve({p1 = c/2 + a/2 + b*p2/2, p2 = c/2 + a/2 + b*p1/2}, {p1, p2}); / a + c a + c\ { p1 = - -----, p2 = - ----- } \ b - 2 b - 2/ ; > profit1ex := (1 - p1 + p2)(p1 - 1); > profit2ex := (1 - p2 + p1)(p2 - 1); profit1ex := 1 - p1(p1 - 1) + p2(p1 - 1) profit2ex := 1 - p2(p2 - 1) + p1(p2 - 1) ; > plot([profit1, profit1]); Warning, expecting only range variable p1 in expression 1-p1(p1-1)+p2(p1-1) to be plotted but found name p2 ; > NULL;