Ejemplo n.º 1
0
    def _create_model(self, city_ids, map_points):
        depot_id = city_ids[0]
        city_num = len(city_ids)
        ## prepare the index for decision variables
        # index of network flow
        cities = tuple(city_ids)

        # connecting arcs of the cities
        cityArcs = [(i, j) for i in cities for j in cities if i != j]

        ## parameters model (dictionary)
        # 1. distance map
        distances_map = self.calculate_distances(city_ids, map_points)

        ## create model
        m = Model('TSP')
        ## create decision variables
        # 1. choice of arcs between cities
        x = m.addVars(cityArcs, vtype=GRB.BINARY, name='route')
        m._x = x
        m._cities = cities
        m._cityArcs = cityArcs
        ## create objective: minimum route distance
        m.setObjective(
            quicksum([x[i, j] * distances_map[(i, j)] for (i, j) in cityArcs]),
            GRB.MINIMIZE)  # TOTRY
        ## create constraints
        # 1. Network flow
        m.addConstrs((quicksum([x[i, j] for j in cities if i != j]) == 1
                      for i in cities), 'Network flow1')
        m.addConstrs((quicksum([x[i, j] for i in cities if i != j]) == 1
                      for j in cities), 'Network flow2')
        for (i, j) in cityArcs:
            if (i, j) in init_solution:
                x[i, j].start = 1
        return m, x
Ejemplo n.º 2
0
    def __init__(self, distances, taxis, requests, timeout=None):
        self.distances = distances
        self.taxis = taxis
        self.requests = requests
        self.timeout = timeout

        model = Model('static_dispatching')
        model.params.OutputFlag = 0
        model.params.UpdateMode = 1
        model.Params.PreCrush = 1
        model.Params.LazyConstraints = 1

        T = 1000000
        n_taxis = len(taxis)
        n_requests = len(requests)
        n = n_taxis + n_requests
        t = distances
        x = []
        for i in range(n):
            u = []
            for j in range(n):
                v = model.addVar(lb=0.0, ub=1.0, vtype=GRB.BINARY)
                u.append(v)
            x.append(u)

        pick0 = []
        for i in range(n_requests):
            u = model.addVar(lb=0.0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS)
            pick0.append(u)

        # constraint (2)
        for v in range(n):
            model.addConstr(quicksum([x[u][v] for u in range(n)]), GRB.EQUAL,
                            1)

        # constraint (3)
        for u in range(n):
            model.addConstr(quicksum([x[u][v] for v in range(n)]), GRB.EQUAL,
                            1)

        # constraint (5)
        for i in range(n_requests):
            model.addConstr(
                pick0[i] -
                quicksum([(taxis[k][0] + t[taxis[k][1]][requests[i][1]]) *
                          x[k][n_taxis + i]
                          for k in range(n_taxis)]), GRB.GREATER_EQUAL, 0)

        # constraint (6)
        for i in range(n_requests):
            for j in range(n_requests):
                model.addConstr(
                    pick0[j] - pick0[i] - t[requests[i][1]][requests[i][2]] -
                    t[requests[i][2]][requests[j][1]] + T *
                    (1 - x[n_taxis + i][n_taxis + j]), GRB.GREATER_EQUAL, 0)

        # constraint (7)
        for i in range(n_requests):
            model.addConstr(pick0[i], GRB.GREATER_EQUAL, requests[i][0])

        objective = quicksum(pick0[i] - requests[i][0]
                             for i in range(n_requests))
        model.setObjective(objective, GRB.MINIMIZE)

        #model._cutfinder = Cut_Finder(n_vertices, edges)
        model._x = x
        model._pick0 = pick0
        #model._k = k
        #model._relobj = None
        #model._impcounter = 0
        #model._single_cut = single_cut

        # runtime information
        #model._root_cuttime = 0
        #model._tree_cuttime = 0

        self.model = model