[英]Adding priority to rows in LpsolveAPI in R
我在 R 中使用 LpSolverAPI 優化了時間分配 lp 代碼。 該代碼適用於給定的約束,這些約束是:
必須滿足每個工作分配的時間 工人工作時間不能超過帶薪工作時間
但是,在將時間分配給每個工作時,我需要添加一個“優先級”。 意思是,有些工作需要首先完成/在分配工人時必須優先考慮。
我的代碼如下。
時間必須分配給job4、job2、job3,最后是job1(根據priority_matrix)如果工人沒有時間空閑,那么較低優先級的作業可以保持未分配。
使用以下代碼(無優先級)沒有時間分配給作業 4。
library(lpSolveAPI)
jobs <- c(1,1,1,1)
workermax <- c(8,6,9)
jobmax <- c(6,6,5,6)
priority_matrix <- as.matrix(c(4,2,3,1),ncol = 1, bycol = T) ##priority of each job
rownames(priority_matrix) <- c("Job1","Job2","Job3","Job4")
scheduler_input2 <- matrix(c(8, 0, 0, 0,6,0,8,0,9,0,6,0), nrow=4 , byrow =T)
obj.vals <- scheduler_input2
colnames(obj.vals) <- c("worker1","worker2","worker3")
rownames(obj.vals) <- c("Job1","Job2","Job3","Job4")
nworkers <- ncol(scheduler_input2)
njobs <- nrow(scheduler_input2) #4
ncol = nworkers*njobs
distribution<- make.lp(ncol=ncol)
set.type(distribution, columns=1:ncol, type = c("integer"))
set.objfn(distribution, obj.vals)
lp.control(distribution,sense='max')
#cosntraint1
time_per_job <- function (job_index) {
skill_cols <- (0:(nworkers-1))*njobs + job_index
add.constraint(distribution, rep(1,nworkers), indices=skill_cols,type="<=", rhs=jobmax[job_index])
}
lapply(1:njobs, time_per_job)
#cosntraint2
max_hrs_by_worker <- function (DA_index) {
DA_cols <- (DA_index-1)*njobs + (1:njobs) #relevant columns for a given room
add.constraint(distribution, xt=jobs, indices=DA_cols,type="<=",rhs=workermax[DA_index])
}
lapply(1:nworkers, max_hrs_by_worker)
solve(distribution)
get.objective(distribution)
distribution<-matrix(get.variables(distribution), njobs,nworkers)
提前致謝。
描述不夠精確,無法給出明確的答案。 另外,在開始編碼之前,用數學符號寫下問題。 代碼不是很容易閱讀,也不是結構揭示。 這部分是 LpSolveAPI 的一個問題,它有一種有點中世紀的方式來表示優化模型。
如果要強制執行 job2 只能在執行 job4 時執行,則引入二進制變量:
y[j] = 1 if job j is executed
0 otherwise
和優先約束:
y[job4] >= y[job2]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.