R 在lpSolveAPI中分配权重以对变量进行优先级排序

R 在lpSolveAPI中分配权重以对变量进行优先级排序,r,linear-programming,lpsolve,R,Linear Programming,Lpsolve,我正在尝试使用lpSolveAPI和R建立一个线性规划解决方案来解决调度问题。下面是一个小样本的数据;每个会话id所需的分钟数及其“首选”顺序/重量 id <- 1:100 min <- sample(0:500, 100) weight <- (1:100)/sum(1:100) data <- data.frame(id, min, weight) 应该是 Day 1 67 72 36 91 80 44 76 Da

我正在尝试使用lpSolveAPI和R建立一个线性规划解决方案来解决调度问题。下面是一个小样本的数据;每个会话id所需的分钟数及其“首选”顺序/重量

id <- 1:100
min <- sample(0:500, 100)
weight <- (1:100)/sum(1:100)
data <- data.frame(id, min, weight)
应该是

    Day 1   67  72  36  91  80  44  76          
    Day 2   58  84  96  21  1   41  66  89      
    Day 3   62  11  42  68  25  44  90  4   33  31

每天有一个的累积总和,我将集中精力解决第一个问题。我们基本上解决了一个背包问题(目标+一个约束):

当我按原样运行此模型时,我得到:

> solve(lp)
[1] 0
> x <- get.variables(lp)
> weightx <- data$weight * x
> sum(x)
[1] 14
> sum(weightx)
[1] 0.5952381
求解(lp) [1] 0 >x权重x总和(x) [1] 14 >总和(权重x) [1] 0.5952381 现在当我把目标改为

我得到:

> solve(lp)
[1] 0
> x <- get.variables(lp)
> weightx <- data$weight * x
> sum(x)
[1] 14
> sum(weightx)
[1] 0.7428571
求解(lp) [1] 0 >x权重x总和(x) [1] 14 >总和(权重x) [1] 0.7428571
也就是说,计数保持在14,但体重有所增加。

我的简单方法:

df = read.table(header=T,text="
 id   min weight
  1   67  1
  2   72  2
  3   36  3
  4   91  4
  5   80  5
  6   44  6
  7   76  7
  8   58  8
  9   84  9
  10  96  10
  11  21  11
  12  1   12
  13  41  13
  14  66  14
  15  89  15
  16  62  16
  17  11  17
  18  42  18
  19  68  19
  20  25  20
  21  44  21
  22  90  22
  23  4   23
  24  33  24
  25  31  25")
# assume sorted by weight 

daynr = 1
daymax = 480
dayusd = 0
for (i in 1:nrow(df))
{
  v = df$min[i]
  dayusd = dayusd + v
  if (dayusd>daymax)
  {
    daynr = daynr + 1
    dayusd = v
  }
  df$day[[i]] = daynr
}
这将提供:

 > df
    id min weight day
 1   1  67      1   1
 2   2  72      2   1
 3   3  36      3   1
 4   4  91      4   1
 5   5  80      5   1
 6   6  44      6   1
 7   7  76      7   1
 8   8  58      8   2
 9   9  84      9   2
 10 10  96     10   2
 11 11  21     11   2
 12 12   1     12   2
 13 13  41     13   2
 14 14  66     14   2
 15 15  89     15   2
 16 16  62     16   3
 17 17  11     17   3
 18 18  42     18   3
 19 19  68     19   3
 20 20  25     20   3
 21 21  44     21   3
 22 22  90     22   3
 23 23   4     23   3
 24 24  33     24   3
 25 25  31     25   3
 >

我怀疑分支权重(通常称为分支优先级)只是为了提高性能。这并不是为了生成结构不同的解决方案。@ErwinKalvelagen这很有意义,因为(在发布此问题后)我决定对set.branch.weights进行注释,但仍然得到了相同的结果。你知道我如何在R中设置线性规划解的权重吗?干杯你可以通过目标做到这一点。任何时候,如果您喜欢一种解决方案高于另一种解决方案,您都应该确保这两种解决方案的目标值反映了这一点。@ErwinKalvelagen您能告诉我如何更改目标函数以包含权重,特别是因为这是一种二进制类型吗?非常感谢!使用等于1的目标系数。你可以试试1+0.01*的重量。即计数是最重要的;重量不那么重要。嘿,有一个改进,但我不能因为某种原因测试它,如果我有超过300条记录-R只是挂起。另一件事是我正在寻找一个严格遵循权重的解决方案。我在OPIf中添加了一个例子,如果你真的想完全按照重量的顺序来填充天数,那么就没有什么优化了。只需开始填充分配项目,直到达到480。然后移到第二天。这不需要解算器。是的,这就是我现在所想的,不幸的是,由于我有限的R,我试图写一个循环,用结果填充一个矩阵。我肯定我不再讨论这个话题了,但我添加了第二个答案,以获得额外的奖励。谢谢!是的,这与最初的线性规划解决方案无关,但权重/排名对我来说很重要,因为这是一个调度问题。非常感谢你!
df = read.table(header=T,text="
 id   min weight
  1   67  1
  2   72  2
  3   36  3
  4   91  4
  5   80  5
  6   44  6
  7   76  7
  8   58  8
  9   84  9
  10  96  10
  11  21  11
  12  1   12
  13  41  13
  14  66  14
  15  89  15
  16  62  16
  17  11  17
  18  42  18
  19  68  19
  20  25  20
  21  44  21
  22  90  22
  23  4   23
  24  33  24
  25  31  25")
# assume sorted by weight 

daynr = 1
daymax = 480
dayusd = 0
for (i in 1:nrow(df))
{
  v = df$min[i]
  dayusd = dayusd + v
  if (dayusd>daymax)
  {
    daynr = daynr + 1
    dayusd = v
  }
  df$day[[i]] = daynr
}
 > df
    id min weight day
 1   1  67      1   1
 2   2  72      2   1
 3   3  36      3   1
 4   4  91      4   1
 5   5  80      5   1
 6   6  44      6   1
 7   7  76      7   1
 8   8  58      8   2
 9   9  84      9   2
 10 10  96     10   2
 11 11  21     11   2
 12 12   1     12   2
 13 13  41     13   2
 14 14  66     14   2
 15 15  89     15   2
 16 16  62     16   3
 17 17  11     17   3
 18 18  42     18   3
 19 19  68     19   3
 20 20  25     20   3
 21 21  44     21   3
 22 22  90     22   3
 23 23   4     23   3
 24 24  33     24   3
 25 25  31     25   3
 >