AMPL活用スライド

>100 Views

August 13, 26

スライド概要

AMPLのすべてを丁寧に解説

profile-image

MIKIO KUBO is a professor at Tokyo University of Marine Science and Technology, a director (CTO) at MOAI Lab, a director at A* Quantum, and an adviser at Optimind. He works on supply chain management (SCM) with an emphasis on optimization and machine (deep) learning. He founded Supply Chain Risk Management Forum and MOAI Forum.

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

最適化ソリューション開発を加速する 数理最適化モデリングツール AMPL 活用セミナー 野々部 宏司 株式会社MOAI Lab 法政大学デザイン工学部 2025年 9月 25日

2.

はじめに 最適化ソリューション 数理最適化技術を活用した問題解決・意思決定 ◼ 想定 ⚫ 解きたい最適化問題がある  (初期の)要件定義は完了している 最適化問題とは 種々の制約のもと,目的関数を最小化/最大化する問題 minimize subject to 2 𝑓(𝑥) 𝑥∈𝐹 𝑓(𝑥):目的関数 𝐹:実行可能領域 © 2025 MOAI Lab Inc.

3.

はじめに 最適化ソリューション 数理最適化技術を活用した問題解決・意思決定 ◼ 想定 ⚫ 解きたい最適化問題がある  (初期の)要件定義は完了している ⚫ 問題に特化した専用ソルバーを利用・開発するのではなく 汎用の数理最適化ソルバーを使って解く 専用ソルバーの利用が考えられる例  配送計画,ネットワーク設計,在庫最適化,最短経路, スケジューリング,パッキング,… 3 © 2025 MOAI Lab Inc.

4.

数理最適化ソルバー 最適化問題を解くソフトウェア/汎用ソルバー ◼ 対象とする最適化問題(モデル)の種類によって分類される ⚫ 線形最適化(LP),混合整数最適化(MIP) 商用:GUROBI, CPLEX, XPRESS, COPT  オープンソース:HiGHS, SCIP, CBC  ⚫ 非線形最適化(NLP) 商用:KNITRO, CONOPT, MINOS, SNOPT  オープンソース:IPOPT  ⚫ 大域的最適化  4 商用:BARON © 2025 MOAI Lab Inc.

5.

例:多品種輸送問題(具体例) 生産可能製品 2 重量1単位あたり 輸送費用 4 工場 A 4 5 8 B 2 5 8 2 3 1000 5 3 4 80 85 300 6 1 2 3 4 270 160 200 7 1 2 3 4 250 130 350 4 1 2 3 4 160 60 200 3 Z 3 製品重量 2 Y 4 7 C 1 6 3 1000 1 X 6 生産容量 1000 1 倉庫 W 需要量 1 2 3 4 5 2 3 4 どの工場からどの倉庫にどの製品をどれだけ 輸送すれば総輸送費用を最小化できるか © 2025 MOAI Lab Inc.

6.

例:多品種輸送問題(具体例) LP定式化 6 © 2025 MOAI Lab Inc.

7.

例:多品種輸送問題(モデル) 工場集合 𝐼 生産可能 製品集合 重量1単位あたり 輸送費用 W 需要量 1 𝑐𝐴𝑊 A 𝑃𝐴 倉庫集合 𝐽 𝑐𝐴𝑋 経路集合 𝐴 ⊆ 𝐼 × 𝐽 B 𝑃𝐵 … 𝑑𝑊1 𝑑𝑊2 … 1 2 … 𝑑𝑋1 𝑑𝑋2 … 1 2 … 𝑑𝑌1 𝑑𝑌2 … X 𝑐𝐴𝑌 生産容量 𝑢𝐴 2 Y 𝑢𝐵 … 製品重量 𝑤1 𝑤2 … 7 … 2 … … … … 1 どの工場からどの倉庫にどの製品をどれだけ 輸送すれば総輸送費用を最小化できるか © 2025 MOAI Lab Inc.

8.

例:多品種輸送問題(モデル) LP定式化 𝑗∈𝐽 𝑖∈𝐼 𝑐𝑖𝑗 𝑤𝑝 𝑝 ∈ 𝑃𝑖 𝑢𝑖 8 𝑥𝑖𝑗𝑝 𝑑𝑗𝑝 (𝑖, 𝑗) ∈ 𝐴 ⊆ 𝐼 × 𝐽 © 2025 MOAI Lab Inc.

9.

問題例(インスタンス)と問題 抽象化 問題例(インスタンス) 「モデル」+「データ」 ⚫ ある特定の問題を与える ⚫ 具体的な数値を用いて表 される 具体化 問題 ⚫ ⚫ 「モデル」 同様の構造を有する問題例 の集合を与える 集合やパラメータを用いて 表される +「データ」 ◼ 最適解を求めるために実際にソルバーに入力するのは問題例 ◼ 問題例も「モデル」と呼ばれる 以下では問題例を「具体モデル」,問題を「抽象モデル」として 区別し,単に「モデル」と言う場合は後者を指すこととする 9 © 2025 MOAI Lab Inc.

10.

モデリングツール(モデラー) 解きたい問題例(モデル+データ)をソルバー対応の形式に変換して (LP, MIP, QCPなど) ソルバーに入力し,計算結果を取得 ⚫ 元の問題を表現する抽象モデルの構築 ⚫ インスタンス(具体モデル)の生成 モデル インスタンス 元の問題 計算結果 データ モデラー ソルバー 以下では,Python環境からの利用を想定する 10 © 2025 MOAI Lab Inc.

11.

代表的なPythonベースのモデラー ◼ Gurobipy:GUROBIソルバーのPython API ◼ pySCIPOpt:SCIPソルバーのPython API ◼ PuLP:LP/MILPに特化したシンプルなモデラー ◼ Pyomo:表現力・柔軟性の高いモデリングフレームワーク ◼ amplpy:AMPLのPython API AMPL(A Mathematical Programming Language): 数理最適化問題を記述し,解決するための代数的モデリング言語 (および これをベースとしたモデリングツール) ⚫ 11 1980年代後半,ベル研究所の Robert Fourer,David M. Gay,Brian W. Kernighan によって開発  長年の実績と技術的蓄積  学術界および産業界で広く利用 © 2025 MOAI Lab Inc.

12.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 12 © 2025 MOAI Lab Inc.

13.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 13 © 2025 MOAI Lab Inc.

14.

ソルバー非依存 様々な最適化ソルバーとの連携が可能 ◼ Gurobipy, pySCIPOpt:ソルバー依存 ⚫ 利用するソルバーが確定している場合,複雑なアルゴリズムや 高度な機能(コールバック機能など)を利用する場合は有効 ◼ PuLP, Pyomo, amplpy:ソルバー非依存 ⚫ ⚫ ソルバーの切替が容易 選択肢の多さは amplpy(AMPL) が若干優位 GUROBI, CPLEX, XPRESS, COPT, HiGHS, SCIP, CBC, KNITRO, CONOPT, MINOS, SNOPT, IPOPT, BARON など 14 © 2025 MOAI Lab Inc.

15.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 15 © 2025 MOAI Lab Inc.

16.

データの表現例 ORIG = [‘A’, ‘B’, ‘C‘] # 工場集合 I DEST = [‘W’, ‘X’, ‘Y’, ‘Z‘] # 倉庫集合 J PROD = {‘A’: [2,4], ‘B’: [1,2,3], ‘C’: [1,3,4]} # 生産可能製品集合 P_i PRODALL = sorted({p for i in ORIG for p in PROD[i]}) ARCS = [('A', 'W'), ('A', 'X'), ('A', 'Y'), ('B', 'W'), ('B', 'X'), ('B', 'Y'), ('B', 'Z'), (‘C’, ‘X’), (‘C’, ‘Y’), (‘C’, ‘Z‘)] # 輸送経路集合 A capacity = {‘A’: 1000, ‘B’: 1000, ‘C’: 1000} # 生産容量 u_i demand = { ('W', 1): 80, ('W', 2): 85, ('W', 3): 300, ('W', 4): 6, ('X', 1): 270, ('X', 2): 160, ('X', 3): 200, ('X', 4): 7, ('Y', 1): 250, ('Y', 2): 130, ('Y', 3): 350, ('Y', 4): 4, (‘Z’, 1): 160, (‘Z’, 2): 60, (‘Z’, 3): 200, (‘Z’, 4): 3} # 需要 d_jp cost = { ('A', 'W'): 4, ('A', 'X'): 5, ('A', 'Y'): 6, ('B', 'W'): 8, ('B', 'X'): 6, ('B', 'Y'): 5, ('B', 'Z'): 8, (‘C’, ‘X’): 7, (‘C’, ‘Y’): 4, (‘C’, ‘Z’): 3} # 輸送費用/重量1単位 c_ij weight = {1: 5, 2: 2, 3: 3, 4: 4} # 製品重量 w_p 16 © 2025 MOAI Lab Inc.

17.
[beta]
Gurobipyのコード例
from gurobipy import Model, GRB, quicksum
m = Model("多品種輸送問題")
Model:具体モデル
# ----- 変数 ----Flow = {}
for i, j in ARCS:
for p in PROD[i]:
Flow[i, j, p] = m.addVar(name=f"Flow[{i},{j},{p}]", lb=0)
m.update()
# ----- 目的関数 ----m.setObjective(
quicksum(cost[i, j] * weight[p] * Flow[i, j, p] for i, j, p in Flow),
GRB.MINIMIZE)
# ----- 需要制約 ----for j in DEST:
for p in PRODALL:
m.addConstr(quicksum(Flow[i, j, p] for i in ORIG
if (i, j) in ARCS_set and p in PROD[i])
== demand[(j, p)],
name=f"Demand[{j},{p}]")
# ----- 容量制約 ----for i in ORIG:
m.addConstr(quicksum(Flow[ii, j, p] for ii, j, p in Flow.keys() if ii == i)
<= capacity[i],
name=f"Capacity[{i}]")
m.optimize()

モデルの構築とインスタンス生成の両方を含む

17

© 2025 MOAI Lab Inc.

18.
[beta]
amplpyのコード例(.mod)
sample.mod

# 集合・パラメータ
set ORIG;
# 工場
(テキストファイル)
set DEST;
# 倉庫
set PROD {ORIG}; # 製品
set PRODALL = union {i in ORIG} PROD[i];
set ARCS within ORIG cross DEST;
# 輸送経路
表現が直感的で簡潔
param capacity {ORIG} >= 0;
# 生産可能量
param demand {DEST, PRODALL} >= 0; # 需要量
param cost {ARCS} >= 0;
# 重量1単位あたりの輸送費用
param weight {PRODALL} >= 0;
# 製品重量

モデルのみを記述

# 決定変数
var Flow {(i,j) in ARCS, p in PROD[i]} >= 0;
# 目的関数:総費用最小化
minimize Total_Cost:
sum {(i,j) in ARCS, p in PROD[i]} cost[i,j] * weight[p] * Flow[i,j,p];
# 制約1: 需要制約
subject to Demand_Req {j in DEST, p in PRODALL}:
sum {(i,j) in ARCS: p in PROD[i]} Flow[i,j,p] = demand[j,p];
# 制約2: 容量制約
subject to Capacity_Limit {i in ORIG}:
sum {(i,j) in ARCS, p in PROD[i]} Flow[i,j,p] <= capacity[i];
18

© 2025 MOAI Lab Inc.

19.

amplpyのコード例(.py) from amplpy import AMPL # -----AMPLオブジェクトの初期化----ampl = AMPL() # -----モデルファイルの読み込み----ampl.read("sample.mod") モデルファイル:モデル構築 Pythonコード:インスタンス生成 役割が明確 # -----集合を設定----ampl.set['ORIG'] = ORIG ampl.set['DEST'] = DEST ampl.set['PROD'] = PROD ampl.set['ARCS'] = ARCS # -----パラメータを設定----ampl.param['capacity'] = capacity ampl.param['demand'] = demand ampl.param['cost'] = cost ampl.param['weight'] = weight # -----ソルバーを設定して実行----ampl.option['solver'] = 'gurobi' ampl.solve() 19 © 2025 MOAI Lab Inc.

20.
[beta]
Pyomoのコード例
import pyomo.environ as pyo
m = pyo.AbstractModel(name="多品種輸送問題")

AbstractModel:抽象モデル
# ---- 集合・パラメータ ---m.ORIG = pyo.Set(doc="工場")
m.DEST = pyo.Set(doc="倉庫")
m.ARCS = pyo.Set(dimen=2, within=m.ORIG * m.DEST, doc="輸送経路")
m.PROD = pyo.Set(m.ORIG, doc="製品")
m.PRODALL = pyo.Set(
initialize=lambda m: sorted({p for i in m.ORIG for p in m.PROD[i]}),
doc="全製品")
m.capacity = pyo.Param(m.ORIG, within=pyo.NonNegativeReals, doc="生産可能量")
m.demand = pyo.Param(m.DEST, m.PRODALL, within=pyo.NonNegativeReals,
doc="需要量")
m.cost = pyo.Param(m.ARCS, within=pyo.NonNegativeReals, doc="輸送費用")
m.weight = pyo.Param(m.PRODALL, within=pyo.NonNegativeReals, doc="製品重量")
# ---- 変数 ---m.FlowIndex = pyo.Set(
dimen=3,
initialize=lambda m: ((i,j,p) for (i,j) in m.ARCS for p in m.PROD[i]))
m.Flow = pyo.Var(m.FlowIndex, within=pyo.NonNegativeReals)
20

© 2025 MOAI Lab Inc.

21.

Pyomoのコード例(続き) # ---- 目的関数:費用最小化 ---def _obj_rule(mm): return sum(mm.cost[i, j] * mm.weight[p] * mm.Flow[i, j, p] for (i, j, p) in mm.FlowIndex) m.Total_Cost = pyo.Objective(rule=_obj_rule, sense=pyo.minimize) # ---- 制約1:需要制約 ---def _demand_rule(mm, j, p): return sum(mm.Flow[i, j, p] for i in mm.ORIG if (i, j) in mm.ARCS and p in mm.PROD[i]) == mm.demand[j, p] m.Demand_Req = pyo.Constraint(m.DEST, m.PRODALL, rule=_demand_rule) # ---- 制約2:容量制約 ---def _cap_rule(mm, i): return sum(mm.Flow[ii, j, p] for (ii, j, p) in mm.FlowIndex if ii == i) <= mm.capacity[i] m.Capacity_Limit = pyo.Constraint(m.ORIG, rule=_cap_rule) 21 © 2025 MOAI Lab Inc.

22.
[beta]
Pyomoのコード例(続き)
model = m.create_instance({
None:{
'ORIG': {None: ORIG},
'DEST': {None: DEST},
'ARCS': {None: ARCS},
'PROD': {i: list(PROD[i]) for i in ORIG},
'capacity': capacity,
'cost': cost,
'demand': demand,
'weight': weight,
}
}
)

抽象モデルにデータを設定して
具体モデルを生成

# -----ソルバーを設定して実行----solver = pyo.SolverFactory("gurobi")
res = solver.solve(model)

22

© 2025 MOAI Lab Inc.

23.

モデルとデータの分離 ◼ AMPL と Pyomo は抽象モデルと具体モデルを区別する (Gurobipy や PuLP には抽象モデルの概念はない) ⚫ ⚫ ⚫ 保守性が高い チーム開発に適している モデルに集合やパラメータの情報を含むため,データの整合性 チェックの実現が容易(後述) ◼ AMPL vs Pyomo ⚫ AMPL:可読性・操作性に優れる   ⚫ Pyomo:拡張性に優れる   23 独自の代数的言語により,直感的で簡潔な表現が可能(後述) モデルとデータを言語レベルで分離 Pythonで完結可能 複雑な制約もPython関数として柔軟に定義可能 © 2025 MOAI Lab Inc.

24.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 AMPLのインスタンス生成は高速 ⚫ ⚫ C++ による実装 大規模の場合,AMPL は Pyomo と比較して数十~百倍以上高速 との報告あり ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 24 © 2025 MOAI Lab Inc.

25.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 25 © 2025 MOAI Lab Inc.

26.

集合 set ◼ モデル内の要素の集合を表す 例:製品,期間,場所,原材料 ⚫ 各要素は「文字列」または「数値」 ⚫ ◼ モデルの基本的なインデックス(添え字)を定義する ⚫ 多くのパラメータ,変数,制約等は,何らかの集合上で インデックス付けされる set PRODUCTS; # 製品集合 set RESOURCES; # 資源集合 26 © 2025 MOAI Lab Inc.

27.

パラメータ param ◼ モデル内の既知の定数を表す 例:コスト,容量,需要,係数 ⚫ 主に「数値」であるが,「文字列」も可(symbolic) ⚫ ◼ スカラーまたはインデックス付きとして定義 ⚫ 複数のインデックス(多次元)も可 param production_capacity; set PRODUCTS; param demand {PRODUCTS}; 27 # 生産能力(スカラー) # 各製品の需要量 © 2025 MOAI Lab Inc.

28.

決定変数 var ◼ モデルが決定すべき未知の値を表す 例:生産量,輸送量,割当て(0 または 1) ⚫ 最適化計算によって値が定まる ⚫ ◼ インデックス付けが可能(パラメータと同様) set PRODUCTS; var Produce {PRODUCTS}; # 各製品の生産量 set LOCATIONS; set CUSTOMERS; var Transport {PRODUCTS, LOCATIONS, CUSTOMERS}; # 各製品の各拠点から各顧客への輸送量 28 © 2025 MOAI Lab Inc.

29.
[beta]
決定変数 var
◼ 型指定:整数変数(integer),バイナリ変数(binary)

◼ 上下限制約:

>= lower_bound:下限
⚫ <= upper_bound:上限
⚫ = fixed_value:固定値
⚫

param max_production {PRODUCTS};
param min_batch_size {PRODUCTS};
var Produce {p in PRODUCTS} >= min_batch_size[p],
<= max_production[p];
var Build {LOCATIONS} binary;
var NumWorkers {LOCATIONS} integer, >= 0;
29

© 2025 MOAI Lab Inc.

30.

目的関数 maximize/minimize ◼ 最適化(最大化または最小化)したい指標 ◼ 変数とパラメータを用いた数式で表現される set PRODUCTS; param unit_profit {PRODUCTS}; param unit_cost {PRODUCTS}; var Produce {PRODUCTS} >= 0; # Example 1: Maximize total profit maximize TotalProfit: sum {p in PRODUCTS} unit_profit[p] * Produce[p]; # Example 2: Minimize total cost minimize TotalCost: sum {p in PRODUCTS} unit_cost[p] * Produce[p]; 30 © 2025 MOAI Lab Inc.

31.
[beta]
目的関数 maximize/minimize
◼ 式の表現

算術演算子(+, -, *, /, ^ など)
⚫ 総和(sum {index_set} expression)
⚫ 積(prod {index_set} expression)
⚫ 組み込み関数(exp, log, sqrt, abs, sin, cos など)
⚫ 条件(if condition then expr1 else expr2)
⚫

maximize ComplexObjective:
sum {i in I} profit[i] * X[i]
- sum {j in J} cost[j] * Y[j]^2;

31

© 2025 MOAI Lab Inc.

32.
[beta]
制約 subject to
◼ モデルの解が満たすべき条件や制限

例:リソースの制限,需要の充足,物理的な制約
⚫ インデックス付けが可能
⚫

# 等式制約
subject to ProductionTarget:
sum {p in PRODUCTS} Produce[p]
= total_production_target;
# 各資源の資源制約
subject to ResourceLimit {r in RESOURCES}:
sum {p in PRODUCTS} usage[r,p] * Produce[p]
<= availability[r];

32

© 2025 MOAI Lab Inc.

33.

インデックス付き集合 ◼ 他の集合の要素によってインデックス付けされる集合 ⚫ 例:各製品を製造するために必要な部品の集合 set PRODUCTS; set PARTS_NEEDED {PRODUCTS}; 33 # 各製品に必要な部品集合 © 2025 MOAI Lab Inc.

34.
[beta]
順序付き集合 ordered
◼ 要素に順序のある集合
⚫

例:期間,ステップ

⚫

first(), last(), next(), prev(), ord() などの関数が

利用可能
⚫ 循環構造をもたせることも可能 (circular)
set PERIODS ordered; # 期間の集合
param initial_inventory {PRODUCTS}; # 各製品の初期在庫量
var Inventory {PRODUCTS, PERIODS};
subject to InventoryBalance
{p in PRODUCTS, t in PERIODS: t != first(PERIODS)}:
Inventory[p,t] = Inventory[p, prev(t)] + ... ;

34

© 2025 MOAI Lab Inc.

35.
[beta]
順序対集合
◼ 順序対を要素とする集合
⚫

例:ODペア

◼ 3つ組以上を要素とすることも可能
set ORIG; # origins
set DEST; # destinations
set LINKS = {ORIG,DEST};
#set LINKS dimen 2; # 2次元要素の集合であることを宣言する場合
param cost {LINKS} >= 0; # shipment costs per unit
var Trans {LINKS} >= 0; # units to be shipped
minimize Total_Cost:
sum {(i,j) in LINKS} cost[i,j] * Trans[i,j];
35

© 2025 MOAI Lab Inc.

36.

集合に関する演算 ◼ 集合演算 ⚫ union:和集合 ⚫ inter:積集合 (共通部分) ⚫ diff:差集合 ⚫ symdiff:対称差集合 set A := 1 2 3; set B := 3 4 5; A union B; A inter B; A diff B; B diff A; A symdiff B; 36 # {1, 2, 3, 4, 5} # {3} # {1, 2} # {4, 5} # {1, 2, 4, 5} © 2025 MOAI Lab Inc.

37.

パラメータ:計算パラメータ ◼ パラメータの値を,他のパラメータや定数から計算に よって定めることができる ⚫ データファイルで値を上書きすることはできない param unit_cost; # 価格(税抜き) param tax_rate; # 税率 param total_cost := unit_cost * (1 + tax_rate); # 税込価格 unit_cost = 12 tax_rate = 0.10 のとき, total_cost = 12 * (1 + 0.10) = 13.2 37 © 2025 MOAI Lab Inc.

38.

パラメータ:デフォルト値 ◼ 宣言時にデフォルト値を指定できる(default) ⚫ 同じデータ(値)を指定する手間の削減 set PRODUCTS; param tax_rate {PRODUCTS} default 0.05; # デフォルト値は5% tax_rate[WidgetA] = 0.08 のみが設定されているとき, tax_rate[WidgetB] = 0.05 38 © 2025 MOAI Lab Inc.

39.
[beta]
条件付きインデックス
◼ インデックス付けやsum等の演算において,

対象とするインデックスを条件で絞ることができる
◼ 算術・論理演算
⚫
⚫

⚫
⚫

if-then-else, or, and, exists, forall, not, in, not in
<, <=, =, <>, >, >=
sum, prod, min, max
+, -, *, /, div, mod, ^

set NUTREQ = {i in NUTR: i in MAXREQ or n_min[i] > 0};
#set NUTREQ = MAXREQ union {i in MINREQ: n_min[i] > 0};
subject to Balance {p in PROD, t in WEEKS: ord(t) > 1}:
Make[p,t] + Inv[p,prev(t)] = Sell[p,t] + Inv[p,t];
39

© 2025 MOAI Lab Inc.

40.

データの整合性 ◼ 宣言時指定 within:集合が,別の集合の部分集合であることを明示 ⚫ in:パラメータが,ある集合の要素であることを明示 データの整合性を保つのに役立つ ⚫ set LOCATIONS; set ORIGINS within LOCATIONS; param ORIGIN symbolic in LOCATIONS; LOCATIONS = {London,Paris,Berlin} のとき,以下の操作はエラー 40 ⚫ ORIGINS に {London,Tokyo} を設定 ⚫ ORIGIN に Tokyo を設定 © 2025 MOAI Lab Inc.

41.
[beta]
データの妥当性チェック
◼ データが満たすべき条件を記載(check)

データ読み込み時にチェックが行われる
param supply {ORIG} >= 0;
param demand {DEST} >= 0;
check: sum {i in ORIG} supply[i]
= sum {j in DEST} demand[j];
param S > 0;
param prob {1..S} >= 0, <= 1;
check: 0.99999 < sum {s in 1..S} prob[s] < 1.00001;

41

© 2025 MOAI Lab Inc.

42.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 直感的かつ豊富な構文 ⚫ AMPL記法に慣れる必要はある ただし,学習コストはそれほど高くない ◼ 自動再定式化機能 ◼ 非線形問題への対応 42 © 2025 MOAI Lab Inc.

43.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 43 © 2025 MOAI Lab Inc.

44.
[beta]
自動再定式化機能(MPライブラリ)
◼ モデリングにおける多様な表現を実現

ソルバーが非対応の場合,適宜,自動的に再定式化が行われる
(式変形・変数追加など)
⚫

条件演算子:if-then-else, ==>, <==, <==>

⚫

論理演算子:or, and, not, exists, forall

⚫

区分線形関数・演算子:<<breakpoints; slopes>>, abs, min,
max

⚫

計数演算子:count, atmost, atleast, exactly, numberof

⚫

比較演算子:>, <, !=, alldiff

⚫

相補性演算子:complements

⚫

非線形演算子・関数:*, /, ^, exp, log, sin, cos, tan

⚫

離散領域:in

Fourer, Belov, Brandão, Advances in Model-Based Optimization with AMPL, ICCOPT2022.
44

© 2025 MOAI Lab Inc.

45.
[beta]
例:固定費用
var Flow {(i,j) in ARCS, p in PROD[i]} >= 0;
⚫

線形定式化

var Use {ARCS} binary;
sum {(i,j) in ARCS} fix_cost[i,j] * Use[i,j];
subject to Arc_capacity {(i,j) in ARCS}:
sum {p in PROD} Flow[i,j,p] <= arc_cap[i,j] * Use[i,j];

⚫

より自然な定式化―バイナリ変数不要

sum {(i,j) in ARCS}
if sum {p in PROD} Flow[i,j,p] > 0 then fix_cost[i,j]

45

© 2025 MOAI Lab Inc.

46.
[beta]
例:最小流量
一定量に満たない量を流すことが許されない場合
⚫

線形定式化

sum {p in PROD} Flow[i,j,p] >= min_amount * Use[i,j];
sum {p in PROD} Flow[i,j,p] <= arc_cap[i,j] * Use[i,j];

⚫

より自然な定式化―バイナリ変数不要

sum {p in PROD} Flow[i,j,p] = 0 or
min_amount <= sum {p in PROD} Flow[p,i,j] <= arc_cap[i,j]

46

© 2025 MOAI Lab Inc.

47.
[beta]
例:本数制限
流量が正のアークの本数に制限がある場合
⚫

線形定式化

sum {(i,j) in ARCS} Use[i,j] <= max_arcs;

⚫

より自然な定式化―バイナリ変数不要

atmost max_arcs {(i,j) in ARCS}
(sum {p in PROD} Flow[p,i,j] > 0);

47

© 2025 MOAI Lab Inc.

48.
[beta]
例:区分線形費用
<<breakpoint-list; slope-list>>
⚫ abs, min, max
⚫

minimize Total_Cost:
sum {(i,j) in ARCS}
<<{k in 1..npiece[i,j]-1} limit[i,j,k];
{k in 1..npiece[i,j]} rate[i,j,k]>> Flow[i,j];

rate[i,j,3]
rate[i,j,2]
rate[i,j,1]
limit[i,j,1] limit[i,j,2]

48

Flow[i,j]

© 2025 MOAI Lab Inc.

49.

例:離散領域 ⚫ var-in var Flow {(i,j) in ARCS} in {0} union interval[min_amount,arc_cap[i,j]]; Flow[i,j] 0 49 min_amount arc_cap[i,j] © 2025 MOAI Lab Inc.

50.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 開発プロセスにおける ⚫ 問題設定の見直し ← 要件定義 ⚫ 定式化 ← ソルバー対応の形式で表現 に要する手間・時間を軽減 ◼ 非線形問題への対応 50 © 2025 MOAI Lab Inc.

51.

AMPLの主な特長 ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 51 © 2025 MOAI Lab Inc.

52.

非線形問題への対応 ◼ 直感的,数学的な記述が可能 subject to SineConstraint: y = sin(x); ⚫ ⚫ Gurobipy の場合:m.addGenConstrSin(x, y) Pyomo の場合:m.y == pyo.sin(m.x) ◼ 自動微分機能 非線形最適化で求められる1次導関数(勾配)・2次導関数 (ヘッセ行列)を自動微分で計算し,ソルバーに提供 ⚫ 解析的で正確(有限差分法などの数値的な近似手法でない) ⚫ Pyomo には微分計算は内蔵されていない(別途パッケージが必要) ◼ 区分線形関数による近似(線形最適化ソルバーの場合) ⚫ 変換が自動的に行われるが,誤差が発生する点に注意 52 © 2025 MOAI Lab Inc.

53.

AMPLの主な特長(再掲) ◼ ソルバー非依存 ◼ モデルとデータの分離 ◼ 高速なインスタンス生成 ◼ 可読性と表現力に優れた記法 ◼ 自動再定式化機能 ◼ 非線形問題への対応 53 © 2025 MOAI Lab Inc.

54.

AMPLライセンス ◼ ライセンスなし 変数・制約数,機能に制限あり ◼ Community Edition 無料,商用利用不可/開発目的可 ⚫ オープンソース・ソルバーがバンドル ⚫ 商用ソルバーのトライアル版も利用可能 ◼ 商用ライセンス 各種ライセンス形態あり ◼ アカデミックライセンス 教育・研究目的で無料/割引 54 © 2025 MOAI Lab Inc.

55.

開発・実行環境 ◼ AMPL IDE ◼ コマンドラインインタフェース ◼ VS Code 拡張機能 ◼ 各種API:Python, R, … など 55 © 2025 MOAI Lab Inc.

56.

学習リソース ◼ AMPL公式サイト(https://ampl.com/) ⚫ 各種ドキュメント,ダウンロード,ブログ,例題など ◼ AMPL: A Modeling Language for Mathematical Programming, by R. Fourer, D.M.Gay and B.W. Kernighan ⚫ ⚫ AMPLのバイブル.詳細な解説と多数の例題 AMPL公式サイトからダウンロード可能 ◼ AMPL Discourse (https://discuss.ampl.com/) ⚫ 56 質問したり,他のユーザーと議論したりする場 © 2025 MOAI Lab Inc.

57.

おわりに 数理最適化モデリングツール AMPL の紹介 ◼ amplpy による Python エコシステムとの融合 ◼ とくに産業応用の場において 最適化ソリューション開発プロセスの効率性 ⚫ システムの保守性・操作性・拡張性・安定性 の観点でメリット ⚫ 57 © 2025 MOAI Lab Inc.