Gurobi:最小化问题的reformulation

以一个最简单的线性规划问题为例。
min ⁡    0.02 x 1 + 0.07 x 2 + 0.04 x 3 + 0.03 x 4 + 0.05 x 5 s.t. 0.3 x 1 + 2 x 2 + x 3 + 0.6 x 4 + 1.8 x 5 > = 70 0.1 x 1 + 0.05 x 2 + 0.02 x 3 + 0.2 x 4 + 0.05 x 5 > = 3 0.05 x 1 + 0.1 x 2 + 0.02 x 3 + 0.2 x 4 + 0.08 x 5 > = 9.1 (1) \begin{aligned} \min \,\,&0.02x1 + 0.07x2 + 0.04x3 + 0.03x4 + 0.05x5\\ \text{s.t.}&0.3x1 + 2x2 + x3 + 0.6x4 + 1.8x5 >= 70\\ &0.1x1 + 0.05x2 + 0.02x3 + 0.2x4 + 0.05x5 >= 3\\ &0.05x1 + 0.1x2 + 0.02x3 + 0.2x4 + 0.08x5 >= 9.1 \tag{1} \end{aligned} mins.t.0.02x1+0.07x2+0.04x3+0.03x4+0.05x50.3x1+2x2+x3+0.6x4+1.8x5>=700.1x1+0.05x2+0.02x3+0.2x4+0.05x5>=30.05x1+0.1x2+0.02x3+0.2x4+0.08x5>=9.1(1)
使用Gurobi进行求解,python代码如下:

from gurobipy import *

# Create a new model
m = Model()

# Create variables
x1 = m.addVar(name="x1")
x2 = m.addVar(name="x2")
x3 = m.addVar(name="x3")
x4 = m.addVar(name="x4")
x5 = m.addVar(name="x5")
phi = m.addVar(name="phi")

# Set objective function
m.setObjective(0.02 * x1 + 0.07 * x2 + 0.04 * x3 + 0.03 * x4 + 0.05 * x5)

# Add constraints
m.addConstr(0.3 * x1 + 2 * x2 + x3 + 0.6 * x4 + 1.8 * x5 >= 70, "c2")
m.addConstr(0.1 * x1 + 0.05 * x2 + 0.02 * x3 + 0.2 * x4 + 0.05 * x5 >= 3, "c3")
m.addConstr(0.05 * x1 + 0.1 * x2 + 0.02 * x3 + 0.2 * x4 + 0.08 * x5 >= 9.1, "c4")

# Optimize model
m.optimize()

# Print values for decision variables
for v in m.getVars():
    print(v.varName, v.x)

# Print maximized profit value
print('Maximized profit:',  m.objVal)

问题(1)等价于:
min ⁡    ϕ s.t. ϕ ≥ 0.02 x 1 + 0.07 x 2 + 0.04 x 3 + 0.03 x 4 + 0.05 x 5 0.3 x 1 + 2 x 2 + x 3 + 0.6 x 4 + 1.8 x 5 > = 70 0.1 x 1 + 0.05 x 2 + 0.02 x 3 + 0.2 x 4 + 0.05 x 5 > = 3 0.05 x 1 + 0.1 x 2 + 0.02 x 3 + 0.2 x 4 + 0.08 x 5 > = 9.1 (2) \begin{aligned} \min \,\,&\phi\\ \text{s.t.}&\phi\ge 0.02x1 + 0.07x2 + 0.04x3 + 0.03x4 + 0.05x5\\ &0.3x1 + 2x2 + x3 + 0.6x4 + 1.8x5 >= 70\\ &0.1x1 + 0.05x2 + 0.02x3 + 0.2x4 + 0.05x5 >= 3\\ &0.05x1 + 0.1x2 + 0.02x3 + 0.2x4 + 0.08x5 >= 9.1 \tag{2} \end{aligned} mins.t.ϕϕ0.02x1+0.07x2+0.04x3+0.03x4+0.05x50.3x1+2x2+x3+0.6x4+1.8x5>=700.1x1+0.05x2+0.02x3+0.2x4+0.05x5>=30.05x1+0.1x2+0.02x3+0.2x4+0.08x5>=9.1(2)
使用Gurobi进行求解,python代码如下:

from gurobipy import *

# Create a new model
m = Model()

# Create variables
x1 = m.addVar(name="x1")
x2 = m.addVar(name="x2")
x3 = m.addVar(name="x3")
x4 = m.addVar(name="x4")
x5 = m.addVar(name="x5")
phi = m.addVar(name="phi")

# Set objective function
m.setObjective(phi)

# Add constraints
m.addConstr(phi >= 0.02 * x1 + 0.07 * x2 + 0.04 * x3 + 0.03 * x4 + 0.05 * x5, "c1")
m.addConstr(0.3 * x1 + 2 * x2 + x3 + 0.6 * x4 + 1.8 * x5 >= 70, "c2")
m.addConstr(0.1 * x1 + 0.05 * x2 + 0.02 * x3 + 0.2 * x4 + 0.05 * x5 >= 3, "c3")
m.addConstr(0.05 * x1 + 0.1 * x2 + 0.02 * x3 + 0.2 * x4 + 0.08 * x5 >= 9.1, "c4")

# Optimize model
m.optimize()

# Print values for decision variables
for v in m.getVars():
    print(v.varName, v.x)

# Print maximized profit value
print('Maximized profit:',  m.objVal)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Gurobi解VRPTW最小化时间的模型。以下是一个简单的Python代码示例,使用Gurobi解VRPTW问题。 ```python import gurobipy as gp from gurobipy import GRB # 定义数据 num_customers = 50 num_vehicles = 10 capacity = 20 # 生成随机数据 import random random.seed(1) locations = [(random.uniform(-100, 100), random.uniform(-100, 100)) for i in range(num_customers+1)] demands = [random.randint(1,10) for i in range(num_customers)] service_times = [random.uniform(0.5, 2) for i in range(num_customers)] vehicle_capacity = [capacity for i in range(num_vehicles)] # 计算距离矩阵 from math import sqrt def distance(a, b): return sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2) distances = {(i, j): distance(locations[i], locations[j]) for i in range(num_customers+1) for j in range(num_customers+1)} # 创建模型 m = gp.Model('vrptw') # 创建变量 x = m.addVars(distances.keys(), vtype=GRB.BINARY, name='x') u = m.addVars(num_customers+1, ub=vehicle_capacity, name='u') # 添加约束 m.addConstrs((gp.quicksum(x[i,j] for j in range(num_customers+1) if j != i) == 1 for i in range(num_customers+1)), name='depot') m.addConstrs((gp.quicksum(x[i,j] for i in range(num_customers+1) if i != j) == 1 for j in range(num_customers+1)), name='customer') m.addConstrs((u[i] >= demands[i] for i in range(num_customers+1)), name='demand') m.addConstrs((u[j] >= u[i] + demands[j] - vehicle_capacity[0]*(1-x[i,j]) for i,j in distances.keys() if i != 0 and j != 0 and i != j), name='capacity') m.addConstrs((u[i] >= service_times[i] for i in range(num_customers+1)), name='service_start') m.addConstrs((u[i] + service_times[i] + distances[i,j] <= u[j] + vehicle_capacity[0]*(1-x[i,j]) for i,j in distances.keys() if i != 0 and j != 0 and i != j), name='time_window') # 设置目标函数 m.setObjective(gp.quicksum(distances[i,j]*x[i,j] for i,j in distances.keys()), GRB.MINIMIZE) # 解模型 m.optimize() # 打印结果 print('Cost: %g' % m.objVal) for v in m.getVars(): if v.X > 0: print('%s = %g' % (v.Varname, v.X)) ``` 在这个例子中,我们使用Gurobi解一个VRPTW问题,其中有50个客户和10个车辆。在模型中,我们使用二进制变量x[i,j]表示车辆是否从客户i到客户j,使用变量u[i]表示在客户i的服务开始时间。然后,我们添加了多个约束来限制车辆的容量和服务时间窗口,并将距离作为目标函数进行最小化。最后,我们使用m.optimize()解模型,并打印出结果。 需要注意的是,这个例子只是一个简单的示例。实际上,VRPTW问题比这个例子复杂得多,需要更多的约束和变量。因此,您需要根据自己的实际情况来调整和扩展模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值