我有一个容易陈述的问题,想知道是否有智能解决方案而不是粗略计算。
鉴于以下向量A <- c(30,20,150,50,30,70)
总和为350,我需要向元素分配(添加)5个额外单位,从而产生355的总和。
我仅限于整数调整。我希望分配这5个单元,以便最小化调整后元件的百分比变化的最大值。即,在这个意义上,我希望每个元素的调整都是最公平的。例如,添加矢量
c(0,0,3,0,0,2)
会产生一个新的&#34; A(A.New):30 20 153 50 30 72
每个元素的百分比变化(从A到A.New)是: 0.000000 0.000000 2.000000 0.000000 0.000000 2.857143 最大变化 2.857143
再次通过调整评估
c(0,0,4,0,0,1)
得出A.New为30 20 154 50 30 71
和百分比的变化
0.000000 0.000000 2.666667 0.000000 0.000000 1.428571
最大百分比变化为 2.666667
因此c(0,0,4,0,0,1)
将是首选(但尚未达到最佳状态。)
c(0,0,3,1,0,1)
的调整会使元素的最大百分比变化达到最小值 2.000000 。这似乎是最佳解决方案。
关于重复元素值(关系)的情况,或者实际上所有具有相同价值的元素的情况表明我可能需要随机化调整分布,或者包括指导如何最佳分配的次要标准,这只是受限制的野兽的本质。但我必须将这些视为特殊情况。一种想法是在解决之前随机抖动A中的重复值,例如,然后在结束时移除抖动。但是,这不是主要问题。
我一直在考虑使用lpSolve
作为潜在解决方案,但目标函数为&#34;最大值的最小值&#34;是有问题的。
我可以为此创建一个自定义且可能很复杂的算法,但也许我忽略了更简单的方法来解决这个问题?
(请注意,实际上,正在调整的矢量可能有数百个元素。)
答案 0 :(得分:0)
这是一种使用百分比增加矩阵的方法。我把它放到一个函数中,它带有一个向量'x'和你希望添加的整数'N'(解释见注释)。
Allocate_Int <- function (x,N) { # x is vector, N = Number of Integers
p <- 100/x # Percentage increase by 1
m <- p %o% c(1:N) # create a matrix of increased percentage
m1 <- m <= m[order(m)][N] # find the N-th lowest numbers in T/F matrix
return(rowSums(m1)) # and return the nr of TRUE values per item.
}
它适用于你问题的例子:
A <- c(30,20,150,50,30,70)
Allocate_Int(A,5)
[1] 0 0 3 1 0 1
如果存在关系,则返回的向量必须包含许多值:
Allocate_Int(c(1,1),3)
[1] 2 2
如果要查找关系,请使用:
vec1 <- c(10,20,20,50,100)
N <- 10
Allocate_Int(vec1,N)-Allocate_Int(vec1,N-1)
[1] 0 0 0 1 1