ORツールとは、配送ルートや勤務シフトのように組み合わせが膨大な問題から、条件を満たす最も良い答えを数理最適化で計算するソフトウェアの総称です。「OR-Tools」と書かれていれば、それはGoogleが公開しているORツールの1製品を指します。この記事ではGoogle OR-Tools・Gurobi・CPLEX・SCIP・HiGHS・PuLPの6つを、商用利用の可否、無償版の上限、得意な問題で比べ、用途別にどれを選ぶかを示します。無償版の上限と、同じモデルをソルバーだけ替えて解いたときの差は、2026年10月15日に手元で実測した結果を載せています。
まとめ
- まず無償で試すならGoogle OR-Tools。Apache License 2.0で商用利用に費用がかからず、モデルサイズの制限もありません。配送ルート用の専用機能を持つのは6ツール中これだけで、シフト作成にはCP-SATが使えます。
- Gurobi・CPLEXの無償版は評価用。Gurobiのpip同梱ライセンスは「non-production use」と明記され、変数か制約が2,001個になった時点でエラーで止まります(実測)。CPLEX Community Editionは1,001個で止まります。
- 商用利用が無償で、ライセンスによるモデルサイズ制限がないソルバーはSCIPとHiGHS。SCIPは8.0.3(2022年12月公開)以降Apache 2.0、HiGHSはMITです。
- PuLPはソルバーではなくモデラー。2026年9月25日公開のPuLP 4.0からCBCが同梱されなくなり、3.x向けのサンプルコードはそのままでは動きません。
- ソルバーの差が出るのは整数変数が多い問題。変数410個の施設配置問題では6ソルバーすべてが同じ最適解を出し、変数3,030個に増やすと差がはっきり開きました(実測)。
ORツールの定義とソルバー・モデラーの役割分担
ORツールで扱う問題の型と典型例
ORはOperations Research(オペレーションズ・リサーチ)の略で、意思決定を数式に落として最適な答えを求める学問領域です。ORは数理最適化に加え、確率モデルやシミュレーションなども含みます。この記事では数理最適化のツールに対象を絞り、問題の形式・解法・用途を次の4つの切り口で整理します。
| 問題の型 | 略称 | 典型例 | 変数の性質 |
|---|---|---|---|
| 線形計画 | LP | 原料配合、生産量配分 | 連続値 |
| 混合整数計画 | MIP | 工場の稼働有無、拠点配置 | 連続+整数・0/1 |
| 制約プログラミング | CP | 勤務シフト、ジョブショップ | 整数・論理制約中心 |
| ルーティング | VRP/TSP | 配送ルート、巡回計画 | 経路の組合せ |
自社の問題がどの型かは、決めたいもの(決定変数)と良し悪しの尺度(目的関数)を言葉にすれば判別できます。この切り分けが曖昧なままツールを比べても結論は出ません。モデル化の基本は決定変数・目的関数・制約条件の違いと定式化の手順、最適化そのものの全体像は数理最適化の3要素とアルゴリズムの解説で整理しています。
Google OR-ToolsとORツールの関係
「ORツール」は分野の総称で、「OR-Tools」はGoogleの製品名です。OR-ToolsはLaurent Perronが開発し、Googleの最適化チームがC++で書いたライブラリで、Python・Java・.NETから呼べます。公式サイトが挙げる対象は、車両ルーティング、フロー、整数計画と線形計画、制約プログラミングです。2013年のMiniZinc Challenge(制約プログラミングの国際競技会)では金メダル2つと銀メダル2つを取ったとGoogleが発表しています。
最新の安定版はv9.15(GitHub公開は2026年1月12日、PyPIの9.15.6755は1月14日)で、Python 3.9以上が必要です。自前のソルバー(CP-SAT、線形計画用のGLOPなど)に加えてSCIPとHiGHSを同梱し、GurobiやCPLEXも呼び出せるので、モデラーとソルバー群を兼ねる点が他の5ツールと違います。インストールと実装例はGoogle OR-Toolsとは?できること・インストール・実装例をわかりやすく解説、線形計画・混合整数計画の新しいAPIはOR-Tools MathOptとは?pywraplpとの違い・対応ソルバーとPythonでの使い方にまとめています。
モデラーとソルバーの層の違い
比較の前に、混同されやすい2つの層を分けておきます。
- モデラー(モデリングライブラリ):問題を数式として書く層。PuLP、Pyomo、OR-ToolsのPython APIなど。
- ソルバー(求解エンジン):実際に最適解を探す層。CBC、SCIP、HiGHS、Gurobi、CPLEXなど。
PuLPはモデラーで、解くのは裏側のソルバーです。PuLP経由の処理が遅い場合は、モデル構築、ソルバーへのデータ受け渡し、求解の時間を分けて測り、どこが律速しているかを確認します。次のコードはPuLP 4.0の書き方です。Python 3.12以上の環境に pip install "pulp[cbc,highs]==4.0.1" で必要なパッケージを導入し、同じモデルをCBCとHiGHSで1回ずつ解いています(Python 3.13・PuLP 4.0.1で実行し、2回とも Optimal 6.0 8.0 と表示されました)。
import pulp
prob = pulp.LpProblem("production", pulp.LpMaximize)
x = prob.add_variable("x", lowBound=0, cat="Integer")
y = prob.add_variable("y", lowBound=0, cat="Integer")
prob += 3 * x + 2 * y # 目的関数(利益の最大化)
prob += 2 * x + y <= 20 # 制約:ライン稼働時間
prob += x + 3 * y <= 30 # 制約:原料在庫
stats = prob.solve(pulp.COIN_CMD(msg=False)) # CBCで解く
print(stats.status_str, x.value(), y.value())
stats = prob.solve(pulp.HiGHS(msg=False)) # 同じモデルをHiGHSで解く
print(stats.status_str, x.value(), y.value())
モデル部分に手を入れず、solve() に渡すソルバーだけを差し替えられるのがモデラーを挟む利点です。「まずPuLP+CBCで書き、遅ければソルバーだけ交換する」という進め方が取れます。なお scipy.optimize.linprog は線形計画を解く関数で、モデラーではありません。守備範囲の違いはscipy.optimizeの使い方と外部ソルバーの選び方で解説しています。
主要ORツール6種の比較:ライセンス・無償版の上限・得意問題
6ツールの比較表(2026年10月時点)
| ツール | 層 | 最新版 | ライセンス | 無償版の上限 | 得意な問題 |
|---|---|---|---|---|---|
| Google OR-Tools | モデラー+ソルバー群 | 9.15 | Apache 2.0 | なし | CP、VRP、スケジューリング |
| SCIP | ソルバー | 10.1.0 | Apache 2.0 | なし | MIP、非線形混合整数 |
| HiGHS | ソルバー | 1.15.1 | MIT | なし | LP、MIP |
| PuLP | モデラー | 4.0.1 | MIT | なし | LP、MIPの記述 |
| Gurobi | ソルバー | 13.0.3 | 商用 | 変数・制約各2,000 | 大規模MIP全般 |
| CPLEX | ソルバー | 22.2 | 商用 | 変数・制約各1,000 | 大規模MIP、スケジューリング |
版はそれぞれの一次情報で確認しました。SCIP 10.1.0は2026年9月18日公開、HiGHSのPythonパッケージhighspy 1.15.1は2026年7月2日公開、gurobipy 13.0.3は2026年8月25日公開、CPLEX Optimization Studio 22.2.xは2026年5月22日に一般提供です。ライセンス条件は改定されることがあるため、契約前には各社の最新の規約を確認してください。
無償版の上限を1つ超えたときの挙動(実測)
Gurobiは料金・ライセンスのページで、pipやcondaで入れたgurobipyには無償のサイズ制限付きライセンスが付き、用途は学習・試作・評価などの「non-production use」で、上限は変数2,000個・線形制約2,000本(二次項を含むモデルは変数200個)と書いています。CPLEXはIBMの料金ページで、Community Editionを「1000 variables and 1000 constraints」までと定めています。
この境界をgurobipy 13.0.3とcplex 22.1.2(どちらもpipで導入)で確かめました。上限ちょうどのモデルは解け、1つ超えた瞬間に次のエラーで止まります。
| モデル | 上限ちょうど | 1つ超え | エラー |
|---|---|---|---|
| Gurobi 線形・変数 | 2,000で解ける | 2,001で停止 | GurobiError 10010 |
| Gurobi 線形・制約 | 2,000で解ける | 2,001で停止 | GurobiError 10010 |
| Gurobi 二次項あり・変数 | 200で解ける | 201で停止 | GurobiError 10010 |
| CPLEX 変数 | 1,000で解ける | 1,001で停止 | CPLEX Error 1016 |
| CPLEX 制約 | 1,000で解ける | 1,001で停止 | CPLEX Error 1016 |
エラー文はGurobiが「Model too large for size-limited license」、CPLEXが「Community Edition. Problem size limits exceeded.」です。Gurobiは最初のモデルを作るときに「Restricted license – for non-production use only」と期限(今回は2027-11-29)を表示します。どちらもモデルの組み立てまでは通り、求解(Gurobiの optimize()、CPLEXの solve())を呼んだ時点で止まります。配送先が数十件のVRPや、数十人×1か月のシフト表は、この上限を簡単に超えます。評価が順調でも本番データで突然止まる、という失敗はここで起きます。
商用と無償の性能差を示す公開ベンチマークの現状
ソルバーの速さを比べる定番は、アリゾナ州立大学のHans MittelmannによるBenchmarks for Optimization Softwareですが、ここで商用の主要3製品はもう比べられません。同ページによると、2018年のINFORMS年次大会のあとIBM(CPLEX)とFICO(Xpress)が結果の削除を求め、Gurobiも2024年8月に撤退しました。
代わりに載っているのは別の商用ソルバーとオープンソースです。2026年10月10日更新のMIPLIB2017ベンチマーク(240問・制限2時間・12スレッド)の結果は次のとおりです。
| ソルバー | 種別 | 解けた問題 | 時間(COPT=1) |
|---|---|---|---|
| COPT 8.0.3 | 商用 | 219 | 1 |
| Optverse 2.0.1 | 商用 | 210 | 1.72 |
| HiGHS 1.15.1(並列) | OSS | 179 | 5.44 |
| HiGHS 1.15.0 | OSS | 158 | 7.55 |
| SCIP 10.0.0 | OSS | 136 | 9.93 |
時間はシフト幾何平均をCOPTを1として割った値で、解けなかった問題は2時間として数えています。最速の商用ソルバーとSCIPの間には約10倍の開きがあります。ただしMIPLIBは性能測定のために難しい問題を選んだ問題集で、実務モデルとは前提が違います。GurobiやCPLEXが自社の問題で何倍速いかは公開データでは分からないので、評価版で自分のモデルを解いて測るしかありません。
同じモデルでソルバーだけを交換した実測
「問題が小さいうちはソルバーの差は出ない」を確かめるため、容量制約付きの施設配置問題(どの倉庫を開け、各顧客をどの倉庫に割り当てるか。変数はすべて0/1)を乱数シード1で作り(需要5〜35、倉庫の容量150〜250、固定費300〜700、割当費用は座標間の距離)、同じPuLPモデルを各ソルバーで解きました。CP-SATだけはOR-Toolsの書き方で同じ問題を組んでいます。環境はIntel Core i9-9880H(8コア)・メモリ16GBのmacOS、Python 3.13、制限時間は小規模60秒・中規模120秒で、CP-SATは8スレッド、他は各ソルバーの既定で動かしました。所要時間にはPuLPがモデルをソルバーへ渡す時間も含みます。
| ソルバー | 小規模:倉庫10×顧客40 | 中規模:倉庫30×顧客100 |
|---|---|---|
| 変数/制約 | 410/450 | 3,030/3,130 |
| CBC(PuLP経由) | 最適 2,693(0.9秒) | 5,416で打ち切り(最適値より1.5%高い) |
| HiGHS 1.15.1(PuLP経由) | 最適 2,693(2.7秒) | 5,378で打ち切り(0.8%高い) |
| SCIP 10.0(PuLP経由) | 最適 2,693(3.4秒) | 5,651〜5,671で打ち切り(約6%高い) |
| CP-SAT(OR-Tools 9.15) | 最適 2,693(0.7秒) | 最適 5,335を証明(50〜95秒・8スレッド) |
| Gurobi 13.0.3 無償版 | 最適 2,693(2.9秒) | 上限超過で停止 |
| CPLEX 22.1.2 CE | 最適 2,693(8.1秒) | 上限超過で停止 |
中規模では、CP-SATが8スレッドで下界と解を一致させ、最適値5,335を証明しました。所要時間は2回の計測で50秒と95秒で、並列探索のため回ごとにぶれます。ほかの3つは120秒の制限で打ち切りになり、その時点の解は最適値よりCBCが1.5%、HiGHSが0.8%、SCIPが約6%(2回計測)高い値でした。CP-SATを1スレッドに絞った回は120秒で打ち切られ、解は5,357(最適値との差0.4%)でした。この問題は変数がすべて0/1の割り当てで、CP-SATと相性が良い型です。変数3,030個の段階で、無償ソルバーの間でも答えの質に差が出ています。
この結果は1つの問題・1台のマシンでの値で、ソルバーの優劣を一般化するものではありません。今回の施設配置問題では、小規模モデルで同じ最適値が得られ、中規模モデルで制限時間内の実行可能解に差が出ました。また、中規模ではGurobiとCPLEXの無償版が上限を超えて使えませんでした。商用ソルバーを検討するなら、この段階で評価ライセンスを申し込むのが現実的な順序です。
PuLP 4.0とOR-Tools併用で起きる不具合と対処
PuLP 4.0でCBCが同梱されなくなった影響
PuLP 4.0.0は2026年9月25日、4.0.1は10月14日に公開されました。公式の移行ガイドによると、4.0はPython 3.12以上が必要で、CBCは同梱されず、PULP_CBC_CMD は削除されました。CBCは pip install "pulp[cbc]" で入れて COIN_CMD から呼びます。引数なしの prob.solve() は、CBCがあればCBCを、無ければ最初に見つけた別のソルバーを使います。
3.x向けの書き方をPuLP 4.0.1で実行すると、変数を作る1行目で TypeError: LpVariable.__init__() got an unexpected keyword argument 'lowBound' が出て止まります。変数は問題オブジェクトの add_variable() で作り、solve() の戻り値は整数ではなく LpSolveStats になりました(状態は stats.status_str で読む)。ネット上のPuLPのサンプルはほぼ3.x向けなので、写す前にPuLPの版を確認してください。PuLP本体の使い方はPuLPとは?Pythonで最小化問題を解く手順で解説しています。
PuLP本体はMITですが、pulp[cbc] で入るCBCはEclipse Public License 2.0です。PuLP 4.0.1はほかに cplex・gurobi・highs・scip・xpress・copt・mosek・ortools などのextraを持ち、どれを入れたかで適用されるライセンスが変わります。
OR-Toolsとhighspy・PySCIPOptを同じプロセスで使うときの衝突
OR-Tools 9.15は内部にHiGHS 1.12.0とSCIP 10.0.0を同梱しています(v9.15のリリースノート)。同じ仮想環境に別版のhighspy 1.15.1やPySCIPOpt 6.3.0を入れると、macOS(Intel)・Python 3.13の環境で次の2つが起きました。
- PuLP 4.0.1を先にimportしてからOR-Toolsを読む:PuLPはimport時にhighspyを読み込むため、
from ortools.sat.python import cp_modelがImportError(libhighsのシンボルが見つからない)で失敗する。 - OR-Toolsを先にimportしてから、PuLP経由でHiGHSかSCIPを使う:変数1個の問題は解けたが、変数410個の施設配置問題ではPythonがセグメンテーション違反(終了コード139)で落ちた。
OR-Toolsを読まない別プロセスでは、同じモデルをHiGHSもSCIPも問題なく解きました。両方を使うならプロセスか仮想環境を分けるのが確実です。他のOSやPythonの版では起きない可能性もありますが、本番のワーカーで両方を読み込む構成は避けてください。
ORツールの商用利用条件と無償ライセンスの範囲
ORツールを商用プロダクトに組み込む際は、利用するライブラリとソルバーそれぞれのライセンスを確認します。Google OR-Tools・SCIP・HiGHS・PuLPは、商用利用に費用がかかりません。
- Google OR-Tools:Apache License 2.0。商用製品への組み込み・改変・再配布ができ、改変したソースの公開義務もありません。再配布時にはライセンスの写しの提供に加え、改変ファイルへの変更表示、配布する派生ソース中の関連表示の保持、元の配布物にNOTICEがある場合の帰属表示の継承などが必要です。特許条項も適用されます。
- SCIP:以前はZIBアカデミックライセンスで、営利利用には別契約が必要でした。公式FAQのとおり、2022年11月4日にApache 2.0への変更が告知され、同年12月公開の8.0.3から適用されています。商用利用も無償です。古い記事は変更前の情報のことがあるので、版を確認してください。
- HiGHS:MITライセンス。ソフトウェアの複製または実質的な部分には、著作権表示と許諾表示を含める必要があります。
- PuLP:MITライセンス。ただし呼び出すソルバーのライセンスは別に効きます。PuLPが無償でも、
pulp[gurobi]でGurobiを呼べばGurobiのライセンスに従います。 - Gurobi・CPLEX:商用ライセンス。学術機関向けの無償ライセンスはありますが、企業の業務利用は対象外です。
「モデラーは無償でもソルバーは有償」は、ライセンス監査で見落とされやすい組み合わせです。requirements.txtにPuLPしか無くても、extraで商用ソルバーを引いていれば商用ライセンスが要ります。依存関係は実際に呼ばれているソルバー名で確認してください。
Gurobi・CPLEX以外の商用ソルバーの無償枠
商用ソルバーはGurobiとCPLEXだけではありません。前述のベンチマークで上位のCOPTを含め、評価の入り口は次のとおりです。
| ソルバー | 提供元 | 無償で使える範囲 |
|---|---|---|
| FICO Xpress | FICO | 無償のCommunityライセンスあり |
| COPT | Cardinal Operations | 試用:学術365日・それ以外180日 |
| MOSEK | MOSEK ApS | 学位授与機関の研究・教育は無償 |
| Hexaly | Hexaly | 学術版は1台・1ユーザーなら無償 |
| Nuorium Optimizer | NTTデータ数理システム | 製品版相当を1か月無償貸与 |
出典はFICOの告知、COPTの製品ページ、MOSEKの学術ライセンス、Hexalyの利用規約、Nuorium Optimizerの製品ページです。Xpress Communityのサイズ上限は公式の現行文書で確認できなかったため書いていません。日本語のサポートが要るなら国内ベンダーのNuorium Optimizerも候補です。
用途別の選定:配送・シフト・生産計画
配送ルート・巡回でのOR-Tools RoutingModelの選定
Google OR-Toolsを選びます。6ツールのうち、車両の積載量・時間枠・複数デポといったVRPの制約を扱う専用モジュール(ortools.constraint_solver のRoutingModel)を持つのはOR-Toolsだけです。汎用のMIPソルバーでは部分巡回除去などの経路制約を自分で定式化する必要があり、距離行列と車両台数を渡せば動くOR-Toolsとは着手の手間が大きく違います。配車計画を業務システムに組み込む段階では、受注・在庫・車両管理とのデータ連携も設計・見積もりの対象になります。最適化エンジンを含めた物流システム開発として設計すると、計算結果を現場の運用に乗せやすくなります。
勤務シフト・生産スケジューリングでのCP-SATの選定
同じくOR-Toolsで、使うのはCP-SATです。CP-SATは制約プログラミングとSAT(充足可能性判定)を組み合わせたエンジンで、「2夜連続で夜勤に入れない」のような論理制約を、0/1変数の不等式へ手で展開せずにそのまま書けます。次は4人で1週間の夜勤を回す最小の例です(OR-Tools 9.15.6755で実行し、OPTIMALと7日分の割り当てが出力されました)。
from ortools.sat.python import cp_model
staff, days = ["佐藤", "鈴木", "高橋", "田中"], range(7)
m = cp_model.CpModel()
night = {(s, d): m.new_bool_var(f"{s}_{d}") for s in staff for d in days}
for d in days: # 毎晩ちょうど1人
m.add_exactly_one(night[s, d] for s in staff)
for s in staff:
for d in range(6): # 2夜連続の夜勤は禁止
m.add_bool_or([night[s, d].Not(), night[s, d + 1].Not()])
m.add(sum(night[s, d] for d in days) <= 2) # 週2回まで
solver = cp_model.CpSolver()
print(solver.status_name(solver.solve(m)))
for d in days:
print(d, [s for s in staff if solver.value(night[s, d])])
目的関数を置いていないので、条件を満たす割り当てが1つ見つかった時点で終わります。希望休は該当日の勤務変数を0に固定して表せます。公平性は勤務回数の上下限や偏りを抑える目的関数などで表し、必要な記述量は公平性の定義によって変わります。商用で同じ型のエンジンを使うなら、CPLEX Optimization Studioに含まれるCP OptimizerがIBMの製品ページで人員のスケジューリング向けとされています。
線形計画・混合整数計画でのPuLPとソルバーの選定
PuLPでモデルを書き、CBCかHiGHSで解くのが最短です。数式に近い書き方で、後からソルバーを差し替えられるので、最初の投資が無駄になりません。時間切れになったら、HiGHSやSCIPを同じ時間制限で比較し、得られた解と最適性ギャップを確認します。要件を満たさなければGurobi・CPLEXなどの評価版も比較します。OR-Toolsで統一したい場合は、MathOptから同梱のSCIPやHiGHSを呼ぶ方法もあります。SCIPの導入手順はSCIPとは?Apache-2.0の最適化ソルバーをPythonで使う手順、Gurobiの評価の始め方はGurobiとは?Pythonでの使い方・インストール・価格を解説にあります。
初手の進め方:問題の型判別からソルバー交換まで
- 問題の型を判別する(LPか、整数を含むか、経路か、シフトか)
- 経路・シフトならOR-Tools、それ以外はPuLP+CBCかHiGHSでモデルを書く
- 遅い・解けない場合は、まずモデルを疑う(不要な変数や冗長な制約を削る)
- それでも遅ければ、HiGHSやSCIPを同じ時間制限で比較し、解の品質と最適性ギャップを確認する
- 無償ソルバーで実測して足りないと確認してから、商用ソルバーの評価版を申し込む
ORツール選定でよくある失敗
最も致命的なのは、ORツールで解くべきでない問題を持ち込むことです。ORツールは制約と目的関数を数式で書ける問題の道具で、需要予測のように過去データからパターンを学ぶ問題は機械学習の領域です。最初に試す分業は「需要を機械学習で予測し、その予測値を入力にORツールで配車を最適化する」という直列の構成です。予測と最適化を分けて評価すると、誤差の原因を切り分けやすくなります。ただし、意思決定の損失に合わせて予測モデルを学習する統合的な手法もあります。決定変数と目的関数をまだ説明できない場合は、ツール選定より先に、業務要件を整理して定式化できるかを検討してください。
次に多いのが、ソルバーを替えれば速くなるという思い込みです。連続値で足りる所に整数変数を置く、対称な変数を放置する、といった定式化の問題はソルバーを替えても解消しません。
3つ目は、無償版で評価してそのまま本番に載せる計画です。評価データが本番より小さいと、上限の壁に気づくのは稼働直前になります。
よくある質問
ORツールとは何ですか?
限られた資源をどう配分すれば最も良い結果になるかを、数理モデルにして計算で解くソフトウェアの総称です。配送ルートの短縮、勤務シフトの作成、生産計画、在庫の適正化などに使われます。解く役のソルバー(Gurobi・CPLEX・SCIP・HiGHSなど)と、問題を書く役のモデラー(PuLPなど)の2層があり、Google OR-Toolsは両方を含みます。
OR-Toolsは商用利用できますか?
できます。Google OR-ToolsはApache License 2.0で、商用製品への組み込み・改変・再配布に費用はかからず、改変したソースの公開義務もありません。再配布時には、ライセンスの写しの提供、改変ファイルへの変更表示、関連する権利表示の保持、該当するNOTICEの帰属表示の継承など、Apache License 2.0の条件を守る必要があります。ただしOR-ToolsからGurobiやCPLEXを呼ぶ場合は、そのソルバーのライセンスが別に必要です。
CP-SATソルバーとは何ですか?
Google OR-Toolsに含まれる制約プログラミング用のソルバーで、制約プログラミングとSAT(充足可能性判定)の技術を組み合わせて整数変数の問題を解きます。「AとBを同じ日に割り当てない」といった論理制約をそのまま書けるため、シフト作成やジョブショップスケジューリングで使われます。整数で表せる問題向けで、連続変数の線形計画にはGLOPなど別のソルバーを使います。
OR-Toolsはどの言語で使えますか?
本体はC++で、公式に使えるのはC++・Python・Java・.NET(C#)です。この記事の実装例はPythonで、pip install ortools で導入できます。v9.15ではPython 3.14への対応が加わりました。Python 3.8のサポート終了はv9.13からで、v9.15の最低要件もPython 3.9です。
無料のORツールだけで実務は回りますか?
規模と構造によります。OR-Tools・HiGHS・SCIPが実用的な時間で解けるかは、変数数だけでなく、制約の構造や許容する解の品質にも左右されます。整数変数が数万個の組合せ問題では、商用ソルバーとの差が許容範囲を超えることがあります。まず無償ソルバーで実測し、足りないと確認してから商用ソルバーを評価してください。