v3(旧バージョン)の製品情報・ご利用プラン・ライセンスはJijZept Solver v3のページをご覧ください。

v4 beta版 先行トライアル受付中

JijZept Solver

実用的な問題に対応する数理最適化ソルバー

JIJが開発する最適化ソルバーです。
幅広い問題クラスに対応しているため、
実用的な問題を解くのに適しています。

JijZept Solver v4の特長

複数のエンジンが、解を交換しながら並走

性質の異なる3つの探索エンジンが、解を交換しながら協調して動作します。

分枝限定法(B&B)エンジン

最適性の保証を担当

制約プログラミング(CP)エンジン

論理推論で候補を絞り込み

JIJ独自ヒューリスティクス群

構造に特化した探索

▲▼ 解を交換 ▲▼

共有解プール

※ 分枝限定法=最適解への近さを保証できる探索の枠組み。
※ 制約プログラミング=制約の論理推論で候補を刈り込む手法。

対応する問題クラス

問題クラスを自動で判別し、内部で最適な探索手法を選択するので、問題の特性を意識する必要がありません。

  • 線形計画(LP)
  • 混合整数線形計画(MILP)
  • 二次計画(QP)
  • 二次制約(QCP)
  • 混合整数二次計画(MIQP)
  • 混合整数二次制約(MIQCP)
NEW

さらにv4では「問題構造の宣言」に対応

問題クラスに加えて、「巡回ルート型(TSP)」のような問題の構造を宣言して求解できます。対応する構造は今後拡大予定です。

性能

実務の意思決定の時間内に「使える解」を返すことを重視して設計されています。

商用ソルバーが解を出せない問題でも、1秒から実行可能解

時間枠付き巡回セールスマン問題(TSPTW)の90〜120都市の問題を、商用・無償の既存ソルバーと新バージョンで求解して比較しています。90都市では商用ソルバーの30秒に対し新バージョンは1秒で実行可能解を獲得。100都市・120都市で制限時間内に実行可能解を得られるのは新バージョンのみです。

TSPTW 90〜120都市での求解結果の比較グラフ。90都市では商用ソルバーの30秒に対し新バージョン(JijZept Solver)は1秒で実行可能解を獲得。100都市・120都市では新バージョンのみが実行可能解を獲得。

大規模な実問題で、意思決定の時間内に「使える解」

実務で現れる大規模な問題でも、意思決定に使える時間内に解を返します。商用・無償ソルバーが制限時間内に解を出せない変数16万の実問題で、唯一実行可能解を獲得しています。

変数16万の実問題における求解結果のグラフ。商用・無償ソルバーが制限時間内に解を出せない中、新バージョン(JijZept Solver)のみが実行可能解を獲得。

※ 実行可能解=すべての制約を満たす解。

※ TSPTW(時間枠付き巡回セールスマン問題)=訪問先ごとに到着時間帯の指定がある中で、巡回する順番を決める問題。

※ グラフ中の✕は、制限時間内に実行可能解が得られなかったことを示します(✕の色は各ソルバーに対応)。

※ TSPTWのベンチマークは、問題構造の宣言を明示した場合の測定結果。

※ 当社測定(2026年7月)。同一の問題を各ソルバーで求解して比較。性能は問題に依存します。

JijZept Solver v3からの進化

v3のアルゴリズムはv4に内包されており、v3でお使いの問題はそのまま解けます。

項目 v3 v4
探索方式 JIJ独自ヒューリスティクス 分枝限定法+制約プログラミング+
ヒューリスティクスの協調並列
最適性ギャップの提示
(現在の解が最適からどれだけ離れうるかの上限)
なし あり(二次の制約・目的関数でも提示)
問題構造の宣言 なし あり

実行可能解の獲得率が大幅に向上

ベンチマーク232問での実行可能解の獲得率は、旧バージョンの68.5%から新バージョンでは82.8%に向上しています(14.3ポイント向上)。

実行可能解の獲得率の比較グラフ。旧バージョンは232問中159問で68.5%、新バージョンは232問中192問で82.8%。

※ 当社測定(2026年7月)。ベンチマークにはMIPLIB(混合整数計画問題の公開ベンチマーク集)を使用。

beta版の先行トライアルをご希望の方は、お問い合わせください。 クレジットカード登録なしで試せる、無償WebAPI版もあります。

無償のWebAPI経由でJijZept Solverを実行する方法は以下の4ステップです。

1

利用申請

+

JijZept Solver 無償WebAPI版を利用するには、まず利用申請フォームから申請を行ってください。

無償利用申請フォーム
2

インストール

+

JijZept Solver 無償WebAPI版のクライアントパッケージをインストールします。現在はbeta版のため、--pre オプションを付けてインストールします。

Terminal window
pip install --pre jijzept_solver
3

環境変数の設定

+

利用申請により入手した、以下の値を環境変数に設定します:

  • JIJZEPT_SOLVER_SERVER_HOST: API サーバーのホスト名
  • JIJZEPT_SOLVER_ACCESS_TOKEN: アクセストークン

設定例

環境変数の設定例:

Terminal window
export JIJZEPT_SOLVER_SERVER_HOST='API サーバーのホスト名'
export JIJZEPT_SOLVER_ACCESS_TOKEN='アクセストークン'

または Python コード内で設定する例:

import os
os.environ["JIJZEPT_SOLVER_SERVER_HOST"] = "API サーバーのホスト名"
os.environ["JIJZEPT_SOLVER_ACCESS_TOKEN"] = "アクセストークン"
4

求解例

+

実行例の中でJijModeling を使用するため、事前にインストールしておきます。

Terminal window
pip install jijmodeling

ナップサック問題を解く例と、構造ヒントを使ってTSPを解く例をタブで切り替えられます。

import logging
import jijzept_solver
import jijmodeling as jm
logging.basicConfig(level=logging.INFO)
@jm.Problem.define("Knapsack", sense=jm.ProblemSense.MAXIMIZE)
def knapsack(problem: jm.DecoratedProblem):
v = problem.Float(ndim=1) # アイテムの価値
N = problem.NamedExpr(v.len_at(0)) # アイテム数
w = problem.Float(shape=N) # アイテムの重さ
W = problem.Float() # ナップサックの容量
x = problem.BinaryVar(shape=N) # 決定変数
problem += jm.sum(v[i] * x[i] for i in N) # 目的関数:価値の最大化
problem += problem.Constraint("weight", jm.sum(w[i] * x[i] for i in N) <= W) # 重量制約
# インスタンスデータ
instance_data = {
"v": [10, 13, 18, 31, 7, 15], # アイテムの価値
"w": [11, 15, 20, 35, 10, 33], # アイテムの重さ
"W": 47, # ナップサックの容量
}
# OMMX インスタンスを作成
instance = knapsack.eval(instance_data)
# APIにリクエストを実行
solution = jijzept_solver.solve(instance, time_limit=2.0)
print(f"Value of the objective function: {solution.objective}")
import jijzept_solver
import jijmodeling as jm
# 5都市の距離データ(同じ都市に留まる移動を選ばれないよう対角成分は大きな値に)
num_cities = 5
distances = [
[float(abs(i - j)) for j in range(num_cities)]
for i in range(num_cities)
]
for city in range(num_cities):
distances[city][city] = 1_000_000.0
@jm.Problem.define("TSP", sense=jm.ProblemSense.MINIMIZE)
def tsp(problem: jm.DecoratedProblem):
d = problem.Float(ndim=2) # 都市間の距離
N = problem.NamedExpr(d.len_at(0)) # 都市数
x = problem.BinaryVar(shape=(N, N)) # 都市iから都市jへ移動するか
# 目的関数:総移動距離の最小化
problem += jm.sum(d[i, j] * x[i, j] for i in N for j in N)
# 巡回ルートの制約は書かない(構造の宣言がソルバーに伝えるため)
# OMMX インスタンスを作成
instance = tsp.eval({"d": distances})
# 「x は巡回ルート型(TSP)の構造」と1行で宣言して求解
solution = jijzept_solver.solve(
instance,
structure=jijzept_solver.Structure.tsp("x"),
time_limit=10.0,
)
print(f"Total travel distance: {solution.objective}")

無償WebAPI版の1リクエストあたりの実行時間は最大10秒です。 より長い実行時間でのご利用(beta版の先行トライアル)や、実データ(匿名化可)での事前ベンチマークをご希望の場合は、お問い合わせください。

お問い合わせ

Q.無料で試せますか?

+
A.

はい。無償WebAPI版を、クレジットカード情報の登録なしでご利用いただけます。申請回数にも制限はありません。

無償WebAPI

Q.リクエスト回数に上限はありますか?

+

A.ありません。しかし、同一リクエスト元からのAPIリクエストが集中した場合に、一時的にアクセス制限がかかることがあります。その場合は時間を置いて再度リクエストしてください。

Q.無償WebAPI版で良い解を得ることができませんでした。

+
A.

実行時間(time_limit)を上限の10秒まで指定する、問題構造の宣言(structure)を指定するといった方法で、良い解が得られる場合があります。それでも改善しない場合は、より長い実行時間で実行できるbeta版の先行トライアルをご検討ください。

お問い合わせ

Q.MPSファイルには対応していますか?

+

A.対応しています。OMMXのMPS読み込み機能で取り込めます。PuLP(Pythonで広く使われる無償のモデリングライブラリ)など、MPSファイルを出力できるモデリングツールからもご利用いただけます。

Q.求解の途中経過は確認できますか?

+

A.オンプレミス版では、計算途中のログ(暫定解の推移など)を確認できます。

Q.オンプレミスでの具体的な料金を教えてください。

+
A.

お客様のご要望や規模によって料金が異なるため、課題やお悩みなどをお伺いしたうえでお見積もりをご案内しております。まずはお気軽にお問い合わせください。

お問い合わせ
相談 無料

お気軽にお問い合わせください

お問い合わせ