
Rdonlp2包是R中解决非线性规划问题的利器, 其约束条件可为线性的或非线性的. 使用它可以很轻松地求解NLP问题, 几乎是偷懒不想多码代码时的不二选择. Rdonlp2包实际上是Prof. Peter Spellucci的DONLP2在R环境下的一个包装, 但目前似乎Spellucci的主页上写着要求必须写封email才能取得DONLP2. 而Rdonlp2包的作者Ryuichi Tamura在更新到版本0.3-1后也不再公开放出此包的下载. 我在CRAN上翻遍, 一无所获. R-help上还有人说给R包作者发邮件杳无回音云云 .. (谁叫这包从CRAN撤下两年后仍然挂在CRAN Task Views的Optimization页面上呢) 后来, 俺无意中在Rmetrics项目的SVN trunk上找到了此包的源代码. 编译之, 发现由于年代久远, 这包对目前版本的R有点水土不服. 于是上CRAN下了一圈旧发行版, 从R 2.11.x依次递减版本号进行实验, 结论是能够正常运行此包的R最高版本为R 2.6.2.
R对于数据类型的检查随着其版本号的升高而更加严格, 在使用Rdonlp2包求解问题时, 从R 2.7.0版起将出现一个Warning:
Warning message:
In all(lapply(nlin, function(e) is.function(attr(e, “gr”)))) :
coercing argument of type ‘list’ to logical
从R 2.9.0版本开始,除了上面的Warning之外,还会出现一个Error:
Error in tryCatchList(expr, classes, parentenv, handlers) :
SET_VECTOR_ELT() can only be applied to a ‘list’, not a ‘character’
第一个问题源于donlp2.R第59行, 相对比较好解决; 第二个问题则源于Rdonlp2.c, 这文件大约600行吧. 因为我不懂C, 所以希望哪位大侠能够费心手工hack一下, 让它能够在较新的的R版本上正常跑起来. 这里我就偷个懒, 不做任何修改. 直接装个R 2.6.2就可以正常使用啦.
这里放上源码和自己编译的Rdonlp2包.
Package source: Rdonlp2_0.3-1.tar.gz
Windows binary: Rdonlp2_0.3-1.zip
编译环境: R 2.6.2 + RTools 2.7 + Win Server 2k3 DataCenter SP2
R 2.6.2下测试通过, 使用时无上述Error和Warning, 加载包时亦无”编译环境版本号高”的Warning.
Read The “Friendly” Manual: http://arumat.net/Rdonlp2/
请注意: DONLP2和Rdonlp2只能用于学习和研究, 商业用途需经作者授权.
放几句英文自勉.
The Six Tenets:
- Access to computers – and anything which might teach you something about the way the world works – should be unlimited and total. Always yield to the Hands-On imperative!
- All information should be free.
- Mistrust authority – promote decentralization.
- Hackers should be judged by their hacking, not bogus criteria such as degress, age, race, or position.
- You can create art and beauty on a computer.
- Computers can change your life for the better.