---
title: AMPL活用スライド
tags: 
author: [MIKIO KUBO](https://www.docswell.com/user/mikiokubo)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/VEPK5RMZ78.jpg?width=480
description: AMPLのすべてを丁寧に解説
published: August 13, 26
canonical: https://www.docswell.com/s/mikiokubo/KE1WQN-AMPL
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/VEPK5RMZ78.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/27VVPR9M7Q.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/5JGLPMZX7L.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/47QY2RL5EP.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/KE4WL8DVJ1.jpg)

例：多品種輸送問題（具体例）
生産可能製品
2
重量１単位あたり
輸送費用
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.


# Page. 6

![Page Image](https://bcdn.docswell.com/page/L71YL2Z4JG.jpg)

例：多品種輸送問題（具体例）
LP定式化
6
© 2025 MOAI Lab Inc.


# Page. 7

![Page Image](https://bcdn.docswell.com/page/G7WGVR9ZE2.jpg)

例：多品種輸送問題（モデル）
工場集合 𝐼
生産可能
製品集合
重量１単位あたり
輸送費用
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.


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4JZL4R9LE3.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YE6W3RKMEV.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GE5ML8PQE4.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/9729LK6WJR.jpg)

代表的な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.


# Page. 12

![Page Image](https://bcdn.docswell.com/page/DJY4QN997M.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/V7NYKXLDE8.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/YJ9PV84873.jpg)

ソルバー非依存
様々な最適化ソルバーとの連携が可能
◼ 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.


# Page. 15

![Page Image](https://bcdn.docswell.com/page/GJ8DP8QZJD.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/LJLM1RX1ER.jpg)

データの表現例
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 = [(&#039;A&#039;, &#039;W&#039;), (&#039;A&#039;, &#039;X&#039;), (&#039;A&#039;, &#039;Y&#039;),
(&#039;B&#039;, &#039;W&#039;), (&#039;B&#039;, &#039;X&#039;), (&#039;B&#039;, &#039;Y&#039;), (&#039;B&#039;, &#039;Z&#039;),
(‘C’, ‘X’), (‘C’, ‘Y’), (‘C’, ‘Z‘)] # 輸送経路集合 A
capacity = {‘A’: 1000, ‘B’: 1000, ‘C’: 1000} # 生産容量 u_i
demand = {
(&#039;W&#039;, 1): 80, (&#039;W&#039;, 2): 85, (&#039;W&#039;, 3): 300, (&#039;W&#039;, 4): 6,
(&#039;X&#039;, 1): 270, (&#039;X&#039;, 2): 160, (&#039;X&#039;, 3): 200, (&#039;X&#039;, 4): 7,
(&#039;Y&#039;, 1): 250, (&#039;Y&#039;, 2): 130, (&#039;Y&#039;, 3): 350, (&#039;Y&#039;, 4): 4,
(‘Z’, 1): 160, (‘Z’, 2): 60, (‘Z’, 3): 200, (‘Z’, 4): 3} # 需要 d_jp
cost = {
(&#039;A&#039;, &#039;W&#039;): 4, (&#039;A&#039;, &#039;X&#039;): 5, (&#039;A&#039;, &#039;Y&#039;): 6,
(&#039;B&#039;, &#039;W&#039;): 8, (&#039;B&#039;, &#039;X&#039;): 6, (&#039;B&#039;, &#039;Y&#039;): 5, (&#039;B&#039;, &#039;Z&#039;): 8,
(‘C’, ‘X’): 7, (‘C’, ‘Y’): 4, (‘C’, ‘Z’): 3} # 輸送費用/重量１単位 c_ij
weight = {1: 5, 2: 2, 3: 3, 4: 4} # 製品重量 w_p
16
© 2025 MOAI Lab Inc.


# Page. 17

![Page Image](https://bcdn.docswell.com/page/47MYWRL57W.jpg)

Gurobipyのコード例
from gurobipy import Model, GRB, quicksum
m = Model(&quot;多品種輸送問題&quot;)
Model：具体モデル
# ----- 変数 ----Flow = {}
for i, j in ARCS:
for p in PROD[i]:
Flow[i, j, p] = m.addVar(name=f&quot;Flow[{i},{j},{p}]&quot;, 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&quot;Demand[{j},{p}]&quot;)
# ----- 容量制約 ----for i in ORIG:
m.addConstr(quicksum(Flow[ii, j, p] for ii, j, p in Flow.keys() if ii == i)
&lt;= capacity[i],
name=f&quot;Capacity[{i}]&quot;)
m.optimize()
モデルの構築とインスタンス生成の両方を含む
17
© 2025 MOAI Lab Inc.


# Page. 18

![Page Image](https://bcdn.docswell.com/page/P7R9YRKZE9.jpg)

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} &gt;= 0;
# 生産可能量
param demand {DEST, PRODALL} &gt;= 0; # 需要量
param cost {ARCS} &gt;= 0;
# 重量１単位あたりの輸送費用
param weight {PRODALL} &gt;= 0;
# 製品重量
モデルのみを記述
# 決定変数
var Flow {(i,j) in ARCS, p in PROD[i]} &gt;= 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] &lt;= capacity[i];
18
© 2025 MOAI Lab Inc.


# Page. 19

![Page Image](https://bcdn.docswell.com/page/PJXQGRL17X.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/3JK94RLMJD.jpg)

Pyomoのコード例
import pyomo.environ as pyo
m = pyo.AbstractModel(name=&quot;多品種輸送問題&quot;)
AbstractModel：抽象モデル
# ---- 集合・パラメータ ---m.ORIG = pyo.Set(doc=&quot;工場&quot;)
m.DEST = pyo.Set(doc=&quot;倉庫&quot;)
m.ARCS = pyo.Set(dimen=2, within=m.ORIG * m.DEST, doc=&quot;輸送経路&quot;)
m.PROD = pyo.Set(m.ORIG, doc=&quot;製品&quot;)
m.PRODALL = pyo.Set(
initialize=lambda m: sorted({p for i in m.ORIG for p in m.PROD[i]}),
doc=&quot;全製品&quot;)
m.capacity = pyo.Param(m.ORIG, within=pyo.NonNegativeReals, doc=&quot;生産可能量&quot;)
m.demand = pyo.Param(m.DEST, m.PRODALL, within=pyo.NonNegativeReals,
doc=&quot;需要量&quot;)
m.cost = pyo.Param(m.ARCS, within=pyo.NonNegativeReals, doc=&quot;輸送費用&quot;)
m.weight = pyo.Param(m.PRODALL, within=pyo.NonNegativeReals, doc=&quot;製品重量&quot;)
# ---- 変数 ---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.


# Page. 21

![Page Image](https://bcdn.docswell.com/page/LE3WL832E5.jpg)

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) &lt;= mm.capacity[i]
m.Capacity_Limit = pyo.Constraint(m.ORIG, rule=_cap_rule)
21
© 2025 MOAI Lab Inc.


# Page. 22

![Page Image](https://bcdn.docswell.com/page/8EDKNM467G.jpg)

Pyomoのコード例（続き）
model = m.create_instance({
None:{
&#039;ORIG&#039;: {None: ORIG},
&#039;DEST&#039;: {None: DEST},
&#039;ARCS&#039;: {None: ARCS},
&#039;PROD&#039;: {i: list(PROD[i]) for i in ORIG},
&#039;capacity&#039;: capacity,
&#039;cost&#039;: cost,
&#039;demand&#039;: demand,
&#039;weight&#039;: weight,
}
}
)
抽象モデルにデータを設定して
具体モデルを生成
# -----ソルバーを設定して実行----solver = pyo.SolverFactory(&quot;gurobi&quot;)
res = solver.solve(model)
22
© 2025 MOAI Lab Inc.


# Page. 23

![Page Image](https://bcdn.docswell.com/page/V7PK5RVZJ8.jpg)

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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/2JVVPRZMJQ.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/5EGLPM4XJL.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/4JQY2RG57P.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/K74WL85VE1.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/LJ1YL2W4EG.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/GJWGVR6Z72.jpg)

決定変数 var
◼ 型指定：整数変数（integer），バイナリ変数（binary）
◼ 上下限制約：
&gt;= lower_bound：下限
⚫ &lt;= upper_bound：上限
⚫ = fixed_value：固定値
⚫
param max_production {PRODUCTS};
param min_batch_size {PRODUCTS};
var Produce {p in PRODUCTS} &gt;= min_batch_size[p],
&lt;= max_production[p];
var Build {LOCATIONS} binary;
var NumWorkers {LOCATIONS} integer, &gt;= 0;
29
© 2025 MOAI Lab Inc.


# Page. 30

![Page Image](https://bcdn.docswell.com/page/4EZL4RYL73.jpg)

目的関数 maximize/minimize
◼ 最適化（最大化または最小化）したい指標
◼ 変数とパラメータを用いた数式で表現される
set PRODUCTS;
param unit_profit {PRODUCTS};
param unit_cost {PRODUCTS};
var Produce {PRODUCTS} &gt;= 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.


# Page. 31

![Page Image](https://bcdn.docswell.com/page/Y76W3RDM7V.jpg)

目的関数 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.


# Page. 32

![Page Image](https://bcdn.docswell.com/page/G75ML83Q74.jpg)

制約 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]
&lt;= availability[r];
32
© 2025 MOAI Lab Inc.


# Page. 33

![Page Image](https://bcdn.docswell.com/page/9J29LKZWER.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/DEY4QNR9JM.jpg)

順序付き集合 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.


# Page. 35

![Page Image](https://bcdn.docswell.com/page/VJNYKXDD78.jpg)

順序対集合
◼ 順序対を要素とする集合
⚫
例：ODペア
◼ ３つ組以上を要素とすることも可能
set ORIG; # origins
set DEST; # destinations
set LINKS = {ORIG,DEST};
#set LINKS dimen 2; # ２次元要素の集合であることを宣言する場合
param cost {LINKS} &gt;= 0; # shipment costs per unit
var Trans {LINKS} &gt;= 0; # units to be shipped
minimize Total_Cost:
sum {(i,j) in LINKS} cost[i,j] * Trans[i,j];
35
© 2025 MOAI Lab Inc.


# Page. 36

![Page Image](https://bcdn.docswell.com/page/YE9PV8G8J3.jpg)

集合に関する演算
◼ 集合演算
⚫
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.


# Page. 37

![Page Image](https://bcdn.docswell.com/page/GE8DP8VZED.jpg)

パラメータ：計算パラメータ
◼ パラメータの値を，他のパラメータや定数から計算に
よって定めることができる
⚫
データファイルで値を上書きすることはできない
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.


# Page. 38

![Page Image](https://bcdn.docswell.com/page/LELM1R517R.jpg)

パラメータ：デフォルト値
◼ 宣言時にデフォルト値を指定できる（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.


# Page. 39

![Page Image](https://bcdn.docswell.com/page/4JMYWR35JW.jpg)

条件付きインデックス
◼ インデックス付けやsum等の演算において，
対象とするインデックスを条件で絞ることができる
◼ 算術・論理演算
⚫
⚫
⚫
⚫
if-then-else, or, and, exists, forall, not, in, not in
&lt;, &lt;=, =, &lt;&gt;, &gt;, &gt;=
sum, prod, min, max
+, -, *, /, div, mod, ^
set NUTREQ = {i in NUTR: i in MAXREQ or n_min[i] &gt; 0};
#set NUTREQ = MAXREQ union {i in MINREQ: n_min[i] &gt; 0};
subject to Balance {p in PROD, t in WEEKS: ord(t) &gt; 1}:
Make[p,t] + Inv[p,prev(t)] = Sell[p,t] + Inv[p,t];
39
© 2025 MOAI Lab Inc.


# Page. 40

![Page Image](https://bcdn.docswell.com/page/PJR9YRQZ79.jpg)

データの整合性
◼ 宣言時指定
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.


# Page. 41

![Page Image](https://bcdn.docswell.com/page/PEXQGR51JX.jpg)

データの妥当性チェック
◼ データが満たすべき条件を記載（check）
データ読み込み時にチェックが行われる
param supply {ORIG} &gt;= 0;
param demand {DEST} &gt;= 0;
check: sum {i in ORIG} supply[i]
= sum {j in DEST} demand[j];
param S &gt; 0;
param prob {1..S} &gt;= 0, &lt;= 1;
check: 0.99999 &lt; sum {s in 1..S} prob[s] &lt; 1.00001;
41
© 2025 MOAI Lab Inc.


# Page. 42

![Page Image](https://bcdn.docswell.com/page/3EK94R6MED.jpg)

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


# Page. 43

![Page Image](https://bcdn.docswell.com/page/L73WL86275.jpg)

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


# Page. 44

![Page Image](https://bcdn.docswell.com/page/87DKNMV6JG.jpg)

自動再定式化機能（MPライブラリ）
◼ モデリングにおける多様な表現を実現
ソルバーが非対応の場合，適宜，自動的に再定式化が行われる
（式変形・変数追加など）
⚫
条件演算子：if-then-else, ==&gt;, &lt;==, &lt;==&gt;
⚫
論理演算子：or, and, not, exists, forall
⚫
区分線形関数・演算子：&lt;&lt;breakpoints; slopes&gt;&gt;, abs, min,
max
⚫
計数演算子：count, atmost, atleast, exactly, numberof
⚫
比較演算子：&gt;, &lt;, !=, 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.


# Page. 45

![Page Image](https://bcdn.docswell.com/page/VJPK5RRZE8.jpg)

例：固定費用
var Flow {(i,j) in ARCS, p in PROD[i]} &gt;= 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] &lt;= arc_cap[i,j] * Use[i,j];
⚫
より自然な定式化―バイナリ変数不要
sum {(i,j) in ARCS}
if sum {p in PROD} Flow[i,j,p] &gt; 0 then fix_cost[i,j]
45
© 2025 MOAI Lab Inc.


# Page. 46

![Page Image](https://bcdn.docswell.com/page/2EVVPRRMEQ.jpg)

例：最小流量
一定量に満たない量を流すことが許されない場合
⚫
線形定式化
sum {p in PROD} Flow[i,j,p] &gt;= min_amount * Use[i,j];
sum {p in PROD} Flow[i,j,p] &lt;= arc_cap[i,j] * Use[i,j];
⚫
より自然な定式化―バイナリ変数不要
sum {p in PROD} Flow[i,j,p] = 0 or
min_amount &lt;= sum {p in PROD} Flow[p,i,j] &lt;= arc_cap[i,j]
46
© 2025 MOAI Lab Inc.


# Page. 47

![Page Image](https://bcdn.docswell.com/page/57GLPMMXEL.jpg)

例：本数制限
流量が正のアークの本数に制限がある場合
⚫
線形定式化
sum {(i,j) in ARCS} Use[i,j] &lt;= max_arcs;
⚫
より自然な定式化―バイナリ変数不要
atmost max_arcs {(i,j) in ARCS}
(sum {p in PROD} Flow[p,i,j] &gt; 0);
47
© 2025 MOAI Lab Inc.


# Page. 48

![Page Image](https://bcdn.docswell.com/page/4EQY2RR5JP.jpg)

例：区分線形費用
&lt;&lt;breakpoint-list; slope-list&gt;&gt;
⚫ abs, min, max
⚫
minimize Total_Cost:
sum {(i,j) in ARCS}
&lt;&lt;{k in 1..npiece[i,j]-1} limit[i,j,k];
{k in 1..npiece[i,j]} rate[i,j,k]&gt;&gt; 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.


# Page. 49

![Page Image](https://bcdn.docswell.com/page/KJ4WL88V71.jpg)

例：離散領域
⚫
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.


# Page. 50

![Page Image](https://bcdn.docswell.com/page/LE1YL2247G.jpg)

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


# Page. 51

![Page Image](https://bcdn.docswell.com/page/GEWGVRRZJ2.jpg)

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


# Page. 52

![Page Image](https://bcdn.docswell.com/page/47ZL4RRLJ3.jpg)

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


# Page. 53

![Page Image](https://bcdn.docswell.com/page/YJ6W3RRMJV.jpg)

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


# Page. 54

![Page Image](https://bcdn.docswell.com/page/GJ5ML88QJ4.jpg)

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


# Page. 55

![Page Image](https://bcdn.docswell.com/page/LE3WL88ZE5.jpg)

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


# Page. 56

![Page Image](https://bcdn.docswell.com/page/8EDKNMM47G.jpg)

学習リソース
◼ 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.


# Page. 57

![Page Image](https://bcdn.docswell.com/page/V7PK5RRVJ8.jpg)

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


