使用正整数参数优化

2024-05-06

我需要解决一个需要比较具有相同列数的两个矩阵的问题。其中之一被操纵,直到获得最佳匹配。我对两个矩阵之间的差异进行评分的方式非常复杂,我仍然需要最终确定它。目前我真正感兴趣的是找到一种仅适用于正整数的搜索/优化算法。我创建了一个简单的示例,其中包含一个简单的最大化函数。假设我有一个数据集 D。

 D <- data.frame(rbind(c(1,1,1),
                       c(1,1,0),c(1,1,0),c(1,1,0),c(1,0,0),
                       c(0,0,0),c(1,0,0),c(1,0,0),c(1,1,0),
                       c(1,0,0),c(1,1,1),c(1,1,0),c(1,0,0),
                       c(1,0,0),c(1,0,1)))

我想找出 Dx 的哪种重新排列给我带来最低的绝对差异。

Dx<-data.frame(rbind(c(1,1,0),c(1,0,0),c(0,0,0),c(1,1,0)))

所以我可以使用下面的函数完成所有可能的排列

    library(combinat)
    SPACE <- t(as.data.frame(list(permn(1:3))))
    f <- function(x){
      if(anyDuplicated(x)>0){return(0)}
      Dist<-NA
      for (i in 1:nrow(D)){
        Dist[i]<-sum(abs(Dx[,x]-t(D[i,])))} 
    return(sum(Dist))}
apply(SPACE,1,f)

并得到正确的结果。但是,这对于我实际使用的数据有两个缺点:

  1. 我必须指定 SPACE-所有可能的列顺序和
  2. apply遍历每个可能的排列并计算我的错误分数。

随着矩阵中列数的增加,A 和 B 都变得计算困难。我认为,在大多数计算机上,即使在一个 R 会话中保留数字 1 到 14 的所有可能排列也是不可能的。

我发现的一种优化算法是网格搜索。这开始解决 A。这意味着我不必指定 SPACE(即所有可能的排列),因此这是朝着正确方向迈出的一步,因为我想查看更大的数据集。

library(NMOF)
gridSearch(f, rep(list(seq(1,ncol(D))),ncol(D)))

但显然这并没有解决 B,因为它会经历每个可能的迭代。如果我的数据集非常大(假设有 15 列甚至更多列)怎么办?

请记住,我的参数只能是正整数(即它们是列号),是否有一种 R 算法可以让我在合理的时间内找到最佳的列顺序(或至少是一个好的近似值)(例如1-2 天),当我处理更大的数据集时?这可能看起来像一个愚蠢的例子,但它很好地模拟了我试图解决的问题。我试过了optim() with method="SANN",但无处可去。不幸的是,我的经验很少,所以如果您认为这是一个无法解决的问题,请告诉我。首先从一个更简单的数据集(行数很少但列很多)问题开始,您认为是否可以通过使用某种巧妙的优化来找到如上所示的 D2 的最佳列顺序?

   #D2
D<-cbind(D,D,D,D,D)
ncol(D)
Dx<-cbind(Dx,Dx,Dx,Dx,Dx)
#examples 
f(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15))
f(c(13,2,4,3,5,6,7,8,9,10,11,12,1,14,15))

编辑: 我的主要兴趣是了解如何使用在搜索过程中使用一系列独特正积分(基本上是排名)的优化算法,而不是解决这个特定问题。在这种情况下,我使用了一个简单的示例,以便很容易复制,但是我正在比较的两个数据集通常在行数和其他方面有所不同,我在这里没有详细说明......距离函数我' m 构建很好地处理了这个问题,因此了解如何使用 D2 将优化算法(例如下面建议的遗传算法)应用于上面的函数 f 是我目前的主要问题。


如果你的目标函数f必须真正被视为黑匣子,然后我们需要诉诸近似方法,例如遗传算法。这是一个使用以下解决方案gaoptim包,最大化f(p)在所有排列中p的列数Dx:

library(gaoptim)
myGA = GAPerm(f, ncol(Dx), popSize=10)
myGA$evolve(10)
myGA
# Results for 10 Generations:
# Mean Fitness:
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#    95.0   107.4   115.6   112.4   118.3   120.6 
# 
# Best Fitness:
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#     125     125     125     125     125     125
# 
# Best individual:
# [1] 3 1 2
# 
# Best fitness value:
# [1] 125

在本例中,它找到了最佳可能的解决方案,目标值为 125,但一般来说,无法保证遗传算法返回的解决方案的质量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用正整数参数优化 的相关文章

随机推荐