You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助:在R中复现Excel生产排程的产量计算逻辑

没问题!我帮你把Excel里的生产排程逻辑搬到R里,完全贴合你的需求。先把核心规则理清楚,再一步步实现代码:

实现思路与代码

首先咱们明确核心规则,避免跑偏:

  • 生产日判定:首笔生产必须安排在当月首个生产日;其余生产日要偏移1天适配这个首日,用「(日期-1) 模 生产间隔 == 0」来判断(这样首日刚好符合条件,后续按间隔推进)
  • 产量排程:
    • 如果月度总需求 ≤ 单日最大产量:全部需求都放在首个生产日
    • 否则,首个生产日先排满最大产量;后续每个生产日,剩余需求大于最大产量就排满,否则排剩余需求,直到需求完成,之后的生产日产量为0
  • 目标:用最少的生产日完成月度需求

完整代码实现

先加载需要的工具包,然后定义参数、生成日期、判定生产日、计算产量:

# 加载必要包
library(lubridate)
library(dplyr)

# ---------------------- 参数设置 ----------------------
target_month <- ymd("2024-05-01")  # 要排程的月份(格式:年-月-日)
monthly_demand <- 1500             # 月度总需求
max_daily_production <- 400        # 单日最大产量上限
production_interval <- 3           # 生产间隔(每N天生产一次)
# ------------------------------------------------------

# 生成当月所有日期序列
month_dates <- seq(target_month, ceiling_date(target_month, "month") - days(1), by = "day")

# 确定当月首个生产日(这里默认当月第一天,若需要排除周末可自行调整)
first_prod_day <- min(month_dates)

# 定义生产日判断函数:首日必是生产日,其余日期满足(日期-1)模间隔为0
is_production_day <- function(date, first_day, interval) {
  if (date == first_day) return(TRUE)
  (day(date) - 1) %% interval == 0
}

# 构建排程表:标记生产日 + 计算每日产量
production_schedule <- tibble(date = month_dates) %>%
  # 标记是否为生产日
  mutate(is_prod_day = map_lgl(date, is_production_day, first_day = first_prod_day, interval = production_interval)) %>%
  # 先筛选出生产日处理产量,之后再合并回全日期
  filter(is_prod_day) %>%
  mutate(prod_day_order = row_number()) %>%
  # 计算每日产量
  mutate(
    daily_production = case_when(
      # 总需求≤最大产量:首日全排,其余生产日排0
      monthly_demand <= max_daily_production & prod_day_order == 1 ~ monthly_demand,
      monthly_demand <= max_daily_production & prod_day_order > 1 ~ 0,
      # 首日排满最大产量
      prod_day_order == 1 ~ max_daily_production,
      # 剩余需求>最大产量:排满;否则排剩余
      lag(cumsum(daily_production), default = 0) + max_daily_production <= monthly_demand ~ max_daily_production,
      lag(cumsum(daily_production), default = 0) < monthly_demand ~ monthly_demand - lag(cumsum(daily_production), default = 0),
      # 需求已完成:排0
      TRUE ~ 0
    )
  ) %>%
  # 计算累计产量,确保不超过总需求
  mutate(cumulative_production = pmin(cumsum(daily_production), monthly_demand)) %>%
  # 合并回全日期序列,非生产日产量设为0,累计产量延续前一天数值
  right_join(tibble(date = month_dates), by = "date") %>%
  arrange(date) %>%
  mutate(
    is_prod_day = replace_na(is_prod_day, FALSE),
    daily_production = replace_na(daily_production, 0),
    cumulative_production = replace_na(cumulative_production, lag(cumulative_production, default = 0))
  )

# 查看生产日的排程结果(核心数据)
print(production_schedule %>% filter(is_prod_day) %>% select(date, daily_production, cumulative_production))

代码说明

  1. 日期处理:用lubridate生成完整的当月日期,避免手动输入出错
  2. 生产日判定:通过自定义函数确保首日必选,后续生产日按偏移1天的规则筛选(对应你Excel里的模值判断逻辑)
  3. 产量计算:分两种情况处理:
    • 小需求场景:直接全安排在首日
    • 大需求场景:首日先排满,之后逐天扣减剩余需求,直到完成目标
  4. 结果补全:把非生产日的产量补为0,累计产量自动延续,让整个月的排程表更完整

测试不同场景

  • 如果月度需求是300(小于最大产量400):首日排300,其余生产日排0
  • 如果月度需求是1700:首日400,接下来三个生产日各400,第四个生产日排100,之后生产日排0

你可以根据实际需求调整参数里的月份、需求、最大产量和生产间隔,完全适配你的业务场景!

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:42:17