def solve_model(S, I, R, P): s = newSolver('Staff Scheduling', True) nbS, nbI, nbSets, nbPairs = len(S), len(I), len(R), len(P) nbC, nbT = S[-1][1] + 1, 1 + max(e[2] for e in S) x = [[s.IntVar(0, 1, '') for _ in range(nbS)] for _ in range(nbI)] z=[[[s.IntVar(0,1,'') for _ in range(len(P[p][1]))] \ for p in range(nbPairs)] for _ in range(nbI)] for j in range(nbS): k_out_of_n(s, 1, [x[i][j] for i in range(nbI)], '<=') for i in range(nbI): s.Add(sum(x[i][j] for j in range(nbS)) >= I[i][1][0]) s.Add(sum(x[i][j] for j in range(nbS)) <= I[i][1][1]) for t in range(nbT): k_out_of_n(s, 1, [x[i][j] for j in range(nbS) if S[j][2] == t], '<=') WC=sum(x[i][j] * I[i][2][c] for i in range(nbI) \ for j in range(nbS) for c in range(nbC) if S[j][1] == c) WR=sum(I[i][3][r] * sum(x[i][j] for j in R[r][1]) \ for r in range(nbSets) for i in range(nbI)) for i in range(nbI): for p in range(nbPairs): if I[i][4][p] != 0: for k in range(len(P[p][1])): xip1k0, xip1k1 = x[i][P[p][1][k][0]], x[i][P[p][1][k][1]] reify(s, [1, 1], [xip1k0, xip1k1], 2, z[i][p][k], '>=') WP = sum(z[i][p][k]*I[i][4][p] for i in range(nbI) \ for p in range(nbPairs) for k in range(len(P[p][1])) \ if I[i][4][p] != 0) s.Maximize(WC + WR + WP) rc, xs = s.Solve(), ss_ret(x, z, nbI, nbSets, nbS, nbPairs, I, S, R, P) return rc, SolVal(x), xs, ObjVal(s)
def solve_maxrook(n): s = newSolver('Maxrook',True) x = [[s.IntVar(0,1,'') for _ in range(n)] for _ in range(n)] for i in range(n): k_out_of_n(s,1,get_row(x,i),'<=') k_out_of_n(s,1,get_column(x,i),'<=') Count = s.Sum(x[i][j] for i in range(n) for j in range(n)) s.Maximize(Count) rc = s.Solve() xx = [[[' ','R'][int(SolVal(x[i][j]))] for j in range(n)] for i in range(n) ] return rc,xx
def solve_maxrook(n): s = newSolver('Maxrook', True) x = [[s.IntVar(0, 1, '') for _ in range(n)] for _ in range(n)] for i in range(n): k_out_of_n(s, 1, get_row(x, i), '<=') k_out_of_n(s, 1, get_column(x, i), '<=') Count = s.Sum(x[i][j] for i in range(n) for j in range(n)) s.Maximize(Count) rc = s.Solve() xx = [[[' ', 'R'][int(SolVal(x[i][j]))] for j in range(n)] for i in range(n)] return rc, xx
def solve_lady_or_tiger(): s = newSolver('Lady or tider', True) Rooms = range(1,10) R = [None]+[newIntVar(s,0,2) for _ in Rooms] S = [None]+[s.IntVar(0,1,'') for _ in Rooms] i_empty,i_lady,i_tiger = 1,2,3 k_out_of_n(s,1,[R[i][i_lady] for i in Rooms]) for i in Rooms: reify_force(s,[1],[R[i][i_tiger]],0,S[i],'<=') reify_raise(s,[1],[R[i][i_lady]],1,S[i],'>=') reify(s,[1]*5,[R[i][i_lady] for i in range(1,10,2)],1,S[1],'>=') reify(s,[1],[R[2][i_empty]],1,S[2],'>=') reify(s,[1,-1],[S[5],S[7]],0,S[3],'>=') reify(s,[1],[S[1]],0,S[4],'<=') reify(s,[1,1],[S[2],S[4]],1,S[5],'>=') reify(s,[1],[S[3]],0,S[6],'<=') reify(s,[1],[R[1][i_lady]],0,S[7],'<=') reify(s,[1,1],[R[8][i_tiger],R[9][i_empty]],2,S[8],'>=') reify(s,[1,-1],[R[9][i_tiger],S[6]],1,S[9],'>=') rc = s.Solve() return rc,[SolVal(S[i]) for i in Rooms],[SolVal(R[i]) for i in Rooms]
def solve_lady_or_tiger(): s = newSolver('Lady or tider', True) Rooms = range(1, 10) R = [None] + [newIntVar(s, 0, 2) for _ in Rooms] S = [None] + [s.IntVar(0, 1, '') for _ in Rooms] i_empty, i_lady, i_tiger = 1, 2, 3 k_out_of_n(s, 1, [R[i][i_lady] for i in Rooms]) for i in Rooms: reify_force(s, [1], [R[i][i_tiger]], 0, S[i], '<=') reify_raise(s, [1], [R[i][i_lady]], 1, S[i], '>=') reify(s, [1] * 5, [R[i][i_lady] for i in range(1, 10, 2)], 1, S[1], '>=') reify(s, [1], [R[2][i_empty]], 1, S[2], '>=') reify(s, [1, -1], [S[5], S[7]], 0, S[3], '>=') reify(s, [1], [S[1]], 0, S[4], '<=') reify(s, [1, 1], [S[2], S[4]], 1, S[5], '>=') reify(s, [1], [S[3]], 0, S[6], '<=') reify(s, [1], [R[1][i_lady]], 0, S[7], '<=') reify(s, [1, 1], [R[8][i_tiger], R[9][i_empty]], 2, S[8], '>=') reify(s, [1, -1], [R[9][i_tiger], S[6]], 1, S[9], '>=') rc = s.Solve() return rc, [SolVal(S[i]) for i in Rooms], [SolVal(R[i]) for i in Rooms]
def solve_maxpiece(n,piece): s = newSolver('Maxpiece',True) x = [[s.IntVar(0,1,'') for _ in range(n)] for _ in range(n)] for i in range(n): if piece in ['R' ,'Q']: k_out_of_n(s,1,get_row(x,i),'<=') k_out_of_n(s,1,get_column(x,i),'<=') if piece in ['B', 'Q']: for j in range(n): if i in [0,n-1] or j in [0,n-1]: k_out_of_n(s,1,get_ne(x,i,j,n),'<=') k_out_of_n(s,1,get_se(x,i,j,n),'<=') Count = s.Sum(x[i][j] for i in range(n) for j in range(n)) s.Maximize(Count) rc = s.Solve() xx = [[[' ',piece][int(SolVal(x[i][j]))] for j in range(n)] for i in range(n) ] return rc,xx
def solve_maxpiece(n, piece): s = newSolver('Maxpiece', True) x = [[s.IntVar(0, 1, '') for _ in range(n)] for _ in range(n)] for i in range(n): if piece in ['R', 'Q']: k_out_of_n(s, 1, get_row(x, i), '<=') k_out_of_n(s, 1, get_column(x, i), '<=') if piece in ['B', 'Q']: for j in range(n): if i in [0, n - 1] or j in [0, n - 1]: k_out_of_n(s, 1, get_ne(x, i, j, n), '<=') k_out_of_n(s, 1, get_se(x, i, j, n), '<=') Count = s.Sum(x[i][j] for i in range(n) for j in range(n)) s.Maximize(Count) rc = s.Solve() xx = [[[' ', piece][int(SolVal(x[i][j]))] for j in range(n)] for i in range(n)] return rc, xx