首页>软件资讯>常见问题

常见问题

用Gurobi解锁一个经典优化问题

发布时间:2025-07-17 10:27:23人气:5

从一个简单的案例开始


连续投资问题建模与求解



问题描述


某部门有10万元资金,需要在5年内对4个项目进行投资:


项目A:1-4年年初投资,次年回收本利115%


项目B:第3年年初投资,第5年末回收本利125%(≤4万元)


项目C:第2年年初投资,第5年末回收本利140%(≤3万元)


项目D:每年年初投资,当年回收本利106%


求最大化第5年末资金总额的投资方案。


建模思路:


决策变量定义:


使用11个决策变量表示各年投资额:


x_name = ['x1A', 'x2A', 'x3A', 'x4A', 'x3B', 'x2C', 'x1D', 'x2D', 'x3D', 'x4D', 'x5D']


约束条件

1.建立资金流动平衡约束


# 第1年资金分配

model.addConstr(X['x1A'] + X['x1D'] == 100000)


# 第2年资金分配

model.addConstr(-1.06*X['x1D'] + X['x2A'] + X['x2C'] + X['x2D'] == 0)


# 第3年资金分配

model.addConstr(-1.15*X['x1A'] -1.06*X['x2D'] + X['x3A'] + X['x3B'] + X['x3D'] == 0)


# 第4年资金分配

model.addConstr(-1.15*X['x2A'] -1.06*X['x3D'] + X['x4A'] + X['x4D'] == 0)


# 第5年资金分配

model.addConstr(-1.15*X['x3A'] -1.06*X['x4D'] + X['x5D'] == 0)

2.投资限额约束

model.addConstr(X['x2C'] <= 30000)  # 项目C限额

model.addConstr(X['x3B'] <= 40000)  # 项目B限额

目标函数:

最大化第5年末总资金:


model.addConstr(obj == 1.15*X['x4A'] + 1.40*X['x2C'] + 1.25*X['x3B'] + 1.06*X['x5D'])

model.setObjective(obj, GRB.MAXIMIZE)


代码解析:


from gurobipy import *

import gurobipy as gp

import pandas as pd

import numpy as np


time = ['1', '2', '3', '4', '5']

x_name = ['x1A', 'x2A', 'x3A', 'x4A', 'x3B', 'x2C', 'x1D', 'x2D', 'x3D', 'x4D', 'x5D']


time, coefficient, investment= gp.multidict({

#    'x1A', 'x2A', 'x3A', 'x4A', 'x3B', 'x2C', 'x1D', 'x2D', 'x3D', 'x4D', 'x5D'

'1': [[1, 0, 0, 0 , 0, 0 , 1, 0, 0, 0, 0], 100000],

'2': [[0, 1, 0, 0 , 0, 1 , -1.06, 1, 0, 0, 0], 0],


'3': [[-1.15, 0, 1, 0 , 1, 0 , 0, -1.06, 1, 0, 0], 0],


'4': [[0, -1.15, 0, 1 , 0, 0 , 0, 0, -1.06, 1, 0], 0],

'5': [[0, 0, -1.15, 0 , 0, 0 , 0, 0, 0, -1.06, 1], 0],

})


model = Model('HomeWork1')

X = model.addVars(x_name, vtype=GRB.CONTINUOUS, lb=0, name='Annual_investment')

model.addConstr(coefficient['1'][x_name.index('x1A')] * X['x1A'] + coefficient['1'][x_name.index('x1D')] * X['x1D'] == investment['1'])

model.addConstr(coefficient['2'][x_name.index('x1D')] * X['x1D'] + coefficient['2'][x_name.index('x2A')] * X['x2A'] + coefficient['2'][x_name.index('x2C')] * X['x2C'] + coefficient['2'][x_name.index('x2D')] * X['x2D'] == investment['2'])

model.addConstr(coefficient['3'][x_name.index('x1A')] * X['x1A'] + coefficient['3'][x_name.index('x2D')] * X['x2D'] + coefficient['3'][x_name.index('x3A')] * X['x3A'] + coefficient['3'][x_name.index('x3B')] * X['x3B'] + coefficient['3'][x_name.index('x3D')] * X['x3D'] == investment['3'])

model.addConstr(coefficient['4'][x_name.index('x2A')] * X['x2A'] + coefficient['4'][x_name.index('x3D')] * X['x3D'] + coefficient['4'][x_name.index('x4A')] * X['x4A'] + coefficient['4'][x_name.index('x4D')] * X['x4D'] == investment['4'])

model.addConstr(coefficient['5'][x_name.index('x3A')] * X['x3A'] + coefficient['5'][x_name.index('x4D')] * X['x4D'] + coefficient['5'][x_name.index('x5D')] * X['x5D'] == investment['5'])

model.addConstr(X['x2C'] <= 30000)

model.addConstr(X['x3B'] <= 40000)

obj = model.addVar(vtype=GRB.CONTINUOUS, lb=0, name='obj')

model.addConstr(obj == 1.15 * X['x4A'] + 1.40 * X['x2C'] + 1.25 * X['x3B'] + 1.06 * X['x5D'])

model.setObjective(obj, GRB.MAXIMIZE)

model.optimize()

print('Objective : ', model.ObjVal)

for var in model.getVars():

if(var.x > 0):

        print(var.varName, ' ', var.x)


结果截图:

结果.jpg



上一条:Cadence EDA工具安装

下一条:Gurobi公司简介