数理最適化入門セミナー
第1回
数理モデルを記述するための
JijModelingの紹介
1
自己紹介
Copyright(C) 2022 Jij Inc, All Rights Reserved.
2
清水 太朗(したろう)
Taro Shimizu (Shitaro)
● 博士(理学)
物理学(非線形力学系)
● 白衣を愛着
● JijModelingの開発
Python
● JijZeptのコンパイルシステムの開発
Rust
アウトライン
Copyright(C) 2022 Jij Inc, All Rights Reserved.
3
● 最適化計算の概要
JijModelingは何をするのか?
● JijModelingの基礎的な機能の紹介
数式を表現する
最適化問題を表現する
● JijModelingの使用例
ナップサック問題を書く
最適化計算とは
Copyright(C) 2022 Jij Inc, All Rights Reserved.
4
数理モデルの構築・変換
仮説立案
ビジネス・技術課題定義
ソリューションの要件定義
実装・仮説検証
最適化計算の実行
仮説検証
仕事が多い...
自動化できないか?
● 残業は2時間まで
● 連続勤務はダメ
● 休憩は1時間以上
● 週30時間まで
● 深夜残業はダメ
● ワンオペダメ
● etc…
JijModelingを使った最適化計算の流れ
Copyright(C) 2022 Jij Inc, All Rights Reserved.
5
JijModeling
最適化問題
ソルバー
定式化
実装
求解
解きたい問題を数式で書く
解きたい問題をプログラムで
書く
解きたい問題をソルバーに解
かせる
● シミュレーテッドアニーリングソルバー
● 量子アニーリングソルバー
● 厳密解ソルバー
実データ
N = 4
W = 11
v = [2,3,6,4]
w = [3,2,5,8]
JijModelingの特徴
Copyright(C) 2022 Jij Inc, 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リファレンス
このセミナーのゴール
Copyright(C) 2022 Jij Inc, 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)
JijModelingの構成
Copyright(C) 2022 Jij Inc, All Rights Reserved.
Problem
Constraint
Penalty
数式を表現するクラス 最適化問題を表現するクラス
データを代入する対象
● Placeholder
● JaggedArray
● Binary
● Integer
決定変数
添え字
● Element
数学関数
● Sum
● Prod
● abs,ceil,floor,log2,ln
Constraint
Problem
プレースホルダーの書き方
Copyright(C) 2022 Jij Inc, 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]
決定変数の書き方
Copyright(C) 2022 Jij Inc, 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 Jij Inc, All Rights Reserved.
11
`+`:足し算 `-`:引き算
`*`:掛け算 `/`:割り算
総和記号の書き方
Copyright(C) 2022 Jij Inc, 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
JijModelingの構成
Copyright(C) 2022 Jij Inc, All Rights Reserved.
Problem
Constraint
Penalty
数式を表現するクラス 最適化問題を表現するクラス
データを代入する対象
● Placeholder
● JaggedArray
● Binary
● Integer
決定変数
添え字
● Element
数学関数
● Sum
● Prod
● abs,ceil,floor,log2,ln
Constraint
Problem
最適化問題の書き方
Copyright(C) 2022 Jij Inc, All Rights Reserved.
14
Problemクラス:最適化問題を表現・管理する
目的関数の書き方
Copyright(C) 2022 Jij Inc, All Rights Reserved.
15
problem += 数式
バイナリ変数x,yの和を最小化する問題
変数を定義する
目的関数を設定する
制約条件の書き方
Copyright(C) 2022 Jij Inc, All Rights Reserved.
16
Constraintクラス:制約条件
“バイナリ変数x,yの和が1に等しくなければならない ”という制約条件を設定する
制約条件の設定は+=を使う
POINT
制約条件の名前 制約式
制約式の等号不等号には
比較演算子を使う
POINT
x + y == 1
x + y <= 1
等式制約
不等式制約
ナップサック問題を書いてみよう
Copyright(C) 2022 Jij Inc, All Rights Reserved.
17
N個の商品から複数品を選んで価値を最大にしたい。
ただし、商品を詰める袋の総重量がWを超えないようにしなければならない。
:決定変数, 商品iを袋に...
● 入れる → 1
● 入れない → 0
:商品の数
:袋に詰めることのできる商品の総重量の上限値
:商品iの値段
:商品iの重さ
ナップサック問題を書いてみよう
Copyright(C) 2022 Jij Inc, All Rights Reserved.
18
Step1: 変数を書く
Step2: 目的関数を書く
Step3: 制約条件を書く
ナップサック問題を書いてみよう
Copyright(C) 2022 Jij Inc, 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
ナップサック問題を書いてみよう
Copyright(C) 2022 Jij Inc, All Rights Reserved.
20
Step2: 目的関数を書く
problem = jm.Problem(“ナップサック問題”)
変数一覧
“ナップサック問題”という名前の最適化問題を定義する
目的関数は総和記号で書かれている
problem += -jm.Sum(i, v[i] * x[i])
JijModelingのLaTeX表示機能を使って
数式を正しく書き写せているかを
常に確認する
POINT
ナップサック問題を書いてみよう
Copyright(C) 2022 Jij Inc, All Rights Reserved.
21
Step3: 制約条件を書く 変数一覧
N個の商品から複数品を選んで価値を最大にしたい。
ただし、商品を詰める袋の総重量がWを超えないようにしなければならない。
“重量制限”という不等式制約がある
problem += jm.Constraint(“重量制限”, jm.Sum(i, w[i] * x[i]) <= W)
JijModelingのLaTeX表示機能を使って
数式を正しく書き写せているかを
常に確認する
POINT
このセミナーのゴール
Copyright(C) 2022 Jij Inc, 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
よりJijModelingを知るために
Copyright(C) 2022 Jij Inc, 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リファレンス

Jij 数理最適化入門セミナー第1回「数理モデルを記述するためのJijModelingの紹介」

  • 1.
  • 2.
    自己紹介 Copyright(C) 2022 JijInc, All Rights Reserved. 2 清水 太朗(したろう) Taro Shimizu (Shitaro) ● 博士(理学) 物理学(非線形力学系) ● 白衣を愛着 ● JijModelingの開発 Python ● JijZeptのコンパイルシステムの開発 Rust
  • 3.
    アウトライン Copyright(C) 2022 JijInc, All Rights Reserved. 3 ● 最適化計算の概要 JijModelingは何をするのか? ● JijModelingの基礎的な機能の紹介 数式を表現する 最適化問題を表現する ● JijModelingの使用例 ナップサック問題を書く
  • 4.
    最適化計算とは Copyright(C) 2022 JijInc, All Rights Reserved. 4 数理モデルの構築・変換 仮説立案 ビジネス・技術課題定義 ソリューションの要件定義 実装・仮説検証 最適化計算の実行 仮説検証 仕事が多い... 自動化できないか? ● 残業は2時間まで ● 連続勤務はダメ ● 休憩は1時間以上 ● 週30時間まで ● 深夜残業はダメ ● ワンオペダメ ● etc…
  • 5.
    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のバイナリ変数
  • 11.
    四則演算の書き方 Copyright(C) 2022 JijInc, All Rights Reserved. 11 `+`:足し算 `-`:引き算 `*`:掛け算 `/`:割り算
  • 12.
    総和記号の書き方 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
  • 14.
    最適化問題の書き方 Copyright(C) 2022 JijInc, All Rights Reserved. 14 Problemクラス:最適化問題を表現・管理する
  • 15.
    目的関数の書き方 Copyright(C) 2022 JijInc, All Rights Reserved. 15 problem += 数式 バイナリ変数x,yの和を最小化する問題 変数を定義する 目的関数を設定する
  • 16.
    制約条件の書き方 Copyright(C) 2022 JijInc, All Rights Reserved. 16 Constraintクラス:制約条件 “バイナリ変数x,yの和が1に等しくなければならない ”という制約条件を設定する 制約条件の設定は+=を使う POINT 制約条件の名前 制約式 制約式の等号不等号には 比較演算子を使う POINT x + y == 1 x + y <= 1 等式制約 不等式制約
  • 17.
    ナップサック問題を書いてみよう Copyright(C) 2022 JijInc, All Rights Reserved. 17 N個の商品から複数品を選んで価値を最大にしたい。 ただし、商品を詰める袋の総重量がWを超えないようにしなければならない。 :決定変数, 商品iを袋に... ● 入れる → 1 ● 入れない → 0 :商品の数 :袋に詰めることのできる商品の総重量の上限値 :商品iの値段 :商品iの重さ
  • 18.
    ナップサック問題を書いてみよう Copyright(C) 2022 JijInc, All Rights Reserved. 18 Step1: 変数を書く Step2: 目的関数を書く Step3: 制約条件を書く
  • 19.
    ナップサック問題を書いてみよう 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リファレンス