サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

【Python】pulp, CPLEXで並列数指定

pulpでsolverとしてCPLEXを指定する場合, 並列数はDefault設定では使用可能なthread数を全て使用する設定になっています. 並列数を自分で指定したい場合は, 以下のようにすれば良いです.

import pulp

class MyCPLEX(pulp.CPLEX):
    def __init__(self, mpi=True, msg=True, timeLimit=None,
                 epgap=None, logfilename=None, threads=None):
        super().__init__(
            mpi, msg, timeLimit, epgap, logfilename
        )
        self.threads = threads
    
    def actualSolve(self, lp, callback=None):
        self.buildSolverModel(lp)
        # set threads
        if self.threads is not None:   # ここを追加
            self.solverModel.parameters.threads.set(self.threads)  # ここを追加
        self.callSolver(lp)
        solutionStatus = self.findSolutionValues(LookupError)
        for var in lp.variables():
            var.modified = False
        for constraint in lp.constraints.values():
            constraint.modified = False     
        return solutionStatus

pulpのCPLEX solver クラスを継承して, threads変数を追加しています.
そして, pulp/solvers.py:CPLEX class:actualSolveを少し書き換えています.

実際に使用するときには, 自分のプログラムに上記のclassをコピペして,

cplex_solver = MyCPLEX(threads=3)
problem.solve(solver=cplex_solver)

と, 実行すれば良いです.