【问题标题】:VRP heterogeneous site-dependencyVRP异构站点依赖
【发布时间】:2019-06-04 23:07:21
【问题描述】:

在我的代码中,我设法实现了不同的车辆类型(我认为)并指出了站点依赖性。但是,在我的优化输出中,车辆似乎可以行驶不止一条路线。我想实现我的车辆,一旦它返回到站点(节点 0),分配一辆新车辆执行另一条路线。你能帮我解决这个问题吗? :)

我正在使用 Docplex 求解器在 Python Jupyter notebook 上运行

all_units = [0,1,2,3,4,5,6,7,8,9]
ucp_raw_unit_data = {
    "customer": all_units,
    "loc_x": [40,45,45,42,42,42,40,40,38,38],
    "loc_y" : [50,68,70,66,68,65,69,66,68,70],
   "demand": [0,10,30,10,10,10,20,20,20,10],
    "req_vehicle":[[0,1,2], [0], [0], [0],[0], [0], [0], [0], [0], [0]],
    }

df_units = DataFrame(ucp_raw_unit_data, index=all_units)

# Display the 'df_units' Data Frame
df_units

Q = 50
N = list(df_units.customer[1:])
V = [0] + N
k = 15
# n.o. vehicles
K = range(1,k+1)
# vehicle 1 = type 1 vehicle 6 = type 2 and vehicle 11 = type 0
vehicle_types = {1:[1],2:[1],3:[1],4:[1],5:[2],6:[2],7:[2],8:[2],9: 
[2],10:[2],11:[0],12:[0],13:[0],14:[0],15:[0]}
lf = 0.5
R = range(1,11)

# Create arcs and costs
A = [(i,j,k,r) for i in V for j in V for k in K for r in R if i!=j]
Y = [(k,r) for k in K for r in R]
c = {(i,j):np.hypot(df_units.loc_x[i]-df_units.loc_x[j], 
df_units.loc_y[i]-df_units.loc_y[j]) for i,j,k,r in A}

from docplex.mp.model import Model
import docplex

mdl = Model('SDCVRP')

# decision variables
x = mdl.binary_var_dict(A, name = 'x')
u = mdl.continuous_var_dict(df_units.customer, ub = Q, name = 'u')
y = mdl.binary_var_dict(Y, name = 'y')
# objective function
mdl.minimize(mdl.sum(c[i,j]*x[i,j,k,r] for i,j,k,r in A))

#constraint 1 each node only visited once
mdl.add_constraints(mdl.sum(x[i,j,k,r] for k in K for r in R for j in V 
if j != i and vehicle_types[k][0] in df_units.req_vehicle[j]) == 1 for i 
in N)
##contraint 2 each node only exited once
mdl.add_constraints(mdl.sum(x[i,j,k, r] for k in K for r in R for i in V 
if i != j and vehicle_types[k][0] in df_units.req_vehicle[j]) == 1 for j 
in N )

##constraint 3 -- Vehicle type constraint (site-dependency)
mdl.add_constraints(mdl.sum(x[i,j,k,r] for k in K for r in R for i in V 
if i != j and vehicle_types[k][0] not in 
df_units.req_vehicle[j]) == 0 for j in N)

#Correcte constraint 4 -- Flow constraint
mdl.add_constraints((mdl.sum(x[i, j, k,r] for j in V if j != i)  - 
                mdl.sum(x[j, i, k,r] for j in V if i != j)) == 0 for i in 
N for k in K for r in R)

#constraint 5 -- Cumulative load of visited nodes
mdl.add_indicator_constraints([mdl.indicator_constraint(x[i,j,k,r],u[i] + 
df_units.demand[j]==u[j]) for i,j,k,r in A if i!=0 and j!=0])

## constraint 6 -- one vehicle to one route
mdl.add_constraints(mdl.sum(y[k,r] for r in R) <= 1 for k in K)
mdl.add_indicator_constraints([mdl.indicator_constraint(x[i,j,k,r],y[k,r] 
== 1) for i,j,k,r in A if i!=0 and j!=0])

##constraint 7 -- cumulative load must be equal or higher than demand in 
this node
mdl.add_constraints(u[i] >=df_units.demand[i] for i in N)

##constraint 8 minimum load factor 
mdl.add_indicator_constraints([mdl.indicator_constraint(x[j,0,k,r],u[j] 
>= lf*Q) for j in N for k in K for r in R if j != 0])

mdl.parameters.timelimit = 15
solution = mdl.solve(log_output=True)

print(solution)

我希望每条路线都会被另一辆车访问,但是相同的车辆会执行多条路线。另外,现在计算了访问节点的累积负载,我想为路线上的车辆使用这个,以便可以执行最后一个约束(最小负载因子)。

【问题讨论】:

    标签: python jupyter-notebook docplex


    【解决方案1】:

    我知道 K 指数用于车辆,R 用于路线。我运行了你的代码并得到了以下任务:

    y_11_9=1
    y_12_4=1
    y_13_7=1
    y_14_10=1
    y_15_10=1
    

    这似乎表明许多车辆共享同一条路线。 sum(y[k,r] for r in R)

    如果我添加对称约束,即限制分配车辆到路线1(同一路线上没有两辆车),通过:

    mdl.add_constraints(mdl.sum(y[k, r] for r in R) <= 1 for k in K)
    mdl.add_constraints(mdl.sum(y[k, r] for k in K) <= 1 for r in R)
    

    我得到了一个成本相同的解决方案,并且只分配了三个车辆路线:

    y_11_3=1
    y_12_7=1
    y_15_9=1
    

    不过,我认为最好的解决方案是增加一些使用车辆的成本因素,并将其引入最终目标。这也可能会减少问题的对称性。

    菲利普。

    【讨论】:

    • 亲爱的菲利普,感谢您的回复。这正是我需要的约束。但是,我在模型中添加了对称约束,但这并没有给我三个路线。这是你唯一改变的吗?提前致谢!
    • 亲爱的菲利普,再次感谢您的回复。我想我以稍微不同的方式管理它,我尝试了你的建议,但不幸的是它没有按预期工作。但是,我还有一个问题:对于 10 个和 25 个客户的实例,我得到的结果的最优性差距非常高(>60%)。如果我运行它更长的时间(比如说 30 分钟),它仍然很高(>30%)你对如何改进我的模型以更快地解决它有什么建议吗?提前非常感谢。亲切的问候
    • 亲爱的 Anne-Fleur,我检查了,是的,我只添加了“每条路线一辆车”的限制。这应该可以避免您报告的最初问题。不过,这个问题有很多对称性,尤其是在车辆上:如果两辆车的类型相同,使用其中一种不会改变成本。如果您可以假设车辆只有一种类型,我会尝试一种稍微不同的方法。如果车队(车辆类型)有 F 辆车,我会声明当 f 的范围为 1..F 时,必须在车辆 之前使用车辆 ,以打破车辆的对称性。恕我直言,这值得一试
    • 亲爱的菲利普,感谢您的回复。您能否添加一些代码来实现上述de(我必须对我的代码进行哪些调整才能做到这一点?)我希望你能帮助我。非常感谢。
    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 2013-10-03
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多