def weight(self, Q: "int") -> "Real":
     memlen = min(Q, max(self.v)) + 1
     mem = [0] * memlen
     for q in range(1, Q + 1):
         mem[q % memlen] = min((mem[(q - self.v[i]) % memlen] + self.w[i]
                                for i in range(self.n) if self.v[i] <= q),
                               ifempty=infinity)
     return mem[Q % memlen]  #]class
Example #2
0
 def some_to_some_distance(self, G: "acyclic IDigraph<T>", d: "T, T -> R", 
         I: "SizedIterableContainer<T>", F: "SizedIterableContainer<T>") -> "R": 
     D = self.createMap(G.V)
     for v in G.V: D[v] = infinity
     for s in I: D[s] = 0
     for _ in range(len(G.V)-1):
         for v in G.V:
             D[v] = min(D[v], min((D[u] + d(u,v) for u in G.preds(v)), ifempty=infinity))
     return min(D[t] for t in F) #]bellmanford
Example #3
0
 def distance(self, G: "Digraph<T>", d: "T, T -> R", I: "ISet<T>",
              F: "ISet<T>", k: "int") -> "R":
     D = self.createMap(G.V, k)
     for v in G.V:
         D[v, 0] = infinity
     for s in I:
         D[s, 0] = 0
     for i in range(1, k + 1):
         for v in G.V:
             D[v, i] = min((D[u, i - 1] + d(u, v) for u in G.preds(v)),
                           ifempty=infinity)
     return min(D[t, k] for t in F)  #]kedges
 def weight(self, Q):
     L = self.createMap()
     for q in range(1, Q + 1):
         L[q, 0] = infinity
     L[0, 0] = 0
     for n in range(1, self.n + 1):
         for q in range(Q + 1):
             L[q, n] = min(
                 (L[q - i * self.v[n - 1], n - 1] + i * self.w[n - 1]
                  for i in range(
                      min(q // self.v[n - 1] + 1, self.m[n - 1] + 1))),
                 ifempty=infinity)
     return L[Q, self.n]  #]class
Example #5
0
 def distance(self, G: "Digraph<T>", d: "T, T -> R", I: "ISet<T>",
              F: "ISet<T>", k: "int") -> "R":
     prev, curr = self.createMap(G.V), self.createMap(G.V)
     for v in G.V:
         curr[v] = infinity
     for s in I:
         curr[s] = 0
     for _ in range(1, k + 1):
         prev, curr = curr, prev
         for v in G.V:
             curr[v] = min((prev[u] + d(u, v) for u in G.preds(v)),
                           ifempty=infinity)
     return min(curr[t] for t in F)  #]kedges2
Example #6
0
 def some_to_some_distance(self, G: "acyclic IDigraph<T>", d: "T, T -> R", 
         I: "SizedIterableContainer<T>", F: "SizedIterableContainer<T>") -> "R": 
     mindist = infinity
     mem = self.createMap(G.V)
     left = len(F)
     for v in self.createTopsorter(G).topsorted(G):
         if left == 0: break
         mem[v] = min(0 if v in I else infinity, 
                      min((mem[u] + d(u,v) for u in G.preds(v)), ifempty=infinity))
         if v in F:
             if mem[v] < mindist: mindist = mem[v]
             left -= 1
     return mindist #]iter
 def L(q):
     if q == 0: return 0
     for i in range(self.n):
         if self.v[i] <= q and q - self.v[i] not in mem:
             mem[q - self.v[i]] = L(q - self.v[i])
     return min((mem[q - self.v[i]] + self.w[i]
                 for i in range(self.n) if self.v[i] <= q),
                ifempty=infinity)
 def weight(self, Q: "int") -> "Real":
     current = [0] + [infinity] * Q
     previous = [None] * (Q + 1)
     for n in range(1, self.n + 1):
         previous, current = current, previous
         for q in range(Q + 1):
             current[q] = min((previous[q-i*self.v[n-1]] + i*self.w[n-1] \
                                       for i in range(q//self.v[n-1]+1)), ifempty=infinity)
     return current[Q]  #]class
Example #9
0
 def __init__(self, s=None, v=None, G=None, w=None):
     _StateBase.__init__(self, s, sample(G.V, 1)[0] if v == None else v) 
     if s == None: self.known = 0
     else: self.known = s.known + w(s.v, v)
     unvisited = set(G.V) - self.visited()
     departures = unvisited.union([v]) if v != None else unvisited
     arrivals = unvisited.union([self.head()])
     unknown = sum(min((w(u,v_prime) for v_prime in G.succs(u) if v_prime in arrivals), ifempty=infinity)\
                    for u in departures)
     self.score = self.known + unknown
Example #10
0
    def some_to_some_distance(self, G: "acyclic IDigraph<T>", d: "T, T -> R",
                              I: "SizedIterableContainer<T>",
                              F: "SizedIterableContainer<T>") -> "R":
        def D(v):
            init = 0 if v in I else infinity
            return min(
                init,
                min((D(u) + d(u, v) for u in G.preds(v)), ifempty=infinity))

        return min(D(v) for v in F)  #]recdag
Example #11
0
 def some_to_some_distance(self, G: "acyclic IDigraph<T>", d: "T, T -> R",
                           I: "SizedIterableContainer<T>",
                           F: "SizedIterableContainer<T>") -> "R":
     mindist = infinity
     mem = self.createMap(G.V)
     left = len(F)
     for v in self.createTopsorter(G).topsorted(G):
         if left == 0: break
         memv = mem[v] if v in mem else infinity
         if v in I:
             memv = min(0, mem[v])
         if v in F:
             if memv < mindist: mindist = memv
             left -= 1
         if left > 0:
             del mem[v]
             for w in G.succs(v):
                 if w not in mem: mem[w] = infinity
                 mem[w] = min(mem[w], memv + d(v, w))
     return mindist  #]iter
Example #12
0
 def some_to_some_distance(self, G: "acyclic IDigraph<T>",
         d: "T, T -> R", I: "ICollection<T>", F: "ICollection<T>") -> "R": 
     mem = self.createMap(G.V)
     def D(v):
         init = 0 if v in I else infinity
         for u in G.preds(v):
             if u not in mem: mem[u] = D(u)
         return min(init, min((mem[u] + d(u,v) for u in G.preds(v)), ifempty=infinity))
     for t in F:
         if t not in mem: mem[t] = D(t)
     return min(mem[t] for t in F) #]memo
 def weight(self, Q: "int") -> "Real":
     mem = self.createMap()
     mem[0, 0] = 0
     for q in range(1, Q + 1):
         mem[q, 0] = infinity
     for n in range(1, self.n + 1):
         mem[0, n] = 0
         for q in range(1, Q + 1):
             mem[q, n] = min((mem[q-i*self.v[n-1],n-1]+i*self.w[n-1] \
                                          for i in range(q // self.v[n-1]+1)), ifempty=infinity)
     return mem[Q, self.n]  #]class
    def weight(self, Q: "int") -> "Real":
        memlen = max(self.maxmem, Q)
        mem = [None] * memlen
        mem[0] = 0
        for q in range(1, Q + 1):
            mem[q % memlen] = min((mem[(q - self.v[i]) % memlen] + self.w[i]
                                   for i in range(self.n) if self.v[i] <= q),
                                  ifempty=infinity)
        return mem[Q % memlen]  #]class


#]cl
 def L(q: "int") -> "Real":
     if q == 0: return 0
     return min((L(q - self.v[i]) + self.w[i]
                 for i in range(self.n) if self.v[i] <= q),
                ifempty=infinity)
Example #16
0
 def D(v):
     init = 0 if v in I else infinity
     for u in G.preds(v):
         if u not in mem: mem[u] = D(u)
     return min(init, min((mem[u] + d(u,v) for u in G.preds(v)), ifempty=infinity))
Example #17
0
 def __init__(self, G, w):
     TspAsBranchAndBoundProblem2.__init__(self, G, w)
     self.best_departure = dict((u, min((w(u,v) for v in G.succs(u)), ifempty=infinity))\
                                 for u in G.V)
Example #18
0
 def opt(self, a, b):
    return min(a, b)
Example #19
0
 def testMin(self):
     self.assertEqual(min(1, 2, 3, 4), 1)
     self.assertEqual(min([1]), 1)
     self.assertEqual(min([], ifempty=123), 123)
     self.assertRaises(ValueError, min, [])
 def weight(self, Q: "int") -> "Real":
     mem = [0] + [None] * Q
     for q in range(1, Q+1):
         mem[q] = min((mem[q-self.v[i]] + self.w[i] for i in range(self.n) if self.v[i] <= q), 
                         ifempty=infinity)
     return mem[Q]#]class
Example #21
0
 def D(v):
     init = 0 if v in I else infinity
     return min(
         init,
         min((D(u) + d(u, v) for u in G.preds(v)), ifempty=infinity))