JijModelingを使った最適化計算の流れ
Copyright(C) 2022 JijInc, All Rights Reserved.
5
JijModeling
最適化問題
ソルバー
定式化
実装
求解
解きたい問題を数式で書く
解きたい問題をプログラムで
書く
解きたい問題をソルバーに解
かせる
● シミュレーテッドアニーリングソルバー
● 量子アニーリングソルバー
● 厳密解ソルバー
実データ
N = 4
W = 11
v = [2,3,6,4]
w = [3,2,5,8]
6.
JijModelingの特徴
Copyright(C) 2022 JijInc, All Rights Reserved.
6
● 定式化した最適化問題を記述するPythonライブラリ
● 入力した数式をLaTeXで確認できる
https://pypi.org/project/jijmodeling/
PyPI
https://www.documentation.jijzept.com/docs/jijmodeling_docs/
JijModelingドキュメント
https://www.ref.documentation.jijzept.com/jijmodeling/
JijModeling APIリファレンス
7.
このセミナーのゴール
Copyright(C) 2022 JijInc, All Rights Reserved.
7
数式をJijModelingで書き写すことができる
import jijmodeling as jm
N = jm.Placeholder("N")
W = jm.Placeholder("W")
v = jm.Placeholder("v", dim=1)
w = jm.Placeholder("w", dim=1)
x = jm.Binary("x", shape=N)
i = jm.Element("i", (0,N))
problem = jm.Problem("ナップサック問題")
problem += -jm.Sum(i, v[i] * x[i])
problem += jm.Constraint("重量制限", jm.Sum(i, w[i] * x[i]) <= W)
8.
JijModelingの構成
Copyright(C) 2022 JijInc, All Rights Reserved.
Problem
Constraint
Penalty
数式を表現するクラス 最適化問題を表現するクラス
データを代入する対象
● Placeholder
● JaggedArray
● Binary
● Integer
決定変数
添え字
● Element
数学関数
● Sum
● Prod
● abs,ceil,floor,log2,ln
Constraint
Problem
9.
プレースホルダーの書き方
Copyright(C) 2022 JijInc, All Rights Reserved.
9
A = jm.Placeholder(“A”, dim=2)
a = jm.Placeholder(“a”)
Placeholderクラス:実データを代入するための文字
添え字のないプレースホルダー(スカ
ラー)
次元数が2のプレースホルダー(行
列)
v = jm.Placeholder(“v”, dim=1)
次元数が1のプレースホルダー(ベクト
ル)
A[1,2]
10.
決定変数の書き方
Copyright(C) 2022 JijInc, All Rights Reserved.
10
N = jm.Placeholder(“N”)
M = jm.Placeholder(“M”)
z = jm.Binary(“z”, shape=(N,M))
x = jm.Binary(“x”)
Binaryクラス:0 or 1をとる決定変数
添え字のないバイナリ変
数
サイズが のバイナリ変
数
shapeにはPlaceholderも使える
y = jm.Binary(“y”, shape=5)
y = jm.Binary(“y”, shape=(5,))
POINT
サイズが5のバイナリ変数
総和記号の書き方
Copyright(C) 2022 JijInc, All Rights Reserved.
12
Elementクラス:和を取るための添え字
Sumクラス:総和記号
N = jm.Placeholder(“N”)
i = jm.Element(“i”, (0,N))
0からN-1までをとる添え字
タプル(0,N)は半開区間 を表す
POINT
a = jm.Placeholder(“a”, dim=1)
N = jm.Placeholder(“N”)
i = jm.Element(“i”, (0,N))
s = jm.Sum(i, a[i])
ベクトルaの0からN-1までの要素の総和をとる
添え字つき文字は[]を使う
POINT
13.
JijModelingの構成
Copyright(C) 2022 JijInc, All Rights Reserved.
Problem
Constraint
Penalty
数式を表現するクラス 最適化問題を表現するクラス
データを代入する対象
● Placeholder
● JaggedArray
● Binary
● Integer
決定変数
添え字
● Element
数学関数
● Sum
● Prod
● abs,ceil,floor,log2,ln
Constraint
Problem
制約条件の書き方
Copyright(C) 2022 JijInc, All Rights Reserved.
16
Constraintクラス:制約条件
“バイナリ変数x,yの和が1に等しくなければならない ”という制約条件を設定する
制約条件の設定は+=を使う
POINT
制約条件の名前 制約式
制約式の等号不等号には
比較演算子を使う
POINT
x + y == 1
x + y <= 1
等式制約
不等式制約
ナップサック問題を書いてみよう
Copyright(C) 2022 JijInc, All Rights Reserved.
19
変数をもれなく列挙する
POINT
Step1: 変数を書く
:スカラーのプレースホルダー
:スカラーのプレースホルダー
:ベクトル (dim=1) のプレースホルダー
:ベクトル (dim=1) のプレースホルダー
N = jm.Placeholder(“N”)
W = jm.Placeholder(“W”)
v = jm.Placeholder(“v”, dim=1)
w = jm.Placeholder(“w”, dim=1)
:サイズがNのバイナリ変数
x = jm.Binary(“x”, shape=N)
変数一覧
:0からN-1までの総和に使う添え字
i = jm.Element(“i”, shape=(0,N))
添え字も忘れず列挙する
POINT
20.
ナップサック問題を書いてみよう
Copyright(C) 2022 JijInc, All Rights Reserved.
20
Step2: 目的関数を書く
problem = jm.Problem(“ナップサック問題”)
変数一覧
“ナップサック問題”という名前の最適化問題を定義する
目的関数は総和記号で書かれている
problem += -jm.Sum(i, v[i] * x[i])
JijModelingのLaTeX表示機能を使って
数式を正しく書き写せているかを
常に確認する
POINT
21.
ナップサック問題を書いてみよう
Copyright(C) 2022 JijInc, All Rights Reserved.
21
Step3: 制約条件を書く 変数一覧
N個の商品から複数品を選んで価値を最大にしたい。
ただし、商品を詰める袋の総重量がWを超えないようにしなければならない。
“重量制限”という不等式制約がある
problem += jm.Constraint(“重量制限”, jm.Sum(i, w[i] * x[i]) <= W)
JijModelingのLaTeX表示機能を使って
数式を正しく書き写せているかを
常に確認する
POINT
22.
このセミナーのゴール
Copyright(C) 2022 JijInc, All Rights Reserved.
22
数式をJijModelingで書き写すことができる
import jijmodeling as jm
N = jm.Placeholder("N")
W = jm.Placeholder("W")
v = jm.Placeholder("v", dim=1)
w = jm.Placeholder("w", dim=1)
x = jm.Binary("x", shape=N)
i = jm.Element("i", (0,N))
problem = jm.Problem("ナップサック問題")
problem += -jm.Sum(i, v[i] * x[i])
problem += jm.Constraint("重量制限", jm.Sum(i, w[i] * x[i]) <= W)
JijModelingのLaTeX表示機能を使って
数式を正しく書き写せているかを
常に確認する
POINT
23.
よりJijModelingを知るために
Copyright(C) 2022 JijInc, All Rights Reserved.
Problem
Constraint
Penalty
数式を表現するクラス 最適化問題を表現するクラス
データを代入する対象
● Placeholder
● JaggedArray
● Binary
● Integer
決定変数
添え字
● Element
数学関数
● Sum
● Prod
● abs,ceil,floor,log2,ln
https://pypi.org/project/jijmodeling/
PyPI
https://www.documentation.jijzept.com/docs/jijmodeling_docs/
JijModelingドキュメント
https://www.ref.documentation.jijzept.com/jijmodeling/
JijModeling APIリファレンス