是否有适用于Python的混合整数线性规划(MILP)求解器?
GLPK python可以解决MILP问题吗?我读到它可以解决混合整数问题.
我对线性编程问题很新.所以我很困惑,如果混合整数规划与混合整数线性规划(MILP)不同,则无法区分.
我正在研究一个中等大小的线性程序(70k x 10k稀疏约束矩阵)并且需要运行大量场景,在我当前的解决时间需要大约2,000个CPU小时.因为变化相对较小(最多改变目标函数的约10%,即c矩阵),使用热启动可以显着加快求解时间,但我无法找到快速热启动LP求解器蟒蛇.
我一直linprog
在使用Matlab和Python中的CVXOPT lp
求解器,使用CVXOPT中的GLPK单纯形求解器获得最佳性能.但是,即使使用GLPK可以进行热启动,GLPK的CXVOPT包装也不会实现热启动.虽然CVXOPT在其原生求解器中支持热启动,但这明显慢于GLPK中的冷启动.我无法在PuLP中找到热启动选项或在Python模块中找到热启动的其他参考.conelp
有没有人有经验适应/修补CVXOPT用GLPK做热启动,或者可以展示如何在其他Python优化包中做一个热门的开始?
我正在努力在OSX 10.8上编译PyGLPK.我已经通过自制软件安装了glpk和gmp.我已经验证/ usr/local/include中存在以下文件
gmp.h
gmpxx.h
glpk.h
Run Code Online (Sandbox Code Playgroud)
但我仍然得到以下错误.
python setup.py build
running build
running build_ext
building 'glpk' extension
clang -fno-strict-aliasing -fno-common -dynamic -I/usr/local/include -I/usr/local/opt/sqlite/include -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/include -Isrc -I/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/glpk.c -o build/temp.macosx-10.9-x86_64-2.7/src/glpk.o -m32
clang -fno-strict-aliasing -fno-common -dynamic -I/usr/local/include -I/usr/local/opt/sqlite/include -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/include -Isrc -I/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/lp.c -o build/temp.macosx-10.9-x86_64-2.7/src/lp.o -m32
In file included from src/lp.c:24:
src/kkt.h:30:3: error: unknown type name 'LPXKKT'
LPXKKT kkt;
^
src/lp.c:182:18: warning: implicit declaration of function 'lpx_read_model' is invalid …
Run Code Online (Sandbox Code Playgroud) 我试图安装sparkTable
在R 3.1.0依赖Rglpk
.我在系统上手动安装了GPLK并添加了libs文件夹,LD_LIBRARY_PATH
然后进入R install.packages("sparkTable")
程序.我在安装过程中遇到此错误.有任何想法吗?
* installing *source* package ‘Rglpk’ ...
** package ‘Rglpk’ successfully unpacked and MD5 sums checked
** libs
/bin/sh: line 0: cd: GLPK: No such file or directory
make: *** [GLPK.ts] Error 1
ERROR: compilation failed for package ‘Rglpk’
* removing ‘/opt/R/R-3.1.0/lib64/R/library/Rglpk’
ERROR: dependency ‘Rglpk’ is not available for package ‘sparkTable’
* removing ‘/opt/R/R-3.1.0/lib64/R/library/sparkTable’
Run Code Online (Sandbox Code Playgroud) 3天后,我无法将python程序打包成.exe文件。我试过 py2exe(它不断错过模块)和 PyInstaller。
这是复杂的部分。我的程序使用了许多额外安装的模块(coopr、pyomo、openpyxl、glpk、cbc、pyutilib、numpy 等)。这些反过来又导入了各种其他东西,我无法追踪它(PyInstaller 警告日志列出了 676 行丢失或可能不需要的模块。)
但是,我得到了(通过将“缺失”模块的导入添加到我的程序中)一个 .exe 版本,它通过双击或从命令行运行,没有打印任何错误。
问题是,程序什么都不做。我有一个包含在构建中的输入文件,我的程序读入该文件,进行一些(密集)计算,然后在同一目录中创建一个 .csv 输出文件。它作为 .py 文件工作。我的 .exe 什么也不做。
所以,如果你能告诉我出了什么问题,请继续。如果没有,我想知道任何有用的步骤或想法可以尝试。在这一点上,我已经用尽了可以从程序和文档中找到的反馈。
我使用64位Windows 10.我glpk-4.64
为Windows 下载.我将文件解压缩到我的文档中.我将此文件夹中的w64路径添加到Windows的环境变量中.我通过执行以下命令检查glpk是否在命令行中工作:
C:\Users\userz>glpsol
GLPSOL: GLPK LP/MIP Solver, v4.64
No input problem file specified; try glpsol --help
Run Code Online (Sandbox Code Playgroud)
所以我觉得glpk
安装得当.
然后我cvxopt
在命令行中使用它安装:
python -m pip install cvxopt
Run Code Online (Sandbox Code Playgroud)
然后安装cvxopt
.
当我做:
import cvxopt.glpk
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
import cvxopt.glpk
ImportError: No module named glpk
Run Code Online (Sandbox Code Playgroud)
那么,我该如何解决这个问题呢?
尝试安装 glpk 时出现以下错误。我尝试了很多方法来解决它,但我找不到解决方案
Collecting glpk
Using cached glpk-0.4.5.tar.gz (152 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing wheel metadata ... done
Building wheels for collected packages: glpk
Building wheel for glpk (PEP 517) ... error
ERROR: Command errored out with exit status 1:
command: 'c:\users\ruizm\appdata\local\programs\python\python38-32\python.exe' 'c:\users\ruizm\appdata\local\programs\python\python38-32\lib\site-packages\pip\_vendor\pep517\_in_process.py' build_wheel 'C:\Users\ruizm\AppData\Local\Temp\tmpk6uqubal'
cwd: C:\Users\ruizm\AppData\Local\Temp\pip-install-k_surgky\glpk
Complete output (12 lines):
running bdist_wheel
running build
running build_ext
building 'glpk' extension
creating build
creating build\temp.win32-3.8
creating build\temp.win32-3.8\Release
creating build\temp.win32-3.8\Release\src
C:\Program Files (x86)\Microsoft …
Run Code Online (Sandbox Code Playgroud) 我正在研究一些非常大规模的线性规划问题。(矩阵目前大约为 1000x1000,这些是“迷你”矩阵。)
我以为我的程序运行成功了,但我才意识到我得到了一些非常不直观的答案。例如,假设我要在一组约束 x+y<10 和 y+z <5 下最大化 x+y+z。我运行它并获得最佳解决方案。然后,我运行相同的方程,但有不同的约束:x+y<20 和 y+z<5。然而在第二次迭代中,我的最大化减少了!
我已经煞费苦心地经历了,并向自己保证约束加载正确。
有谁知道问题可能是什么?
我在关于 lpx_check_kkt 的文档中找到了一些东西,它似乎告诉你你的解决方案何时可能是正确的或高可信度(或低可信度),但我不知道如何使用它。
我尝试并收到错误消息 lpx_check_kkt 未定义。
我正在添加一些代码作为附录,希望有人能找到错误。这样做的结果是它声称已经找到了一个最佳解决方案。然而,每次我提高上限时,它都会变得不太理想。
我已经确认我的界限是上升而不是下降。
size = 10000000+1
ia = intArray(size)
ja = intArray(size)
ar = doubleArray(size)
prob = glp_create_prob()
glp_set_prob_name(prob, "sample")
glp_set_obj_dir(prob, GLP_MAX)
glp_add_rows(prob, Num_constraints)
for x in range(Num_constraints):
Variables.add_variables(Constraints_for_simplex)
glp_set_row_name(prob, x+1, Variables.variers[x])
glp_set_row_bnds(prob, x+1, GLP_UP, 0, Constraints_for_simplex[x][1])
print 'we set the row_bnd for', x+1,' to ',Constraints_for_simplex[x][1]
glp_add_cols(prob, len(All_Loops))
for x in range(len(All_Loops)):
glp_set_col_name(prob, x+1, "".join(["x",str(x)]))
glp_set_col_bnds(prob,x+1,GLP_LO,0,0)
glp_set_obj_coef(prob,x+1,1)
for x in range(1,len(All_Loops)+1):
z=Constraints_for_simplex[0][0][x-1] …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PuLP,但是需要50秒才能添加4000个约束(67个变量).解决问题只需要几分之一秒.
我们希望使用PuLP轻松测试一大堆问题上的几个求解器.
它应该花这么长时间服用PuLP吗?直接使用PyGLPK只需要一小部分时间,包括设置和求解,所以我希望不会.我该怎么做才能提高PuLP中这一步骤的效率?
更新
我的约束矩阵非常稀疏,并且通过仅包括非零系数,我能够将该特定问题的建立时间减少到4或5秒.我仍然能够编写自己的.lp或.mps格式的文件,用cbc或glpsol子进程解决问题,并且比PuLP更有效地解析解决方案,因为我可以在几毫秒内编写输入文件PuLP需要几秒钟.我仍然不确定为什么会这样.
我正在使用 cvxpy,自从更新到 1.0.6 以来,我在调用 GLPK 时得到了不需要的输出。
import cvxpy as cvx
x = cvx.Variable(2)
p = cvx.Problem(cvx.Minimize(x[0]), [x[0] + x[1] == 1, x[0] - x[1] >= 1])
p.solve(solver = cvx.GLPK)
Run Code Online (Sandbox Code Playgroud)
在 IPython3 中,这会创建输出
GLPK Simplex Optimizer, v4.61
2 rows, 2 columns, 4 non-zeros
0: obj = 0.000000000e+00 inf = 2.000e+00 (2)
1: obj = 1.000000000e+00 inf = 0.000e+00 (0)
* 2: obj = 1.000000000e+00 inf = 0.000e+00 (0)
OPTIMAL LP SOLUTION FOUND
Out[5]: 1.0
Run Code Online (Sandbox Code Playgroud)
在 0.4.11 中,我只得到了1.0
打印,我想恢复这种行为。对于其他求解器,有该verbose
选项,但对于 …