Ниже приведен простой нелинейный пример, который правильно рассчитывает 1 набор данных с использованием пакета ROI. В коде я фильтрую только по CompanyA. Цель состоит в том, чтобы минимизировать общую стоимость путем найма оптимального количества штатных сотрудников для каждой компании в отдельности.
Каждая компания имеет возможность использовать внешнего поставщика, что влечет за собой более высокую ставку заработной платы. Преимущество стороннего поставщика заключается в том, что вы можете легче настраивать часы, поскольку сотрудникам, занятым полный рабочий день, требуется 40 часов в неделю.
Приведенные ниже функции работают как талисман для 1 набора данных, но я не могуВыясните, как пройти через 3 различных набора данных, которые дают 3 различных минимизированных общих затрат и 3 различных оптимальных сотрудника на полный рабочий день для каждой компании. Минимальные общие затраты для компаний A, B и C составляют 9 000 долл. США, 8 100 долл. США и 13 200 долл. США соответственно. Оптимальное количество партнеров для Компании A, B и C составляет 2,92, 2,50 и 3,74.
В последней части кода показаны перечисленные желаемые результаты. Имя тиббла называется selected_final_tbl.
# 1.0 LIBRARIES ----
# Solver Backend
library(ROI)
library(ROI.plugin.alabama)
# Core
library(tidyverse)
#1.1 Create tibble data set ----
# Company column - 3 separate companies trying to optimize number of Full Time Associates they should hire
# Week - number of weeks we are analyzing
# Full_Time_Associate_Wage_Rate - wage rate for a full time associate that is guarateed 40 hours
# Outside Vendor Wage Rate - wage rate if we decided to hire help from a third party.
# Cleaning Hours - number of cleaning hours needed for each of the days
data_tbl <- tibble(Company = rep(c("CompanyA", "CompanyB", "CompanyC"), times = c(5,5,5)),
Week = rep(1:5, length.out=15),
Full_Time_Associate_Wage_Rate = rep(c(12, 11, 12), times = c(5,5,5)),
Outside_Vendor_Wage_Rate = rep(c(15, 13, 15), times = c(5,5,5)),
Cleaning_Hours = c(100, 120, 140, 160, 180, 100, 120, 140, 160, 180, 140, 160, 200, 240, 280))
data_tbl
# 2.0 FUNCTIONS EO ----
calc_FT_Associates <- function(Optimal_Full_Time_Associates) {
data_tbl %>%
filter(Company == "CompanyA") %>%
select(Company, Week, Full_Time_Associate_Wage_Rate, Outside_Vendor_Wage_Rate, Cleaning_Hours) %>%
# Calculate FT Associate Hours
mutate(FT_Associate_Hours = Optimal_Full_Time_Associates * 40) %>%
# Calculate Number of Hours the Outside Vendor has to fill
mutate(Outside_Vendor_Hours = case_when(Cleaning_Hours <= FT_Associate_Hours ~ 0,
TRUE ~ Cleaning_Hours - FT_Associate_Hours)) %>%
# Calculate Cost of FT Associates
mutate(FT_Associate_Cost = FT_Associate_Hours*Full_Time_Associate_Wage_Rate) %>%
# Calculate Cost of Outside Vendor
mutate(Outside_Vendor_Cost = Outside_Vendor_Hours*Outside_Vendor_Wage_Rate) %>%
# Calculate Total Cost
mutate(Total_Cost = FT_Associate_Cost + Outside_Vendor_Cost) %>%
# Summarise Total Cost
summarise(Total_Cost_sum = sum(Total_Cost)) %>%
# Pull summarization into a vector so that it will be able to get passed in below
pull(Total_Cost_sum)
}
# Test function for Company A only
calc_FT_Associates(2.92)
# 3.0 OBJECTIVE EO ----
n <- 1
single_data_set_optimization <- function(data = data) {
hrs_model_nlp <- OP(
objective = F_objective(F = calc_FT_Associates, n = n, names = "Opt_Associates"),
constraints = rbind(
F_constraint(F = calc_FT_Associates, dir = ">=", rhs = 0)
),
maximum = FALSE
)
sol <- ROI_solve(hrs_model_nlp, solver = "alabama", start = rep(1/n, n))
return(
bind_cols(
tibble(Total_Cost = calc_FT_Associates(sol$solution)),
enframe(sol$solution) %>% spread(key = name, value = value))
)
}
single_data_set_optimization(Company_A)
# I need the code above to loop through each data set, find the optimal associates for each company and calculate the minimal Total Cost.
# The tibble below is the desired final result
desired_final_tbl <- tibble(Company = c("CompanyA", "CompanyB", "CompanyC"),
Total_Cost = c(9000, 8100, 13200),
Opt_Associates = c(2.92, 2.5, 3.74))
desired_final_tbl
Желаемое изображение на выходе: Желаемое изображение