- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 ompr
包学习在 R 中拟合线性整数规划优化模型,该包是一位同事之前使用 CPLEX/GAMS 拟合的(具体而言,此处描述的模型:Haight et al. 2021 ).我在我大学的 Linux super 计算服务器上运行我的实现,它有 248gb 的内存,我认为这足以完成这项工作。
这是我的代码和服务器故障报告的输出:
#Read in the necessary pre-generated data and packages
library(pacman); library(dplyr); library(ROI); library(ompr); library(ompr.roi)
n.ij = readRDS(file="nij1.rds") #An indexing vector.
B = 10 #Budget constraint--inspect only 10 lakes maximum
#Initialize model prior to setting the objective.
mod1 = MILPModel() %>%
add_variable(u[i, j], type = "binary", i = 1:n.ij, j = 1:n.ij) %>%
add_variable(x[i], type = "binary", i = 1:n.ij) %>%
add_variable(x[j], type = "binary", j = 1:n.ij) %>%
add_constraint(x[i] + x[j] >= u[i,j], i = 1:n.ij, j = 1:n.ij) %>%
add_constraint(sum_expr(x[i], i = 1:n.ij) <= B)
#Read in the relevant adjacency matrix of boat movements between every pair of lakes.
boats.n.ij = readRDS(file="boatsnij1.rds")
#Some system and object size info.
system(paste0("cat /proc/",Sys.getpid(),"/status | grep VmSize"))
VmSize: 13017708 kB
object.size(mod1)
6798778288 bytes
#Now, set objective with this specific boats.n.ij file.
mod1.full = mod1 %>%
set_objective(sum_expr(u[i,j] * boats.n.ij[i, j], i = 1:n.ij, j = 1:n.ij))
Error in subCsp_ij(x, i, j, drop = drop) :
Cholmod error 'problem too large' at file ../Core/cholmod_sparse.c, line 89
Calls: %>% ... [ -> callGeneric -> eval -> eval -> [ -> [ -> subCsp_ij
Execution halted
为了创建可重现的示例,可以按如下方式生成 n.ij
和 boats.n.ij
的模拟版本:
library(Matrix)
boats = rpois(7940*7940, 2)
keep = sample(c(0,1), 7940*7940, replace=T, prob = c(0.8, 0.2))
boat.dat = boats*keep
boats.n.ij = matrix(boat.dat, nrow=7940, ncol=7940)
diag(boats.n.ij) = 0
boats.n.ij = Matrix(boats.n.ij, sparse = T)
boats.n.ij[1:10, 1:10]
n.ij = 1:7940
为什么我无法将目标添加到我的模型中?是否只是我暗示存在三个非常大的矩阵(决策矩阵 u
、boats.n.ij
矩阵及其乘积矩阵)?是因为模型已经是一个大约6.8gb的文件了吗?我遇到的 R 是否对内存或对象大小施加了上限?难道这些功能就不能考虑具有这么多决策点的目标吗?
我可以确认我已经能够在 boats.n.ij
的一个非常小的子集上运行模型的缩小版本,优化得很好,所以我不认为这是我的模型规范的问题,但我可能是错的......我还应该明确声明我对不涉及在 R 中解决这个模型的解决方案不感兴趣,因为这是这里的明确目标。但是,如果有更强大的软件包可用,我愿意使用其他软件包(尽管我喜欢这个软件包)。
注意:与我引用的论文不同,我已经不再需要我的同事使用的名为 b.ij
的向量,所以这不是这里的问题。
编辑:请注意,@nicola 对目标的改革将设定并解决,但原始约束和/或变量将不再与它具有相同的关系,因此它适合与我想要的不同的模型适合。在最初的构造中,x[i] 中最多只有 10 个值,因此决策变量 u[i,j] 中 i 的最多 10 个唯一值将被允许为 1s,这要归功于涉及我们的约束预算参数 B
。在@nicola 的版本中,u[i,j] 中允许 i 的 10 个以上的唯一值是 1。实际上,至少我不清楚最初编写的约束如何与@nicola 的目标相互作用(如果有的话)。但是,我怀疑像@nicola's 这样的目标肯定可以用来利用我的 boats.n.ij 矩阵的稀疏性以避免“问题太大”错误,但它需要相应地修改变量和/约束.我更改了问题的标题,以便更清楚地了解我在寻找什么——我想避免错误但在其他方面适合等效模型。
第二次编辑:@nicola 的解决方案毕竟有效!但是,自从我发布此问题以来,由于对 ompr
的更新,变量和约束需要进行一些修改。请参阅以下玩具示例:
library(Matrix)
library(slam)
library(dplyr)
library(tidyr)
library(ROI)
library(ompr)
library(ompr.roi)
library(Rglpk)
library(ROI.plugin.glpk)
library(lattice)
set.seed(101)
N = 500
boats = rpois(N*N, 2)
keep = sample(c(0,1), N*N, replace=T, prob = c(0.97, 0.03))
boat.dat = boats*keep
boats.n.ij = Matrix(boat.dat, nrow=N, ncol=N, sparse =T)
diag(boats.n.ij) = 0
boats.n.ij[1:10, 1:10]
n.ij = N
B = 5
mod1 = MIPModel() %>%
add_variable(u[i, j], type = "binary", i = 1:n.ij, j = 1:n.ij) %>%
add_variable(x[i], type = "binary", i = 1:n.ij) %>%
add_variable(y[j], type = "binary", j = 1:n.ij) %>%
add_constraint(x[i] == y[j], i = 1:n.ij, j = 1:n.ij, i == j) %>%
add_constraint(sum_over(x[i], i = 1:n.ij) <= B) %>%
add_constraint(u[i,j] <= x[i] + y[j], i = 1:n.ij, j = 1:n.ij)
boatsSTM = as.simple_triplet_matrix(boats.n.ij)
#setting the objective function
mod.2nd = mod1 %>% set_objective(sum_over(u[boatsSTM$i[k], boatsSTM$j[k]] * boatsSTM$v[k], k = 1:length(boatsSTM$i)))
mod.2nd.solved = mod.2nd %>%
solve_model(with_ROI("glpk", verbose=TRUE))
testB = get_solution(mod.2nd.solved, u[i,j])
test2B = pivot_wider(testB, names_from = j, values_from = value) %>% dplyr::select(-variable, -i)
test3B = as.matrix(test2B, nrow=100)
levelplot(test3B)
最佳答案
一次尝试:
require(slam)
boatsSTM<-as.simple_triplet_matrix(boats.n.ij)
...
#setting the objective function
set_objective(sum_expr(u[boatsSTM$i[k], boatsSTM$j[k]] * boatsSTM$v[k], k = 1:length(boatsSTM$i)))
我们利用矩阵的稀疏性。在一个简单的三元组矩阵中,您只需列出不为零的值,这意味着如果未列出的元素等于零。这些值用 (i, j, v)
三元组表示,其中 i
表示行索引,j
表示列索引, >v
值。因此,例如,(2, 4, 10.32)
三元组表示 m[2, 4] = 10.32
。
在您的 sum_expr
行中,我们利用它并只添加不为零的元素。我们不会将 u
的每个元素与 boats
的每个元素相乘,因为大多数都是零并且与总和无关;相反,我们只是对重要的元素执行上述操作。
slam
包实现了简单的三元组矩阵,它的根是 i
、j
和 的列表v
值。
关于r - 在 R 的 ompr 包中,如何重新表述我的目标/约束/变量以避免 "problem too large"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70276554/
通过终端,您可以使用命令 - “SetFile -a B 文件名” 以编程方式,我认为我应该通过[[NSFileManager defaultManager] createDirectoryAtPat
嗨,正在尝试书中的一些示例:Practical Graph mining with R对于子图挖掘: library(subgraphMining) library(igraph) graph1 =
代码中的相同问题: class Foo { int getIntProperty () { ... } CustomObject getObjectProperty () { ... }
所以这可能是一个愚蠢的问题,但它已经困扰我一段时间了。 使用 React,我创建了两个组件(Buttons.js 和 Message.js),每个组件都有一个导出。但是,现在我希望将这两个组件用作 n
从今天早上开始,我发现我无法再从某个范围安装任何 NPM 包(或任何具有依赖项的包)。例如,如果我输入 npm i webpack 我会收到以下错误... npm ERR! code E401 npm
我在这里搜索过,Angular 2, @ngtools/webpack, AOT ,但对我不起作用。我运行了 npm install 命令。我正在做的是创建一个新的 Angular 2 项目。当我运行
情况: 我有一个 Swift 包,将其命名为 lib。 lib 位于其自己的存储库中。在lib的仓库中,有一堆本地包;也就是说,这些包是在 lib 中定义的,使用本地路径依赖格式 .package(p
我想在工作中学习和使用nodejs,但是在使用 de npm 命令安装模块/包时遇到网络问题。我是否可以使用我的家用计算机构建完整的 Node js 包,然后将其安装在另一台计算机(我的工作场所计算机
我需要将一些 .tar.bz2 格式的非 Python 包转换为 Anaconda/miniConda .egg 文件并安装它们。为此,我需要一个适用于 Windows 的 bld.bat 文件。互联
我需要共享库文件 libthrift-0.9.3.so 作为其他包的依赖项。我在构建 thrift-0.9.3 包时看到编译问题(我确实从 https://thrift.apache.org/down
我尝试在 R 版本 3.5.0 中安装“arcgisbinding”包。但是我失败了,得到以下错误和警告。 Installing package into ‘C:/Users/Lenovo/Docum
我尝试在 R 版本 3.5.0 中安装“arcgisbinding”包。但是我失败了,得到以下错误和警告。 Installing package into ‘C:/Users/Lenovo/Docum
我试图在 flutter 中测试这个应用程序,但我无法运行该应用程序,因为出现此错误“名称‘Page’在库‘package:burn_off/widgets/page.dart’和‘package’中
试图理解和学习如何编写包...用我一直使用的东西进行测试,记录... 您能帮我理解为什么“日志”变量不起作用...并且屏幕上没有日志记录吗? 谢谢! 主要文件: #!/opt/local/bin/py
我尝试运行此使用 Google 云的代码。 import signal import sys from google.cloud import language, exceptions # creat
我想知道是否有人找到了一个很好的 R 包来分析眼动追踪数据? 我遇到了 eyetrackR,但据我所知,没有可用的英文支持文档: http://read.psych.uni-potsdam.de/pm
我正在 R 上制作一个包。我有两个函数共享一个变量(全局)。 如何将其导入到包中? 例如, m<-0 f<-function() { m <- m+1 } g<-function() { m <- m
我用 C 为 Lua 编写了很多模块。每个模块都包含一个 Lua 用户数据类型,我像这样加载和使用它们: A = require("A") B = require("B") a = A.new(3,{
我正在尝试在 R 中的 Ubuntu 上安装 xlsx 包,以便使用允许在 R 中插入链接然后将它们导出到 Excel 的功能。 话虽如此,我根本无法安装该软件包。 显然它必须与 rJava 一起使用
我想在 Haskell 中做一些蒙特卡洛分析。我希望能够编写这样的代码: do n <- poisson lambda xs <- replicateM n $ normal mu sigma
我是一名优秀的程序员,十分优秀!