gurobipy代码

一、上层建模的gurobipy的初步版本


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) <= 2 for i in V1, "constr_z_sum_leq_2")  
  
# 关系约束  
m.addConstrs(y_P[i, t] + y_D[i, t] + M * (1 - z[i, t]) > 0 for 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]的可能值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值