优化函数应用于R中的值表

tquggr8v  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(131)
`values <-    matrix(c(0.174,0.349,1.075,3.1424,0.173,0.346,1.038,3.114,0.171,0.343,1.03,3.09,0.17,0.34,1.02,3.06),ncol=4)    `

我尝试最大化数据集的总值,每行只取一个值,每列有相关成本
取决于:
1.每行使用一个值列。
1.每次使用列1的成本是4
每次使用列2的成本是3
每次使用列3的成本是2
每次使用列4的成本是1
总成本〈= 11
这些都是一个更大的数据集的替代值。我需要能够将其直接应用到数据集的所有行。
我一直在尝试使用lpSolve包,但没有成功。

`f.obj <- values
f.con <- c(4,3,2,1)
f.dir <- "<="
f.rhs <- 11

lp("max", f.obj, f.con, f.dir, f.rhs)`

我得到的解为"0"
我不知道如何以这样一种方式对此进行建模:每行选择一个值,然后在计算约束时使用不同的值。

ztyzrc3y

ztyzrc3y1#

看来问题是这样的:
1.我们有一个矩阵a [i,j],它有值,还有一个向量c [j],它有代价。
1.我们希望为每行选择一个值,以便:
a.总成本〈= 11
b.总价值最大化
1.为了建立一个数学模型,我们引入了二进制变量x[i,j] ∈ {0,1}

max sum((i,j), a[i,j]*x[i,j])
subject to 
     sum((i,j), c[j]*x[i,j]) <= 11  
     sum(j, x[i,j]) = 1   ∀i
     x[i,j] ∈ {0,1}

1.在R中实现。我在这里使用CVXR。

#
 # data
 # A : values
 # C : cost
 #

 A <- matrix(c(0.174,0.349,1.075,3.1424,0.173,0.346,1.038,3.114,0.171,0.343,1.03,3.09,0.17,0.34,1.02,3.06),ncol=4)

 C <- c(4,3,2,1)

 maxcost <- 11

 #
 # form a matrix cmat[i,j] indicating the cost of element i,j
 #    
 cmat <- matrix(C,nrow=dim(A)[1],ncol=dim(A)[2],byrow=T)

 #
 # problem:
 # pick one value from each row
 # such that total value of selected cells is maximized
 # and cost of selected cells is limited to maxcost
 #
 # model:
 # min sum((i,j), a[i,j]*x[i,j])
 # subject to
 #     sum((i,j), c[j]*x[i,j]) <= maxcost
 #     sum(j,x[i,j]) = 1    ∀i
 #     x[i,j] ∈ {0,1}
 #
 #

 library(CVXR)

 x = Variable(dim(A), name="x", boolean=T)

 p <- Problem(Maximize(sum_entries(A*x)),
          constraints=list(
            sum_entries(cmat*x) <= maxcost,
            sum_entries(x,axis=1) == 1
            ))

 res <- solve(p,verbose=T)
 res$status
 res$value
 res$getValue(x)*A

输出如下所示:

> res$status
[1] "optimal"

> res$value
[1] 4.7304

> res$getValue(x)*A
       [,1] [,2]  [,3] [,4]
[1,] 0.0000    0 0.000 0.17
[2,] 0.0000    0 0.343 0.00
[3,] 1.0750    0 0.000 0.00
[4,] 3.1424    0 0.000 0.00

原帖子中的描述不是很精确。例如,我假设我们需要从每一行中精确地选择一个单元格。如果我们只想"从每一行中最多选择一个单元格",那么替换

sum(j, x[i,j]) = 1   ∀i

作者

sum(j, x[i,j]) <= 1   ∀i
fnvucqvd

fnvucqvd2#

正如Steve提到的,lpSolve包需要一个目标函数,而不是一个矩阵。
例如,将矩阵转换为向量,并将问题转换为整数优化问题

obj <- as.vector(values)
f.con <- rep(f.con, each = 4)
r <- lp('max', obj, matrix(f.con, nrow = 1), f.dir, f.rhs, int.vec  = seq_along(obj))

#' Success: the objective function is 9.899925

相关问题