Upgrade to Pro — share decks privately, control downloads, hide ads and more …

最適化ソリューション開発を加速する 数理最適化モデリングツール AMPL 活用セミナー

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
Avatar for MIKIO KUBO MIKIO KUBO
September 25, 2025

最適化ソリューション開発を加速する 数理最適化モデリングツール AMPL 活用セミナー

最適化ソリューション開発を加速する 数理最適化モデリングツール AMPL
活用セミナー

野々部 宏司
株式会社MOAI Lab 法政大学デザイン工学部

Google Gemini Gem (AMPL用)

https://gemini.google.com/gem/18r2MQYiAc4K1c0nZwC-m4tX2i8CdD6PP?usp=sharing

Avatar for MIKIO KUBO

MIKIO KUBO

September 25, 2025

More Decks by MIKIO KUBO

Other Decks in Programming

Transcript

  1. © 2025 MOAI Lab Inc. 2 © 2025 MOAI Lab

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

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

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

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

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

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

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

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

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

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

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

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

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

    Inc. 17 from gurobipy import Model, GRB, quicksum m = 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() Gurobipyのコード例 Model:具体モデル モデルの構築とインスタンス生成の両方を含む
  17. © 2025 MOAI Lab Inc. 18 © 2025 MOAI Lab

    Inc. 18 # 集合・パラメータ 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]; amplpyのコード例(.mod) sample.mod (テキストファイル) モデルのみを記述 表現が直感的で簡潔
  18. © 2025 MOAI Lab Inc. 19 © 2025 MOAI Lab

    Inc. 19 from amplpy import AMPL # -----AMPLオブジェクトの初期化----- ampl = AMPL() # -----モデルファイルの読み込み----- ampl.read("sample.mod") # -----集合を設定----- 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() amplpyのコード例(.py) モデルファイル:モデル構築 Pythonコード:インスタンス生成 役割が明確
  19. © 2025 MOAI Lab Inc. 20 © 2025 MOAI Lab

    Inc. 20 import pyomo.environ as pyo m = pyo.AbstractModel(name="多品種輸送問題") # ---- 集合・パラメータ ---- 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) Pyomoのコード例 AbstractModel:抽象モデル
  20. © 2025 MOAI Lab Inc. 21 © 2025 MOAI Lab

    Inc. 21 # ---- 目的関数:費用最小化 ---- 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) Pyomoのコード例(続き)
  21. © 2025 MOAI Lab Inc. 22 © 2025 MOAI Lab

    Inc. 22 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) Pyomoのコード例(続き) 抽象モデルにデータを設定して 具体モデルを生成
  22. © 2025 MOAI Lab Inc. 23 © 2025 MOAI Lab

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

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

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

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

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

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

    Inc. 29  型指定:整数変数(integer),バイナリ変数(binary)  上下限制約:  >= lower_bound:下限  <= upper_bound:上限  = fixed_value:固定値 決定変数 var 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 © 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 © 2025 MOAI Lab

    Inc. 31  式の表現  算術演算子(+, -, *, /, ^ など)  総和(sum {index_set} expression)  積(prod {index_set} expression)  組み込み関数(exp, log, sqrt, abs, sin, cos など)  条件(if condition then expr1 else expr2) 目的関数 maximize/minimize 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 © 2025 MOAI Lab

    Inc. 32  モデルの解が満たすべき条件や制限  例:リソースの制限,需要の充足,物理的な制約  インデックス付けが可能 制約 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 © 2025 MOAI Lab

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

    Inc. 34  要素に順序のある集合  例:期間,ステップ  first(), last(), next(), prev(), ord() などの関数が 利用可能  循環構造をもたせることも可能(circular) 順序付き集合 ordered 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 © 2025 MOAI Lab

    Inc. 35  順序対を要素とする集合  例: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 © 2025 MOAI Lab

    Inc. 36  集合演算  union:和集合  inter:積集合 (共通部分)  diff:差集合  symdiff:対称差集合 集合に関する演算 set A := 1 2 3; set B := 3 4 5; A union B; # {1, 2, 3, 4, 5} A inter B; # {3} A diff B; # {1, 2} B diff A; # {4, 5} A symdiff B; # {1, 2, 4, 5}
  36. © 2025 MOAI Lab Inc. 37 © 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 © 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 © 2025 MOAI Lab

    Inc. 39  インデックス付けや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 © 2025 MOAI Lab

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

    Inc. 41  データが満たすべき条件を記載(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 © 2025 MOAI Lab

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

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

    Inc. 44  モデリングにおける多様な表現を実現 ソルバーが非対応の場合,適宜,自動的に再定式化が行われる  条件演算子: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 自動再定式化機能(MPライブラリ) Fourer, Belov, Brandão, Advances in Model-Based Optimization with AMPL, ICCOPT2022. (式変形・変数追加など)
  44. © 2025 MOAI Lab Inc. 45 © 2025 MOAI Lab

    Inc. 45  線形定式化 例:固定費用 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 © 2025 MOAI Lab

    Inc. 46 一定量に満たない量を流すことが許されない場合  線形定式化 例:最小流量 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 © 2025 MOAI Lab

    Inc. 47 流量が正のアークの本数に制限がある場合  線形定式化 例:本数制限 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 © 2025 MOAI Lab

    Inc. 48  <<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]; Flow[i,j] limit[i,j,1] limit[i,j,2] rate[i,j,1] rate[i,j,2] rate[i,j,3]
  48. © 2025 MOAI Lab Inc. 49 © 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 min_amount arc_cap[i,j]
  49. © 2025 MOAI Lab Inc. 50 © 2025 MOAI Lab

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

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

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

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

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

    Inc. 55  AMPL IDE  コマンドラインインタフェース  VS Code 拡張機能  各種API:Python, R, … など 開発・実行環境
  55. © 2025 MOAI Lab Inc. 56 © 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 © 2025 MOAI Lab

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