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)
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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]
예제 #5
0
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]
예제 #6
0
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
예제 #7
0
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