簡體   English   中英

在 R 中為 LpsolveAPI 中的行添加優先級

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM