我几乎没有数学背景,正在尝试编写一个多目标优化函数。
我有以下3个向量:
text = TextBoxDedication.get("1.0",END).split("\n")
# Text auf dem Hintergund platzieren
lineCnt = 0
for line in text:
draw = ImageDraw.Draw(BackgroundDummy)
draw.text((IMG_POSITIONS[4][0],IMG_POSITIONS[4][1]+80*lineCnt), line, font=font)
print draw.size
lineCnt = lineCnt +1
BackgroundDummy = BackgroundDummy.resize(IMG_SIZES[2])
photo = ImageTk.PhotoImage(BackgroundDummy)
我的目标如下:找到最符合我要求的X值:1)最小化A,2)最大化B和3)最大化C。
这是我的代码:
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
结果如下:
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)
我的实施是否正确?我如何解释这些结果?我的理解非常有限,但本能地说这些数字与我最初的载体范围相比似乎不成比例......
答案 0 :(得分:0)
实施失败的方式如下:par[1] * A
是四个元素的向量,par[2] * B
和par[3] * [C]
也是如此。你的函数fun
首先计算三个向量的总和,然后对它的元素求和。
函数optim()
尝试查找向量par
的这些参数,这些参数返回函数的返回值是最低的。这意味着它最大化向量A的和乘以par[1]
并最小化向量B和C的和乘以par[2]
和{{1} }。
如果您只是最大化par[3]
并最小化par[1]
和par[2]
而没有其他限制,答案就会非常相似。数学答案将是无穷大,但似乎函数par[3]
达到最大可计算值,例如2.36 * 10 ^ 44(科学记数法)。
这种方式无法满足您的需求,需要以其他方式实施。
很难定义你真正想要做的事情:是A,B,C离散向量还是它们被认为代表函数,因为它们被绘制了?换句话说,你的解决方案应该使用来自这些向量的精确值或其他东提供此类信息后,可以在某处找到解决该问题的可能方案。
[编辑:在下面添加解决方案]
使用optim()
here进行离散优化时存在堆栈溢出问题。但是我觉得这次杀鼠太大了。
我会计算数据框中函数的值,并使用optim()
找到最佳选择:
max()
如果您只想学习一些内容,还可以在Google上找到一些使用# 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),]
的教程。