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

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

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
Tweet

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 エコシステムとの融合  とくに産業応用の場において  最適化ソリューション開発プロセスの効率性  システムの保守性・操作性・拡張性・安定性 の観点でメリット おわりに