【问题标题】:multi-objective optimization with optim (in R)使用 optim 进行多目标优化(在 R 中)
【发布时间】:2016-10-17 05:23:02
【问题描述】:

我几乎没有数学背景,正在尝试编写一个多目标优化函数。

我有以下 3 个向量:

A = 0.4122487 0.3861316 0.3160613 0.2949684
B = 0.1407469 0.1828053 0.2088941 0.2143583
C = 0.2966363 0.1947112 0.1664350 0.1543946

我的目标如下:找出最能满足我要求的值 X:1) 最小化 A,2) 最大化 B 和 3) 最大化 C。

这是我的代码:

fun <- function(weights,A,B,C){
   fit = sum((weights[1] * A +
        weights[2] * B +
        weights[3] * C))
    return(fit)
}

# the weight of A (positive, since I want to minimise A)
Wa = 1
# the weight of B (negative, since I want to maximise B)
Wb = -0.5
# the weight of C (negative, since I want to maximise C)
Wc = -1.5
result <- optim(weights=c(Wa,Wb,Wc), fn = fun)

结果如下:

result$par = 2.365022e+44 -1.697108e+44 -9.150244e+43
result$value = -5.343856e+44

我的实现是否正确?我如何解释这些结果?我的理解非常有限,但本能地这些数字与我的初始向量范围相比似乎不成比例......

【问题讨论】:

  • 为什么对这个问题投反对票?

标签: r optimization


【解决方案1】:

答案:

实现失败的方式如下:par[1] * A 是一个包含四个元素的向量,par[2] * B par[3] * [C] 也是如此。您的函数fun 首先计算三个向量的和,然后对其中的元素求和。

函数optim() 试图找到向量par 的此类参数,使函数的返回值尽可能低。这意味着它将向量 A 乘以 par[1]sum 最大化,并将向量 B 和 C 乘以 par[2]par[3]sums 最小化。

当您只最大化par[1] 并最小化par[2]par[3] 而没有其他限制时,答案将非常相似。数学答案是无穷大,但似乎函数 optim() 达到了最大可计算值,例如 2.36 *10^44(科学记数法)。

这种方式不能满足你的需求,需要用其他方式实现。

解决办法:

很难定义您真正想做的事情:A、B、C 是离散向量还是应该代表函数,因为它们被绘制出来?换句话说,您的解决方案应该使用这些向量的精确值还是介于两者之间?提供此类信息后,可能会在某处找到解决该问题的可能方案。

[编辑:在下面添加解决方案]

使用optim()here 的离散优化存在堆栈溢出问题。但我觉得这次坦克太大了,杀不了老鼠。

我会在数据框中计算一个函数的值并使用max() 找到最佳选择:

# sample data:
A <- c(0.4122487, 0.3861316, 0.3160613, 0.2949684)
B <- c(0.1407469, 0.1828053, 0.2088941, 0.2143583)
C <- c(0.2966363, 0.1947112, 0.1664350, 0.1543946)
df <- data.frame(A = A, B = B, C = C)

#solution
df$fun <- df$A - df$B - df$C 
head(df)
df[df$fun == max(df$fun),]

如果你只是想学习一些东西,你也可以在 google 上找到一些使用 optim() 的教程。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2018-01-19
  • 2021-10-25
相关资源
最近更新 更多