coin-or/cbc多problem并行求解线程阻塞问题

本文介绍了如何在Coin-OR的开源MILP求解器CBC中解决并行求解阻塞问题,重点讲解了在Windows和Linux环境下通过CMake编译时添加CBC_THREAD_SAFE标志,以及针对不同平台的编译步骤。

背景

Cbc是Coin-OR研发的开源MILP求解器,默认编译选项实际使用时,若在外部构建多个模型并行求解,可能会出现求解阻塞的问题。

其主要原因是默认未开启:

CBC_THREAD_SAFE

使用CMake编译(Windows)

【从零开始】coin-or/CoinUtils Osi Clp Cgl Cbc源码构建debug(CLion/CMake)_ymzhu385的博客-优快云博客

在CMakeList.txt中已经有类似的定义:

add_definitions("-DCBC_THREAD_SAFE")

若需要自己使用CMake编译的同学可以加上该命令

Linux 下编译

以Cbc 2.10.3 为例,默认便以流程为下:

# 解压所有*tar.gz文件
ls *.tar.gz | xargs -n1 tar xzvf
unzip Cbc-releases-2.10.3.zip
cp -rf Clp-releases-1.17.6/Clp ./Cbc-releases-2.10.3
cp -rf Cgl-releases-0.60.3/Cgl ./Cbc-releases-2.10.3
cp -rf CoinUtils-releases-2.11.4/CoinUtils ./Cbc-releases-2.10.3
cp -rf Osi-releases-0.108.6/Osi ./Cbc-releases-2.10.3
目前尝试在gcc/g++ 4.4.7的版本下可以编译成功

cd Cbc-releases-2.10.3
# 由于存在依赖,直接使用make&make install可能会出现问题
# arm 架构: ./configure -C --build=arm-linux
./configure -C 
make
make install

在生成makefile时使用如下语句即可

 ./configure -C CXXFLAGS="-DCBC_THREAD_SAFE"

<think>好的,我现在要解决用户在Ubuntu系统中安装CoinOR库时遇到的无法添加PPA的问题,以及编译时出现的cppad/ipopt/solve.hpp文件未找到的错误。用户之前尝试过安装CppAD和Ipopt,但遇到了头文件缺失的问题,现在又提到添加PPA时出现错误,提示“~coin-or用户或团队不存在”。我需要结合用户提供的引用信息和他之前的交互历史,找到合适的解决方案。 首先,用户提到无法添加CoinOR的PPA,导致安装失败。这可能是因为PPA名称变更或不再维护。在引用[2]中,用户提到在arm环境下安装Ipopt需要外网,可能涉及到不同的仓库配置。引用[3]显示用户手动下载并编译了HSL库,这可能是因为某些依赖需要手动处理。引用[4]给出了一个CMakeLists.txt的例子,说明用户可能在使用CMake构建项目时遇到链接问题。 根据用户之前的回答,步骤包括安装系统依赖、添加PPA安装Ipopt、源码安装CppAD等。但现在添加PPA失败,需要替代方法。可能的原因包括PPA地址错误或系统版本不支持。例如,旧的PPA可能不支持较新的Ubuntu版本,或者用户系统架构不同(如ARM)。 解决方案可能需要绕过PPA,直接从源码编译Ipopt,这样能确保兼容性,尤其是对于ARM环境。同时,确保CppAD正确链接到Ipopt的头文件和库。用户之前的步骤中,CppAD的CMake配置指定了Ipopt的路径,可能需要调整。此外,手动安装HSL库(引用[3])可能也是必要的步骤,因为某些依赖可能无法通过包管理器获取。 另外,用户提到的错误信息提到coin/IpIpoptApplication.hpp缺失,这通常是因为编译器找不到Ipopt的头文件路径。可能需要手动指定包含路径和链接库,如使用-I和-L参数,或者在CMake中正确设置。 总结下来,步骤可能包括:解决PPA问题、源码安装Ipopt、处理依赖(如HSL)、正确安装CppAD并配置路径,最后验证安装。同时,针对ARM架构,可能需要额外的配置或编译选项。 现在需要将这些步骤具体化,确保用户能够逐步执行,并处理可能出现的依赖问题或路径错误。同时,需要验证各步骤的正确性,确保用户能够成功编译项目。</think>### 分步解决方案:解决Ubuntu中CoinOR PPA添加失败及头文件缺失问题 --- #### **1. 替代PPA添加失败问题** 当遇到`sudo add-apt-repository ppa:coin-or/coinor`报错**"用户/团队不存在"**时,说明官方PPA已失效(CoinOR项目已迁移至新仓库)。需改用以下方法: ```bash # 手动添加新仓库(适用Ubuntu 20.04+) sudo apt install software-properties-common sudo add-apt-repository universe sudo apt-add-repository -y 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal universe' sudo apt update ``` --- #### **2. 源码编译安装Ipopt(推荐)** 若仍无法添加PPA,或需要兼容ARM架构(如树莓派),直接源码编译更可靠: ```bash # 安装编译依赖 sudo apt install git g++ gfortran cmake pkg-config liblapack-dev libmetis-dev # 下载Ipopt源码 git clone https://github.com/coin-or/Ipopt.git cd Ipopt ./configure --prefix=/usr/local # 若为ARM架构,添加 --build=arm-linux make -j$(nproc) sudo make install ``` --- #### **3. 手动安装HSL线性求解器(关键步骤)** Ipopt依赖HSL库,但需单独获取(引用[3]): 1. 访问[COIN-HSL官网](https://www.hsl.rl.ac.uk/ipopt/)申请`coinhsl-x.x.x.tar.gz`(需学术邮箱)。 2. 解压并重命名为`coinhsl`,复制到Ipopt源码目录: ```bash cp -r coinhsl Ipopt/ThirdParty/HSL/ cd Ipopt/ThirdParty/HSL ./configure --enable-loadable-library make && sudo make install ``` --- #### **4. 安装并配置CppAD** 确保CppAD正确链接到自定义安装的Ipopt(引用[4]): ```bash git clone https://github.com/coin-or/CppAD.git cd CppAD mkdir build && cd build cmake .. -Dcppad_prefix=/usr/local \ -Dipopt_prefix=/usr/local # 指定自定义Ipopt路径 make -j$(nproc) sudo make install ``` --- #### **5. 验证安装并修复头文件路径** 创建测试文件`test.cpp`: ```cpp #include <cppad/ipopt/solve.hpp> #include <coin/IpIpoptApplication.hpp> // 验证Ipopt头文件 int main() { return 0; } ``` 编译命令(手动指定路径): ```bash g++ test.cpp -o test \ -I/usr/local/include/coin \ -I/usr/local/include/cppad \ -L/usr/local/lib -lipopt -lcoinmumps -lcoinhsl ``` --- #### **6. CMake项目配置(关键)** 在`CMakeLists.txt`中显式指定路径(引用[4]改进): ```cmake find_package(Ipopt REQUIRED) find_package(CppAD REQUIRED) include_directories( ${IPOPT_INCLUDE_DIRS} ${CPPAD_INCLUDE_DIRS} ) target_link_libraries(your_target PRIVATE ${IPOPT_LIBRARIES} PRIVATE CppAD::cppad ) ``` --- ### 常见问题处理 - **错误`coin/IpIpoptApplication.hpp not found`** 手动添加包含路径:`-I/usr/local/include/coin`(源码安装默认路径)[^1]。 - **链接错误`libcoinhsl.so not found`** 添加环境变量: ```bash export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ``` - **ARM架构编译失败** 在`./configure`时添加`--build=arm-linux`,并确保使用gcc-arm工具链[^2]。 [^1]: HSL库需手动获取并编译,否则导致Ipopt功能不全 [^2]: ARM环境建议使用源码编译避免二进制兼容性问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值