用R求解约束二次规划

时间:2015-11-15 15:01:51

标签: r optimization constraints quadprog quadratic-programming

我真的很喜欢R,但有时它确实让我很头疼......

我有以下简单的二次最小化问题,可以在Excel中立即制定和解决(点击图片放大):

enter image description here

![enter image description here

问题本身非常简单:我想通过在所有{(w1^2+w2^2)/2w1w2的约束条件下找到bY*(w1*X1+w2*X2+b) >= 1quadprog的最佳组合来最小化w1 1}}

我知道有w2软件包可以解决这些问题,但我发现它太不直观了,我无法正确指定问题:-(我讨厌说它但Excel似乎是更适合指定这样的优化问题: - ((

我的问题
如何正确地制定上述问题,以便可以用R(无论哪个包)解决,并且程序达到bdata <- matrix(c(2.947814,6.626878, 1, 2.530388,7.785050, 1, 3.566991,5.651046, 1, 3.156983,5.467077, 1, 2.582346,4.457777,-1, 2.155826,6.222343,-1, 3.273418,3.520687,-1),ncol=3,byrow=T) colnames(data) <- c("X1","X2","y") b的正确值(如同见上图)。请不要只发布链接,但请提供有效的实际代码。如果您能够对代码进行评论,那就太好了,这样就可以清楚地了解为什么要做你做的事情。谢谢!

必要的数据在这里:

[ForeignKey("AppForm")]
public int AppFormId { get; set; }

附录
有些人根据我的要求冒犯了提供代码(而不仅仅是链接)。我为此道歉并给出了我的理由,到目前为止我在答案中没有找到任何好的方法。更深层次的原因是,public static class AppFormManager { public static ApplicationUser GetCurrentUser() { ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); if (user != null) { AppForm form = new AppForm(); ApplicationDbContext db = new ApplicationDbContext(); AppForm ap = db.AppForms.Where(af => af.Id == user.AppFormId).Include("Answers").Include("Documents").SingleOrDefault(); if (ap == null) { var AppForm = new AppForm { PercentComplete = 0, Reviewed = false, Status = "Incomplete", SignedOff = false, Completed = false, LastPageCompleted = 0 }; user.AppForm = AppForm; } else { user.AppForm = ap; } return user; } return null; } public static bool SaveCurrentUser() { ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); if (user == null) { return false; } var uManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); uManager.UpdateAsync(user); return true; } } 仅在约束而非目标函数中,问题是不寻常的。所以我仍然认为这个问题非常适合SO。

1 个答案:

答案 0 :(得分:4)

实际上,问题有点棘手,因为b仅存在于不等式约束矩阵中,而不存在于目标函数中。因此,二次规划问题中的矩阵只是正半定,而不是正定。

因此,我的方法是将对应于b的矩阵条目设置为非常小的值 - 在我的情况下1e-9。其他更熟悉这种优化问题的人可能知道如何正确解决问题......

计算solve.QP输入

c1=data[,"X1"]*data[,"y"]
c2=data[,"X2"]*data[,"y"]

#I use 1e-9 for the b entry
Dmat=matrix(`[<-`(numeric(9),c(1,5,9),c(1,1,1e-9)),3,3)
dvec=rep(0,3)
Amat=cbind(c1,c2,data[,"y"])
bvec=rep(1,nrow(Amat))

使用solve.QP

解决
library(quadprog)
sol=solve.QP(Dmat=Dmat,dvec=dvec,Amat=t(Amat),bvec=bvec)$solution
sol
#[1]   2.903910   1.201258 -14.734964

与excel相同。