首页 > 解决方案 > 使用 constOptim 在 R 中进行约束优化

问题描述

我试图找到这个目标函数的最大值:

f(x1,x2,x3) = 1300x1 + 600x2 + 500x3

受以下约束

300x1 + 150x2 + 100x3 <= 4,000

90x1 + 30x2 + 40x3 <= 1,000

x1 <= 5

x1, x2, x3 >= 0

下面是我正在使用的代码,它没有返回我正在寻找的值。变量的输出为 9.453022e-12 3.272252e-12 5.548419e-14,总值为 -1.428002e-08。

我是 R 新手。我做错了什么?谢谢你。

f=function(x) -(1300*x[1]+600*x[2]+500*x[3]) # minimize -f(x,y,z) 

inequalities=function(x){ #define the ineqaulities function
  h=0
  h[1]=-(300*x[1]+150*x[2]+100*x[3]-4000)
  h[2]=-(90*x[1]+30*x[2]+40*x[3]-1000)
  h[3]=-(1*x[1]+0*x[2]+0*x[3]-5)
  return(h)}

g=function(x){ #x,y,z > 0
  h=0
  h[1]=x[1]
  h[2]=x[2]
  h[3]=x[3]
  return(h)}

p0=c(0,0,0) #give the starting point

y=constrOptim.nl(p0,f,hin=inequalities,heq=g); 

print(y$par)
print(y$value)

标签: roptimizationlinear-algebralinear-programming

解决方案


文档说:

heq: a vector function specifying equality constraints such that heq[j] = 0 for all j

x[1],x[2],x[3] >= 0因此,您尝试指定的下限实际上被解释为x[1],x[2],x[3] = 0. 因此解决方案:9.453022e-12、3.272252e-12 5.548419e-14。您的下限需要包含在hin.

请注意,对于线性问题,有更好的线性求解器。将线性问题传递给非线性求解器并不是最优的。


推荐阅读