请求协助:在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))
代码说明
- 日期处理:用
lubridate生成完整的当月日期,避免手动输入出错 - 生产日判定:通过自定义函数确保首日必选,后续生产日按偏移1天的规则筛选(对应你Excel里的模值判断逻辑)
- 产量计算:分两种情况处理:
- 小需求场景:直接全安排在首日
- 大需求场景:首日先排满,之后逐天扣减剩余需求,直到完成目标
- 结果补全:把非生产日的产量补为0,累计产量自动延续,让整个月的排程表更完整
测试不同场景
- 如果月度需求是300(小于最大产量400):首日排300,其余生产日排0
- 如果月度需求是1700:首日400,接下来三个生产日各400,第四个生产日排100,之后生产日排0
你可以根据实际需求调整参数里的月份、需求、最大产量和生产间隔,完全适配你的业务场景!
内容的提问来源于stack exchange,提问作者user2299914
相关产品推荐
相关产品推荐

