Gurobi:最小化问题的reformulation

本文通过一个简单的线性规划问题,展示了如何使用Gurobi优化库在Python中建立模型并求解。原始问题是求解一组变量x1至x5的最小加权和,同时满足三个不等式约束。将原问题转换为等价的极小化目标函数形式,即求解一个额外变量phi的最小值,使它大于等于原问题的目标函数。通过Gurobi的API设置目标函数和约束条件,最终求得最优解并输出决策变量的值和最大利润。
摘要由CSDN通过智能技术生成

以一个最简单的线性规划问题为例。
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)
CVRP(车辆路径问题)是一个经典的组合优化问题,而Gurobi是一个强大的数学规划解器。在Python中使用Gurobi解CVRP问题可以通过以下步骤进行: 1. 安装Gurobi:首先,确保已经安装了Gurobi数学优化软件包,并获取了有效的许可证。你可以从Gurobi官方网站上下载并安装Gurobi。 2. 导入Gurobi和其他必要的库:在Python脚本中导入Gurobi和其他需要使用的库,如numpy和pandas。 ```python import gurobipy as gp from gurobipy import GRB import numpy as np import pandas as pd ``` 3. 准备数据:准备CVRP问题需要的数据,包括顾客坐标、需量、车辆容量等。 4. 创建模型:使用Gurobi创建一个数学规划模型。 ```python model = gp.Model('CVRP') ``` 5. 创建变量:创建决策变量,表示每个顾客是否被分配给某个车辆进行服务。 ```python x = {} # x[i, j]表示顾客i是否被分配给车辆j for i in range(num_customers): for j in range(num_vehicles): x[i, j] = model.addVar(vtype=GRB.BINARY, name=f'x_{i}_{j}') ``` 6. 添加约束条件:添加问题特定的约束条件,如每个顾客只能被一个车辆服务、每个车辆的容量限制等。 ```python # 每个顾客只能被一个车辆服务 for i in range(num_customers): model.addConstr(sum(x[i, j] for j in range(num_vehicles)) == 1) # 每个车辆的容量限制 for j in range(num_vehicles): model.addConstr(sum(demand[i] * x[i, j] for i in range(num_customers)) <= vehicle_capacity) ``` 7. 添加目标函数:添加目标函数,通常是最小化总路径长度或者最小化车辆使用数量。 ```python # 最小化总路径长度 model.setObjective(sum(distance[i, j] * x[i, j] for i in range(num_customers) for j in range(num_vehicles))) ``` 8. 解模型:调用Gurobi解方法解模型。 ```python model.optimize() ``` 9. 解析结果:获取解结果,并将其解析为可读的形式。 ```python solution = model.getAttr('x', x) routes = [] for j in range(num_vehicles): route = [i for i in range(num_customers) if solution[i, j] > 0.5] routes.append(route) ``` 这只是一个简单的示例,实际应用中可能涉及到更多的约束条件和问题特定的处理。你可以根据自己的需对代码进行修改和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值