from gurobipy import Model, GRB
# 创建模型
m = Model("bike_sharing_optimization")# 假设我们有一些预定义的参数和集合 # 例如:V1 是站点的集合,T 是时间段的集合,Q_min 是车辆的最小上限,c_i 是站点i的bike的数目上限 # 这里需要您根据实际情况定义这些参数
V1 =[...]# 站点集合
T =[...]# 时间段集合
Q_min =...# 车辆的最小上限
c_i_dict ={...}# 字典,键为站点i,值为对应的c_i # 定义决策变量 # 字典形式,键为(i, t),值为对应的变量
y_P = m.addVars(V1, T, vtype=GRB.INTEGER, name="y_P")
y_D = m.addVars(V1, T, vtype=GRB.INTEGER, name="y_D")
z = m.addVars(V1, T, vtype=GRB.BINARY, name="z")
s = m.addVars(V1, T, vtype=GRB.INTEGER, name="s")# 设置目标函数
m.setObjective(sum(z[i, t]* f(s[i, t])for i in V1 for t in T), GRB.MINIMIZE)# 添加约束 # 每个时间段的站点的取货/送货任务目标应该小于车辆的最小上限
m.addConstrs((y_P[i, t]< Q_min for i in V1 for t in T),"constr_y_P_less_Q_min")
m.addConstrs((y_D[i, t]< Q_min for i in V1 for t in T),"constr_y_D_less_Q_min")# 取货量不能超过当前时间段节点的存储量
m.addConstrs(y_P[i, t]<= s[i, t]for i in V1 for t in T,"constr_y_P_leq_s")# 卸载量不能超过当前时间段节点的剩余容量
m.addConstrs(y_D[i, t]<= c_i_dict[i]- s[i, t]for i in V1 for t in T,"constr_y_D_leq_capacity")# 站点的存储量随着时间的变化状态
m.addConstrs(s[i, t +1]== s[i, t]+ z[i, t]*(y_D[i, t]- y_P[i, t])for i in V1 for t in T[:-1],"constr_s_dynamics")# 每个站点的目标任务至多两次
m.addConstrs(sum(z[i, t]for t in T)<=2for i in V1,"constr_z_sum_leq_2")# 关系约束
m.addConstrs(y_P[i, t]+ y_D[i, t]+ M *(1- z[i, t])>0for i in V1 for t in T,"constr_relation_1")# 注意:z[i, t] * y_P[i, t] * z[i, t]^D = 0 这个约束在Gurobi中可能难以直接表达,因为它包含非线性项。 # 通常,这种约束需要转化为线性形式。在这个例子中,我们可以使用大M方法来近似表示这个约束, # 但请注意这只是一个近似,可能不总是产生精确解。 # 下面是一个简化的近似方法,它可能不完全等同于原约束,但可以作为起点: # 假设我们有一个足够大的数M_approx,使得当z[i, t]为0时,M_approx * z[i, t]会远大于y_P[i, t]和y_D[i, t]的可能值