从一个简单的案例开始
连续投资问题建模与求解
问题描述
某部门有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)
结果截图:

上一条:Cadence EDA工具安装
下一条:Gurobi公司简介