Beispiel #1
0
    (40,500),
    (30,400)
    ]

nbKids=300

# Indexes

busSize=0;
busCost=1;

for b in Buses:
    print("buses with ",b[busSize]," seats cost ",b[busCost])

mdl = CpoModel(name='buses')

#decision variables
mdl.nbBus=mdl.integer_var_dict(Buses,0,1000,name="nbBus")

# Constraint
mdl.add(mdl.sum(mdl.nbBus[b]*b[busSize] for b in Buses) >= nbKids)

# Objective
mdl.minimize(mdl.sum(mdl.nbBus[b]*b[busCost] for b in Buses))

msol=mdl.solve()

# Dislay solution
for b in Buses:
    print(msol[mdl.nbBus[b]]," buses with ",b[busSize]," seats"); 
busSize = 0
busCost = 1

for b in Buses:
    print("buses with ", b[busSize], " seats cost ", b[busCost])

print()

for b in Buses:
    print("buses with ", b[busSize], " seats cost ", b[busCost])

mdl = CpoModel(name='buses')

#decision variables
mdl.nbBus = mdl.integer_var_dict(Buses, 0, maxquantity, name="nbBus")

# Constraint
mdl.add(sum(mdl.nbBus[b] * b[busSize] for b in Buses) >= nbKids)

# Objective
mdl.minimize(sum(mdl.nbBus[b] * b[busCost] for b in Buses))

msol = mdl.solve()

# Dislay solution
for b in Buses:
    print(msol[mdl.nbBus[b]], " buses with ", b[busSize], " seats")

#Add a constraint
# Number of different quantity should be less than 1
Beispiel #3
0
def LNS_VRPTW(visit_fixed, time_fixed, distance, custs, vehicles, capacity, speed, resources, service_time, time_win):
    custs_w_depot = [0] + custs + [len(custs) + 1]
    time_min = min(time_win.values(), key = lambda x: x[0])[0]
    time_max = max(time_win.values(), key = lambda x: x[1])[1]
    
    mdl = CpoModel("VRPTW")
    # decision variables
    visit = [(i,j,k) for i in custs_w_depot for j in custs_w_depot for k in vehicles]
    time = [(i, k) for i in custs for k in vehicles]
    visit_var = mdl.integer_var_dict(visit, name = "visit")
    time_var = mdl.integer_var_dict(time, name = "time")

    # add constraints
    # Range
    for key in visit_var:
        mdl.add(visit_var[key]>=0)
        mdl.add(visit_var[key]<=1)
    # route constraints
    for i in custs:
        mdl.add(mdl.sum(visit_var[(i, j, k)] for j in custs_w_depot for k in vehicles) == 1)
    # capacity
    for k in vehicles:
        mdl.add(mdl.sum(visit_var[(i, j, k)] * resources[i] for i in custs for j in custs_w_depot) <= capacity)
    # from depot
    for k in vehicles:
        mdl.add(mdl.sum(visit_var[(0, j, k)] for j in custs) == 1)
        mdl.add(mdl.sum(visit_var[(i, 0, k)] for i in custs) == 0)
    # flow
    for k in vehicles:
        for p in custs:
            mdl.add(mdl.sum(visit_var[(i, p, k)] for i in custs_w_depot) == mdl.sum(visit_var[p, j, k] for j in custs_w_depot))
    # to depot
    for k in vehicles:
       mdl.add(mdl.sum(visit_var[(i, len(custs)+1, k)] for i in custs) == 1)
       mdl.add(mdl.sum(visit_var[(len(custs)+1, j, k)] for j in custs) == 0)
    # cannot start and end from self
    for k in vehicles:
        for i in custs:
            mdl.add(visit_var[i, i, k] == 0)
    # time constraint between 2 customers
    for i in custs:
        for j in custs:
            for k in vehicles:
                mdl.add(visit_var[(i, j, k)]*(time_var[i, k] + distance[i][j]/speed - time_var[j, k]) <= 0)
    # time window constraint
    for i in custs:
        mdl.add(mdl.sum(visit_var[i, j, k] * time_var[i, k] for j in custs_w_depot for k in vehicles) >= time_win[i][0])
        mdl.add(mdl.sum(visit_var[i, j, k] * time_var[i, k] for j in custs_w_depot for k in vehicles) <= time_win[i][1])
    # time within range
    for i in custs:
        mdl.add(mdl.sum(visit_var[i, j, k] * time_var[i, k] for j in custs_w_depot for k in vehicles) >= time_min)
        mdl.add(mdl.sum(visit_var[i, j, k] * time_var[i, k] for j in custs_w_depot for k in vehicles) <= time_max)
        

    # known route
    for key in visit_fixed:
        mdl.add(visit_var[key] == visit_fixed[key])
    for key in time_fixed:
        mdl.add(time_var[key] == time_fixed[key])
        

    # add objective
    obj = mdl.minimize(mdl.sum(visit_var[(i, j, k)] * distance[i][j] for i in custs_w_depot for j in custs_w_depot for k in vehicles))
    mdl.add(obj)
    
    sol = mdl.solve(TimeLimit = 5, LogVerbosity = "Quiet", agent='local',
               execfile='/Applications/CPLEX_Studio201/cpoptimizer/bin/x86-64_osx/cpoptimizer')
    # sol = mdl.solve(TimeLimit = 5, LogVerbosity = "Verbose", agent='local',
    #            execfile='/Applications/CPLEX_Studio201/cpoptimizer/bin/x86-64_osx/cpoptimizer')
    if not sol:
        return None
    # sol.write()

    # new route info
    # distance
    distance_result = sol.get_objective_values()[0]
    if (type(distance_result) == tuple):
        distance_result = distance_result[0]
    # print("distance:", distance_result)
    # route
    routes = []
    for k in vehicles:
        # route_seq = [(i, j) for i in custs_w_depot for j in custs_w_depot \
        #     if sol.get_var_solution(visit_var[i, j, k]).get_value() != 0]
        # print("route", route_seq)
        time = [(i, sol.get_var_solution(time_var[i, k]).get_value()) for i in custs \
            if time_min <= sol.get_var_solution(time_var[i, k]).get_value() <= time_max]
        time.sort(key = lambda x: x[1])
        route = [{"id": x[0], "begin_time": x[1]} for x in time]
        routes.append(route)
    return routes, distance_result