Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 正整数参数优化_R_Permutation_Mathematical Optimization_Genetic Algorithm_Maximize - Fatal编程技术网

R 正整数参数优化

R 正整数参数优化,r,permutation,mathematical-optimization,genetic-algorithm,maximize,R,Permutation,Mathematical Optimization,Genetic Algorithm,Maximize,我需要解决一个需要比较两个列数相同的矩阵的问题。其中一个被操纵,直到获得最佳匹配。我对两个矩阵之间的差异进行评分的方式非常复杂,我仍然需要完成它。我现在真正感兴趣的是找到一种只适用于正整数的搜索/优化算法。我创建了一个简单的示例,其中有一个简单的函数可以最大化。假设我有一个数据集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),

我需要解决一个需要比较两个列数相同的矩阵的问题。其中一个被操纵,直到获得最佳匹配。我对两个矩阵之间的差异进行评分的方式非常复杂,我仍然需要完成它。我现在真正感兴趣的是找到一种只适用于正整数的搜索/优化算法。我创建了一个简单的示例,其中有一个简单的函数可以最大化。假设我有一个数据集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)))
但很明显,这并没有解决B,因为它经历了每个可能的迭代。如果我的数据集非常大,比如说15列甚至更多列,该怎么办

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

D据我所知,您正在搜索从一组候选列到一组目标列的最佳分配,将候选列与目标列匹配会产生一些成本。您正在搜索一对一匹配,以最小化总体成本

这就是所谓的分配问题,这是运筹学中的一个经典问题。您的网格搜索方法将具有指数运行时间(您需要搜索所有可能的分配),但有更有效的方法来解决此问题,其中许多方法依赖于线性规划

您可以使用
lp.assign
函数从
lpSolve
包中解决R中的问题,提供矩阵列之间的成对距离:

# Build cost matrix
costs <- as.matrix(dist(t(D), method="manhattan"))
costs
#    X1 X2 X3
# X1  0  7 11
# X2  7  0  6
# X3 11  6  0

# Solve assignment problem
library(lpSolve)
solution <- lp.assign(costs)$solution
apply(solution > 0.999, 2, which)
# [1] 1 2 3
#构建成本矩阵

成本如果您的目标函数
f
必须真正被视为一个黑箱,那么我们需要求助于近似方法,如遗传算法。这里是一个使用
gaoptim
包的解决方案,它最大化了
Dx
列的所有排列
p

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,但通常无法保证遗传算法返回的解决方案的质量。

也许遗传算法方法可以帮助您?费尔南多,非常感谢。您能告诉我如何将这种方法应用于上述f函数吗?请查看
gaoptim
包中的
GAPerm
函数,它执行置换优化(类似TSP的问题)。谢谢。我已经看过了,但我不太明白如何告诉函数我需要正整数…我会看一看,看看我能想出什么,然后我会再次发布在这里。非常感谢你的回答。不幸的是,我的距离算法着眼于不同数据集行之间的距离,非常复杂,所以我无法创建一个整洁的成本矩阵。你认为有没有一种方法可以在某种优化引擎中使用上面的f函数?如果这听起来有点奇怪,我深表歉意,再次感谢您尝试找到一个更简单的解决方案,但我需要依赖一个距离函数,它为给定的排列返回一个数字(有点像上面的f)。您将使用的工具实际上取决于代价函数本身。通常我会用线性规划或整数规划来解决这样的问题,但这是否合适取决于函数。我建议编辑这个问题以提供更多细节,因为您的最小可复制示例似乎“太小了”。谢谢您的评论。我试着给出一个更好的例子。我想知道你概述的技术是否可以用于我所需要的。假设我们选取Dx作为参考,然后确定Dx与自身200列重新排列之间的距离:让我们将这些DxR1称为DxR200,其中DxR200是Dx的重新排列,它与原始Dx最为不同。然后,我们可以在前200个解决方案上运行函数f(可能使用optim?)-如果DxR200是根据f重新排列的“最佳”列,那么我们可能需要重复该过程,但这次以DxR200为参考。然后,我们重复该过程,直到达到最小值……您需要将其表述为优化问题,并使用
lpSolve
包中的
lp
函数而不是
lp.assign
便利函数进行求解。你可能会把它作为一个新问题发布,并从社区得到一些帮助。
   #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))
# Build cost matrix
costs <- as.matrix(dist(t(D), method="manhattan"))
costs
#    X1 X2 X3
# X1  0  7 11
# X2  7  0  6
# X3 11  6  0

# Solve assignment problem
library(lpSolve)
solution <- lp.assign(costs)$solution
apply(solution > 0.999, 2, which)
# [1] 1 2 3
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