R 在lpSolveAPI中分配权重以对变量进行优先级排序
我正在尝试使用lpSolveAPI和R建立一个线性规划解决方案来解决调度问题。下面是一个小样本的数据;每个会话id所需的分钟数及其“首选”顺序/重量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
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
>