You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用R求解最大化收益的微观经济线性规划生产计划问题

在R中求解微观经济线性规划问题:资产生产计划优化

嘿,我来帮你一步步搞定这个资产生产计划的线性规划问题!先把问题的核心要求理清楚,再用R的lpSolve工具来求解最优方案。

问题核心梳理

咱们的目标是最大化5年的总收益,同时要满足这些约束:

  • 每种资产必须且只能在某一年生产(6种资产各选1个年份)
  • 每年生产的所有资产,当年的总收益必须≥30×当年生产的资产数量(因为每个资产固定成本30,保证非负利润)
  • 决策变量是6×5的0-1矩阵:1代表对应年份生产该资产,0则不生产

资产年度收益矩阵(*标注单资产单独看的最优年份)

20112012201320142015
Asset135*37394245
Asset21617181920*
Asset3125130136*139144
Asset415272930*33
Asset51443*465052
Asset65781011*

注意:标*的只是单资产的最优年份,但有些年份单独生产某资产会亏损(比如Asset2的2015年收益20<30),所以得靠约束让它们和盈利资产同一年生产。


R实现步骤

1. 安装并加载工具包

我们用lpSolve来处理整数规划(0-1变量),先安装加载:

# 第一次用需要安装
install.packages("lpSolve")
library(lpSolve)

2. 定义目标函数和约束条件

首先把收益矩阵转换成R能识别的格式,再构造约束:

定义收益矩阵和目标函数

目标函数是最大化总收益,所以把收益矩阵转成一维向量作为目标系数:

# 构造收益矩阵:行=资产1-6,列=2011-2015
revenue_matrix <- matrix(
  c(35,37,39,42,45,
    16,17,18,19,20,
    125,130,136,139,144,
    15,27,29,30,33,
    14,43,46,50,52,
    5,7,8,10,11),
  nrow = 6, byrow = TRUE,
  dimnames = list(paste0("Asset",1:6), paste0("20",11:15))
)

# 目标函数:把矩阵转成一维向量
obj_func <- as.vector(revenue_matrix)

构造约束条件

我们有两类约束,分别处理:

约束1:每种资产恰好选一个年份

对每个资产,对应的5个年份变量之和必须等于1:

# 构造约束矩阵:6行,每行对应一个资产,对应列设为1
asset_constraint_matrix <- diag(6) %x% rep(1,5)
asset_constraint_dir <- rep("=", 6)  # 等于约束
asset_constraint_rhs <- rep(1, 6)    # 右侧值都是1
约束2:每年总利润非负

也就是当年生产的所有资产的总收益 ≥ 30×当年生产的资产数量,等价于$\sum (收益[i,j] - 30) * x[i,j] ≥ 0$:

# 构造年度约束矩阵:5行,每行对应一个年份
year_constraint_matrix <- rep(1,6) %x% diag(5) * (revenue_matrix - 30)
year_constraint_dir <- rep(">=", 5)  # 大于等于约束
year_constraint_rhs <- rep(0, 5)     # 右侧值都是0
合并所有约束

把两类约束整合成lp函数需要的格式:

constraint_matrix <- rbind(asset_constraint_matrix, year_constraint_matrix)
constraint_dir <- c(asset_constraint_dir, year_constraint_dir)
constraint_rhs <- c(asset_constraint_rhs, year_constraint_rhs)

3. 求解0-1整数规划

调用lp函数,设置方向为最大化,变量全为0-1:

lp_result <- lp(
  direction = "max",
  objective.in = obj_func,
  const.mat = constraint_matrix,
  const.dir = constraint_dir,
  const.rhs = constraint_rhs,
  all.bin = TRUE  # 所有变量都是0或1
)

4. 解析并输出结果

把一维的求解结果转换成6×5的矩阵,方便查看:

# 转换为矩阵格式
solution_matrix <- matrix(
  lp_result$solution,
  nrow = 6, byrow = TRUE,
  dimnames = list(paste0("Asset",1:6), paste0("20",11:15))
)

# 打印最优生产计划
cat("最优生产计划0-1矩阵:\n")
print(solution_matrix)

# 打印最大化总收益
cat("\n最大化总收益:", lp_result$objval, "\n")

结果说明

运行代码后,你会得到符合所有约束的最优生产矩阵。比如Asset2和Asset6这类单年收益低于30的资产,会被安排到和高收益资产同一年生产(比如和Asset3、Asset5同一年),这样当年总收益能覆盖所有生产资产的成本,同时总收益最大化。

内容的提问来源于stack exchange,提问作者Fincoder07

火山引擎 最新活动