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

AMPL詳細解説

Avatar for MIKIO KUBO MIKIO KUBO
May 12, 2025
33

 AMPL詳細解説

Avatar for MIKIO KUBO

MIKIO KUBO

May 12, 2025
Tweet

Transcript

  1. アジェンダ (Agenda) - Part 1 1. AMPL 概要 (Introduction) AMPLとは?

    (What is AMPL?) 主な特徴 (Key Features) なぜAMPLを使うのか? (Why use AMPL?) 基本的なワークフロー (Basic Workflow) 2. インストールと環境 (Installation & Environment) 入手方法 (Getting AMPL) AMPL IDE コマンドラインインターフェース (Command-Line Interface) 3. AMPL モデリングの基本要素 (Core Modeling Concepts) モデルファイル ( .mod ) とデータファイル ( .dat ) コメント (Comments) 集合 (Sets) 宣言と初期化 (Declaration & Initialization) インデックス付き集合 (Indexed Sets) 2
  2. アジェンダ (Agenda) - Part 2 3. AMPL モデリングの基本要素 ( 続き)

    パラメータ (Parameters) 宣言と初期化 (Declaration & Initialization) スカラーとインデックス付きパラメータ (Scalar & Indexed Parameters) デフォルト値 (Default Values) 計算パラメータ (Calculated Parameters) 決定変数 (Variables) 宣言 (Declaration) 変数の型 (Types: continuous, integer, binary) 上下限制約 (Bounds) インデックス付き変数 (Indexed Variables) 初期値 (Initial Values) 3
  3. アジェンダ (Agenda) - Part 3 3. AMPL モデリングの基本要素 ( 続き)

    目的関数 (Objective Function) 宣言 ( minimize , maximize ) 線形および非線形表現 (Linear & Nonlinear Expressions) 制約条件 (Constraints) 宣言 ( subject to ) インデックス付き制約 (Indexed Constraints) 不等式 ( <= , >= ) と等式 ( = ) 制約式の表現 (Expressions in Constraints) 4. データファイルの構造 ( .dat file) 基本的な構文 (Basic Syntax) パラメータデータの指定 (Specifying Parameter Data) 集合データの指定 (Specifying Set Data) テーブル形式 (Table Format) 4
  4. アジェンダ (Agenda) - Part 4 5. AMPL コマンド (AMPL Commands)

    AMPL環境の起動と終了 (Starting & Exiting) モデルとデータの読み込み ( model , data ) ソルバーの選択 ( option solver ) 問題の求解 ( solve ) 結果の表示 ( display ) モデル要素の確認 ( show , expand ) リセット ( reset , reset data ) オプション設定 ( option ) ファイル操作 ( include , commands , リダイレクト > ) データチェック ( check ) 5
  5. アジェンダ (Agenda) - Part 5 6. スクリプティング ( .run file)

    スクリプトの目的 (Purpose of Scripting) 基本的なスクリプト構造 (Basic Script Structure) スクリプトの実行 (Executing Scripts) ループ ( for ) 条件分岐 ( if-then-else ) 入出力 ( display > , print > , read ) 7. ソルバーとの連携 (Interfacing with Solvers) ソルバーの役割 (Role of Solvers) 利用可能なソルバー (Available Solvers) ソルバー固有オプション (Solver-Specific Options) 求解結果の確認 ( solve_result , solve_message ) 6
  6. アジェンダ (Agenda) - Part 6 8. 結果の分析 (Analyzing Results) 目的関数値

    ( _obj ) 変数 M ( variable.val ) 双対変数 / シャドウプライス ( constraint.dual ) 被約費用 ( variable.rc ) 制約のスラック ( constraint.slack , constraint.body , constraint.ub , constraint.lb ) 感度分析 (Sensitivity Analysis - 概念) 9. 高度なトピック (Advanced Topics - Brief Overview) 区分的線形 ( piecewise_linear ) ネットワークモデリング ( node , arc ) 論理制約 (Logical Constraints) ユーザー定義関数 (User-Defined Functions) 確率的計画 (Stochastic Programming) 10. インターフェースとエコシステム (Interfaces & Ecosystem) AMPL IDE 7
  7. AMPL とは? (What is AMPL?) A Mathematical Programming Language 大規模な数理最適化問題を記述し、解決するための

    代数的モデリング言語。 ベル研究所で開発され、長年にわたり学術界および産業界で広く利用されている。 宣言的 (Declarative): 「何を」最適化するかを記述することに焦点を当て、「どのように」解くか(アルゴ リズム)はソルバーに任せる。 9
  8. 主な特徴 (Key Features) 代数的な表現: 数学的な記述に近い直感的な構文。 sum , prod , forall

    , exists など。 モデルとデータの分離: 同じモデルを異なるデータセットで再利用可能。 .mod ファイル: モデル構造 (変数、制約など) .dat ファイル: 具体的な数値データ (パラメータ値、集合要素) ソルバー非依存: 様々な最適化ソルバー (CPLEX, Gurobi, MINOS, Knitro, CBC など) と連携可能。 スケーラビリティ: 小規模な教育用問題から、非常に大規模で複雑な実務問題まで対応。 強力なスクリプト機能: モデルの求解プロセスや結果分析を自動化。 10
  9. なぜAMPL を使うのか? (Why use AMPL?) 生産性の向上: 数式に近い記述でモデル開発を迅速化。 可読性と保守性: モデルの構造が明確で理解しやすい。 柔軟性:

    様々なタイプの最適化問題(線形計画、整数計画、非線形計画など)に対応。 再利用性: モデルとデータの分離により、モデルの使い回しが容易。 強力なコミュニティと実績: 長年の利用実績と豊富なドキュメント、サポート。 11
  10. 基本的なワークフロー (Basic Workflow) 1. モデル定義 (Model Formulation): .mod ファイルに、集合、パラメータ、変数、目的関数、制約条件を代数的に記述。 2.

    データ準備 (Data Preparation): .dat ファイルに、モデルで使用するパラメータの具体的な値や集合の要素を記述。 3. AMPL 環境での実行 (Execution in AMPL): AMPLを起動。 model コマンドで .mod ファイルを読み込み。 data コマンドで .dat ファイルを読み込み。 option solver <solver_name>; で使用するソルバーを選択。 solve コマンドで最適化を実行。 4. 結果分析 (Results Analysis): display コマンドなどで、最適解(変数値)、目的関数値、双対変数などを確認。 12
  11. 入手方法 (Getting AMPL) 公式サイト: ampl.com からダウンロード可能。 ライセンス: 無料版 (Community Edition):

    変数・制約数に制限があるが、学習や小規模問題に利用可能。多くの一 般的なソルバーがバンドルされている。 商用ライセンス: 制限なし。様々なライセンス形態あり。 アカデミックライセンス: 教育・研究目的で無料または割引価格で提供。 インストール: ダウンロードしたファイルを展開し、環境変数 PATH にAMPL実行ファイルのあるディレクト リを追加するのが一般的。 14
  12. コマンドラインインターフェース (Command-Line Interface) ターミナル(Windowsのコマンドプロンプト、Linux/macOSのTerminalなど)で ampl と入力して起動。 対話的にコマンドを入力してモデルを操作・求解する。 スクリプティングとの親和性が高い。 本プレゼンテーションでは主にコマンドラインでの操作を説明。 ampl

    # AMPLを起動 ampl: # AMPLプロンプトが表示される ampl: model diet.mod; # モデルファイルを読み込む ampl: data diet.dat; # データファイルを読み込む ampl: solve; # 求解実行 ampl: display Buy; # 結果を表示 ampl: quit; # AMPLを終了 16
  13. モデルファイル ( .mod ) とデータファイル ( .dat ) .mod ファイル:

    モデルの 構造を定義。 集合 (Sets)、パラメータ (Parameters)、変数 (Variables)、目的関数 (Objective)、制約 (Constraints) の 宣 言を行う。 一般的・抽象的な記述。 .dat ファイル: モデルで使用される 具体的なデータを提供。 パラメータの 値や集合の 要素を定義。 特定の インスタンスに対応。 この分離がAMPLの強力な特徴の一つです。 18
  14. コメント (Comments) # から行末までがコメントとして扱われる。 モデルやデータの可読性を高めるために重要。 # This is a comment

    line in AMPL param nMaterials; # Number of materials (comment at end of line) # Multi-line comments can be done # by starting each line with # 19
  15. 集合 (Sets) - 宣言と初期化 宣言: set SET_NAME; 初期化 ( .dat

    ファイル): set SET_NAME := element1 element2 ... ; (要素を列挙) 要素は文字列または数値。文字列に空白が含まれる場合は引用符 ( " " ) で囲む。 # --- In model file (model.mod) --- set PRODUCTS; # Set of products set RESOURCES; # Set of resources # --- In data file (data.dat) --- set PRODUCTS := "Steel Plate" Screws Bolts ; set RESOURCES := Labor MachineA MachineB ; 21
  16. 集合 (Sets) - インデックス付き集合 他の集合の要素によってインデックス付けされる集合。 例: 各製品を製造するために必要な部品の集合。 # --- In

    model file (model.mod) --- set PRODUCTS; set PARTS; set PARTS_NEEDED {PRODUCTS}; # For each product, a set of parts needed # --- In data file (data.dat) --- set PRODUCTS := Car Bike ; set PARTS := Wheel Frame Seat Chain ; set PARTS_NEEDED[Car] := Wheel Frame Seat ; set PARTS_NEEDED[Bike] := Wheel Frame Seat Chain ; 22
  17. 集合 (Sets) - 順序付き集合 (Ordered Sets) 要素に順序があることを示す。 ordered キーワードを使用。 first()

    , last() , next() , prev() などの関数が利用可能。 主に期間やステップを表すのに使う。 # --- In model file (model.mod) --- set PERIODS ordered; # Time periods # --- In data file (data.dat) --- set PERIODS := Jan Feb Mar Apr ; # --- In model file (model.mod) --- 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)] + ... ; # Using prev() 23
  18. 集合 (Sets) - 集合演算 (Set Operations) union : 和集合 inter

    : 積集合 (共通部分) diff : 差集合 symdiff : 対称差集合 set A := 1 2 3; set B := 3 4 5; display A union B; # Displays {1, 2, 3, 4, 5} display A inter B; # Displays {3} display A diff B; # Displays {1, 2} display B diff A; # Displays {4, 5} display A symdiff B; # Displays {1, 2, 4, 5} 24
  19. 集合 (Sets) - within 制約 ある集合が別の集合の部分集合であることを宣言時に強制する。 データの整合性を保つのに役立つ。 set LOCATIONS; set

    ORIGINS within LOCATIONS; # Origins must be a subset of Locations set DESTINATIONS within LOCATIONS; # Destinations must be a subset of Locations # --- In data file (data.dat) --- set LOCATIONS := London Paris Berlin Tokyo ; set ORIGINS := London Paris ; set DESTINATIONS := Berlin Tokyo ; # set ORIGINS := London Chicago ; # This would cause an error 25
  20. パラメータ (Parameters) - 宣言と初期化 宣言: param PARAM_NAME {indexing_sets}; 初期化 (

    .dat ファイル): スカラー: param PARAM_NAME := value; インデックス付き (1次元): param PARAM_NAME [index] := value; インデックス付き (複数次元): param PARAM_NAME [idx1, idx2, ...] := value; リスト形式: param PARAM_NAME := index1 value1 index2 value2 ... ; テーブル形式 (後述) # --- In model file (model.mod) --- set PRODUCTS; param unit_cost {PRODUCTS}; # Cost per unit of each product param demand {PRODUCTS}; # Demand for each product param production_capacity; # Total production capacity (scalar) # --- In data file (data.dat) --- param unit_cost := WidgetA 10.5 WidgetB 12.0 ; param demand := WidgetA 100 WidgetB 150 ; param production_capacity := 500 ; 27
  21. パラメータ (Parameters) - デフォルト値 宣言時に default キーワードでデフォルト値を指定できる。 .dat ファイルで値が指定されなかった場合に使用される。 #

    --- In model file (model.mod) --- set PRODUCTS; param tax_rate {PRODUCTS} default 0.05; # Default tax rate is 5% # --- In data file (data.dat) --- param tax_rate := WidgetA 0.08 ; # WidgetA has 8% tax # WidgetB will use the default 5% tax rate 28
  22. パラメータ (Parameters) - 計算パラメータ 他のパラメータや定数から計算によって値を決定するパラメータ。 = の代わりに := を使って宣言時に計算式を記述する。 データファイルで値を上書きすることはできない。

    # --- In model file (model.mod) --- param unit_cost {PRODUCTS}; param tax_rate {PRODUCTS} default 0.05; param total_cost {p in PRODUCTS} := unit_cost[p] * (1 + tax_rate[p]); # Calculated parameter # --- In data file (data.dat) --- param unit_cost := WidgetA 10.0 WidgetB 12.0 ; param tax_rate := WidgetA 0.10 ; # WidgetB uses default 0.05 # After loading data, total_cost will be calculated: # total_cost[WidgetA] = 10.0 * (1 + 0.10) = 11.0 # total_cost[WidgetB] = 12.0 * (1 + 0.05) = 12.6 29
  23. 決定変数 (Variables) - 宣言 宣言: var VAR_NAME {indexing_sets}; 基本的な宣言では、変数は非負 (>=

    0) の連続変数とみなされる。 # --- In model file (model.mod) --- set PRODUCTS; set LOCATIONS; set CUSTOMERS; var Produce {PRODUCTS}; # Amount of each product to produce var Transport {PRODUCTS, LOCATIONS, CUSTOMERS}; # Amount transported 31
  24. 決定変数 (Variables) - 変数の型と制約 型指定: integer : 整数変数 binary :

    0または1の値をとるバイナリ変数 上下限制約: >= lower_bound : 下限 <= upper_bound : 上限 = fixed_value : 固定値 (通常はパラメータで表現) # --- In model file (model.mod) --- param max_production {PRODUCTS}; param min_batch_size {PRODUCTS}; var Produce {p in PRODUCTS} >= min_batch_size[p], <= max_production[p]; # Bounds var Build {LOCATIONS} binary; # Binary variable: build facility (1) or not (0) var NumWorkers {LOCATIONS} integer, >= 0; # Integer variable: number of workers 32
  25. 決定変数 (Variables) - インデックス付き変数 集合を使ってインデックス付けされる。モデルの柔軟性と表現力を高める。 例: var Produce {PRODUCTS, PERIODS};

    (製品ごと、期間ごとの生産量) # --- In model file (model.mod) --- set ORIG; # Origins set DEST; # Destinations set PRODUCTS; var Transport {PRODUCTS, ORIG, DEST} >= 0; # Amount of product p shipped from i to j 33
  26. 決定変数 (Variables) - 初期値 := value を使って初期値を指定できる (主に非線形問題の求解開始点として)。 省略した場合、デフォルトの初期値 (通常は0)

    が使用される。 # --- In model file (model.mod) --- var x >= 0, := 1.0; # Variable x with initial value 1.0 var y {i in 1..5} := i; # Initial value of y[i] is i 34
  27. 目的関数 (Objective Function) - 宣言 最大化: maximize OBJECTIVE_NAME: expression; 最小化:

    minimize OBJECTIVE_NAME: expression; OBJECTIVE_NAME : 目的関数に付ける名前。 expression : 変数、パラメータ、定数を用いた数式。 sum などの演算子も使用可能。 # --- In model file (model.mod) --- 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]; 36
  28. 目的関数 (Objective Function) - 式の表現 算術演算子 ( + , -

    , * , / , ^ ) 組み込み関数 ( exp , log , sqrt , abs , sin , cos など) 総和 ( sum {index_set} expression ) 積 ( prod {index_set} expression ) 条件 ( 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; minimize PenaltyCost: sum {t in PERIODS} if Inventory[t] < min_level then penalty * (min_level - Inventory[t]) else 0; 37
  29. 制約条件 (Constraints) - 宣言 宣言: subject to CONSTRAINT_NAME {indexing_set}: expression1

    operator expression2; CONSTRAINT_NAME : 制約に付ける名前。インデックス付けも可能。 {indexing_set} : 制約がどのインデックスに対して生成されるか (省略可能)。 expression1 , expression2 : 変数、パラメータ、定数を用いた数式。 operator : <= , = , >= のいずれか。 # --- In model file (model.mod) --- set RESOURCES; set PRODUCTS; param availability {RESOURCES}; param usage {RESOURCES, PRODUCTS}; var Produce {PRODUCTS} >= 0; # Resource availability constraint for each resource subject to ResourceLimit {r in RESOURCES}: sum {p in PRODUCTS} usage[r,p] * Produce[p] <= availability[r]; # Simple equality constraint param total_production_target; subject to ProductionTarget: sum {p in PRODUCTS} Produce[p] = total_production_target; 39
  30. 制約条件 (Constraints) - インデックス付き制約 subject to CONSTRAINT_NAME {index_set}: ... ;

    index_set 内の各要素に対して制約が生成される。 条件式 ( : condition ) を追加して、特定のインデックスに対してのみ制約を生成することも可能。 # --- In model file (model.mod) --- set PLANTS; set PRODUCTS; set PERIODS ordered; param capacity {PLANTS, PRODUCTS}; param demand {PRODUCTS, PERIODS}; var Produce {PLANTS, PRODUCTS, PERIODS} >= 0; var Inventory {PRODUCTS, PERIODS} >= 0; # Production capacity constraint for each plant, product, period subject to CapacityLimit {pl in PLANTS, pr in PRODUCTS, t in PERIODS}: Produce[pl, pr, t] <= capacity[pl, pr]; # Inventory balance constraint for each product, period (except the first) subject to InvBalance {pr in PRODUCTS, t in PERIODS: t > first(PERIODS)}: Inventory[pr, t] = Inventory[pr, prev(t)] + sum {pl in PLANTS} Produce[pl, pr, t] - demand[pr, t]; 40
  31. 制約条件 (Constraints) - 式の表現 目的関数と同様に、算術演算子、組み込み関数、 sum , prod , if-then-else

    などが使用可能。 線形計画 (LP) 問題では、制約式が線形(変数の一次結合)である必要がある。 整数計画 (MIP) 問題では、変数が整数またはバイナリ。 非線形計画 (NLP) 問題では、非線形な式を含むことができる。 41
  32. データファイルの目的と基本構文 .mod ファイルで宣言された パラメータに値を代入し、 集合に要素を定義する。 基本的な構文は、AMPLの宣言文に似ているが、値を割り当てる : = を使う。 コマンドと同様に、セミコロン

    ; で各ステートメントを終了する。 コメントは # を使う。 # --- data.dat --- # Define set elements set PRODUCTS := Steel Bolts Nuts Screws ; set RESOURCES := Labor MachineA MachineB ; # Assign scalar parameter value param num_periods := 12; # Assign indexed parameter values (list format) param unit_cost := Steel 25.0 Bolts 0.5 Nuts 0.3 Screws 0.2 ; # Assign indexed parameter values (explicit index format) param demand ["Steel"] := 100; param demand ["Bolts"] := 5000; param demand ["Nuts"] := 4000; 43
  33. パラメータデータの指定方法 スカラー: param name := value; 1 次元リスト: param name

    := index1 value1 index2 value2 ... ; 1 次元個別: param name[index] := value; (複数行に分けて記述可能) 多次元 ( 後述のテーブル形式が便利): param name[idx1, idx2, ...] := value; param name := [idx1_1, idx1_2, *] value1 [idx2_1, idx2_2, *] value2 ... ; (タプル形式) # --- data.dat --- param capacity["MachineA"] := 100; param capacity["MachineB"] := 120; # Using tuples for 2D parameter param transport_cost := [Seattle, Chicago, *] 2.5 [Seattle, Topeka, *] 2.7 [SanDiego, Chicago, *] 2.8 [SanDiego, Topeka, *] 2.4 ; 44
  34. 集合データの指定方法 単純な集合: set name := elem1 elem2 "elem 3 with

    spaces" ... ; 多次元集合 ( タプル形式): set name := (elem1_1, elem1_2) (elem2_1, elem2_2) ... ; # --- data.dat --- set LOCATIONS := Seattle SanDiego Chicago Topeka ; set ROUTES := (Seattle, Chicago) (Seattle, Topeka) (SanDiego, Chicago) (SanDiego, Topeka) ; set PARTS_NEEDED[Car] := Wheel Frame Seat ; set PARTS_NEEDED[Bike] := Wheel Frame Seat Chain ; 45
  35. テーブル形式 - 2 次元パラメータ # --- model.mod --- set ORIG;

    set DEST; param transport_cost {ORIG, DEST}; # --- data.dat --- param transport_cost : # Colon indicates start of table definition Chicago Topeka NewYork := # Column headers (DEST elements) Seattle 2.5 2.7 3.0 # Row header (ORIG) and values SanDiego 2.8 2.4 3.5 ; # Another row 最初の行の : 以降が列インデックス (最後の次元)。 各データ行の最初の要素が行インデックス (最初の次元)。 値は対応するインデックスの組み合わせに対するパラメータ値。 47
  36. テーブル形式 - 3 次元以上のパラメータ ( スライス) [index1, index2, *, ...]

    のようにアスタリスク * を使って、テーブルがどの「スライス」を表すかを指 定する。 # --- model.mod --- set ORIG; set DEST; set PRODUCTS; param cost {ORIG, DEST, PRODUCTS}; # --- data.dat --- param cost (tr) : # (tr) means transpose if needed, optional Bandits Girders := # PRODUCTS (last dimension) [Seattle, Chicago, *] 2.5 3.1 # ORIG=Seattle, DEST=Chicago slice [Seattle, Topeka, *] 2.7 3.4 [SanDiego, Chicago, *] 2.8 3.0 [SanDiego, Topeka, *] 2.4 3.2 ; # Another slice for a different product (or origin/dest) could follow param cost [*, *, Clips] : # Slice for product Clips Chicago Topeka := # DEST Seattle 1.1 1.3 SanDiego 1.2 1.0 ; 48
  37. テーブル形式 - 集合 set name (tr) : COL1 COL2 ...

    := ... ; テーブルの値が + ならそのタプルが集合に含まれ、 - なら含まれない (または単に + のある行だけをリス トする)。 # --- model.mod --- set ORIG; set DEST; set AllowedRoutes {ORIG, DEST}; # --- data.dat --- # Method 1: Using + and - set AllowedRoutes : Chicago Topeka NewYork := Seattle + + - SanDiego - + + ; # Method 2: Listing only allowed routes (+) implicitly set AllowedRoutes (tr) : # Transposed table Seattle SanDiego := # ORIG (now columns) Chicago + - Topeka + + NewYork - + ; 49
  38. AMPL 環境の起動と終了 起動: コマンドライン/ターミナルで ampl と入力。 終了: AMPLプロンプトで quit; または

    exit; と入力。 EOF 文字 (Unix系: Ctrl+D, Windows: Ctrl+Z then Enter) を入力。 $ ampl ampl: # Now inside AMPL environment ampl: # ... enter commands ... ampl: quit; $ # Back to system prompt 51
  39. モデルとデータの読み込み model <filename.mod>; 指定されたモデルファイルを読み込み、解釈する。 複数回実行すると、前のモデルは上書きされる。 data <filename.dat>; 指定されたデータファイルを読み込み、現在のモデルのパラメータと集合に値を代入する。 複数回実行すると、データは追加・上書きされる (挙動は

    reset data の有無による)。 include <filename>; 指定されたファイルの内容をその場で実行する。 .mod , .dat , .run ファイルのいずれでも可。 ampl: model transportation.mod; ampl: data transportation_set1.dat; ampl: # Model is ready with data set 1 ampl: reset data; # Clear current data values ampl: data transportation_set2.dat; ampl: # Model is ready with data set 2 52
  40. ソルバーの選択 option solver <solver_name>; solve コマンドで使用する最適化ソルバーを指定する。 例: option solver cplex;

    , option solver gurobi; , option solver minos; 利用可能なソルバーはインストール状況による。 option solver; で現在選択されているソルバーを表示。 ampl: option solver cplex; # Select CPLEX solver ampl: option solver; # Display current solver (will show cplex) ampl: option solver gurobi; # Switch to Gurobi 53
  41. 結果の表示 ( display ) 最適化結果やモデルの要素を表示するための最も重要なコマンド。 構文: display <item1>, <item2>, ...

    ; 表示可能なアイテム: パラメータ: param_name 変数: var_name (現在の値が表示される) 式: expression (例: cost[i] * Produce[i] ) 目的関数値: _obj 制約関連: ConstraintName , ConstraintName.body , ConstraintName.dual , ConstraintName.slack な ど (後述) 集合: set_name ampl: display unit_cost; # Display parameter values ampl: display Produce; # Display optimal values of variable Produce ampl: display TotalCost; # Display the value of the objective function ampl: display {p in PRODUCTS} (unit_cost[p] * Produce[p]); # Display expression ampl: display _obj; # Display the current objective value ampl: display ResourceLimit; # Display dual values (shadow prices) 55
  42. モデル要素の確認 ( show , expand ) show <item_name>; 指定されたモデル要素(変数、制約、パラメータなど)の 宣言を表示する。

    例: show Produce; は var Produce {PRODUCTS} >= 0; のような宣言を表示。 expand <item_name>; 指定されたインデックス付きの制約や目的関数を、現在のデータに基づいて 展開し、具体的なインスタン スを表示する。デバッグに非常に便利。 ampl: show ResourceLimit; subject to ResourceLimit{r in RESOURCES}: sum{p in PRODUCTS} usage[r,p]*Produce[p] <= availability[r]; ampl: expand ResourceLimit['Labor']; # Show the constraint for Labor resource subject to ResourceLimit['Labor']: usage['Labor','Steel']*Produce['Steel'] + usage['Labor','Bolts']*Produce['Bolts'] + usage['Labor','Nuts']*Produce['Nuts'] + usage['Labor','Screws']*Produce['Screws'] <= availability['Labor']; 56
  43. リセット ( reset , reset data ) reset; 現在のモデル、データ、オプション設定など、 すべてをクリアし、AMPLセッションを初期状態に戻す。

    reset data; 現在の データ値のみをクリアする。モデルの構造(宣言)は保持される。 異なるデータセットで同じモデルを解く際に使う。 reset data <item1>, <item2>, ... ; 指定されたパラメータや集合のデータのみをリセットする。 ampl: model m.mod; data d1.dat; solve; ampl: display x; ampl: reset data; # Clear data from d1.dat ampl: data d2.dat; # Load new data ampl: solve; # Solve with new data ampl: display x; ampl: reset; # Clear everything (model, data, options) 57
  44. オプション設定 ( option ) option <option_name> <value>; AMPLの動作やソルバーの挙動を制御する様々なオプションを設定する。 option <option_name>;

    現在のオプションの値を確認する。 よく使われるオプション: solver : 使用するソルバー (前述)。 presolve : ソルバーが前処理を行うか ( 0 : Off, 1 : On - default)。 times : CPU時間などの情報を表示するか ( 0 : Off, 1 : On - default)。 show_stats : 問題の統計情報(変数、制約の数など)を表示するか ( 0 : Off, 1 : On - default)。 display_width : display コマンドの出力幅。 ソルバー固有オプション: option cplex_options 'mipgap=0.01 timelimit=300'; など。 ampl: option presolve 0; # Turn off presolve ampl: option display_width 120; # Set display width ampl: option cplex_options 'mipgap=0.01 threads=4'; # Pass options to CPLEX 58
  45. ファイル操作 include <filename>; ファイルの内容を現在の場所で実行 (前述)。 commands <filename>; include と似ているが、主にスクリプトファイル (

    .run ) を実行するのに使われる。 リダイレクト: display <items> > <filename>; : display の結果をファイルに書き込む (上書き)。 display <items> >> <filename>; : display の結果をファイルに追記する。 print <items> > <filename>; : printf コマンドの出力をリダイレクト。 log_file <filename>; : AMPLセッション全体のログをファイルに記録。 ampl: display Produce > results.txt; # Write Produce values to results.txt ampl: print {p in PRODUCTS} Produce[p] >> results.txt; # Append formatted output ampl: log_file session.log; # Start logging the session ampl: include setup.run; # Execute commands from setup.run ampl: commands solve_and_report.run; # Execute a script 59
  46. データチェック ( check ) check {constraint_name}; または check {expression}; 制約条件や式が、現在の変数値で満たされているか(または式の値が特定の条件を満たすか)をチェックす

    る。デバッグや解の検証に役立つ。 制約の場合、違反しているインスタンスを表示する。 ampl: solve; ... optimal solution ... ampl: check ResourceLimit; # Check if all resource limits are satisfied ampl: display Produce; ampl: check Produce[p] >= 0; # Check if all Produce values are non-negative 60
  47. 基本的なスクリプト構造 .run ファイルは、通常のAMPLコマンドを記述したテキストファイル。 コメント ( # ) も使用可能。 # ---

    solve_my_model.run --- # Reset AMPL state (optional but often good practice) reset; # Load model and data model my_model.mod; data my_data.dat; # Set options option solver cplex; option cplex_options 'timelimit=600'; # Solve the problem solve; # Display results display TotalCost; display Produce > produce_results.txt; display Transport; # Optionally display solver status display solve_result, solve_message; 63
  48. スクリプトの実行 AMPL環境内から commands または include コマンドを使用する。 ampl: commands solve_my_model.run; ampl:

    include solve_my_model.run; コマンドラインから直接実行する。 $ ampl solve_my_model.run (AMPLが起動し、スクリプトを実行して終了) 64
  49. ループ ( for ) 特定のコマンドを指定した集合の各要素に対して繰り返す。 構文: for {index_specification} { command;

    } # --- sensitivity_analysis.run --- model base.mod; set SCENARIOS := low_demand normal_demand high_demand; param demand_factor {SCENARIOS}; for {s in SCENARIOS} { reset data; # Reset previous data data base_data.dat; # Load base data let demand_multiplier := demand_factor[s]; # Modify a parameter (using let) # OR modify data file parameters directly if needed before loading option solver cplex; solve; print "--- Scenario:", s, "---" > scenario_results.txt; display _obj >> scenario_results.txt; display Produce >> scenario_results.txt; } Note: let コマンドは、モデル内のパラメータや変数の値を一時的に変更するために使用します。 65
  50. 条件分岐 ( if-then-else ) 条件式に基づいて実行するコマンドを切り替える。 構文: if <condition> then {

    <commands_if_true>; } else { <commands_if_false>; } else 部分は省略可能。 # --- solve_check.run --- model m.mod; data d.dat; solve; if solve_result == "optimal" then { print "Optimal solution found."; display _obj, x, y; } else if solve_result == "infeasible" then { print "Problem is infeasible."; # Potentially try relaxing constraints or analyzing IIS (Irreducible Inconsistent Subsystem) } else { print "Solver status:", solve_result; print solve_message; }; 66
  51. スクリプトでの入出力 出力: display ... > filename; / display ... >>

    filename; print ... > filename; / print ... >> filename; (より柔軟な書式設定が可能) printf "format string", args ... > filename; (C言語ライクな書式設定) 入力: read {items} < filename; (あまり一般的ではない) スクリプト内で data コマンドを使ってデータを読み込むのが普通。 外部スクリプト言語 (Pythonなど) からAMPLを呼び出し、データを渡すのがより強力。 # --- report_generator.run --- printf "Optimization Report\n" > report.txt; printf "=====================\n" >> report.txt; printf "Objective Value: %.2f\n", _obj >> report.txt; printf "\nProduction Plan:\n" >> report.txt; for {p in PRODUCTS} { printf " %s: %.3f\n", p, Produce[p] >> report.txt; } 67
  52. 利用可能なソルバー ( 例) AMPLは多種多様なソルバーに対応しています。 線形計画 (LP) / 混合整数計画 (MIP): CPLEX

    Gurobi Xpress COIN-OR CBC (オープンソース) HiGHS (オープンソース) 非線形計画 (NLP): MINOS CONOPT Knitro Ipopt (オープンソース) SNOPT その他: 特定の問題クラス(二次計画、制約充足問題など)に対応したソルバーも多数。 ソルバーの選択は、問題のタイプ、規模、ライセンス状況によって決まります。 70
  53. ソルバー固有オプション 各ソルバーには、求解アルゴリズムの挙動を細かく制御するための独自のオプションがあります。 option <solver_name>_options '<options_string>'; で指定します。 <options_string> の内容はソルバーのマニュアルを参照する必要があります。 # Set

    CPLEX options: MIP gap tolerance, time limit, number of threads option cplex_options 'mipgap=0.005 timelimit=1800 threads=8'; # Set Gurobi options: Feasibility tolerance, solution method option gurobi_options 'feastol=1e-7 method=2'; # Method 2 = Barrier # Set Knitro options: Algorithm choice option knitro_options 'algorithm=1'; # Algorithm 1 = Interior/Direct 71
  54. 求解結果の確認 solve コマンドの後、AMPLはソルバーからの結果を示す内部パラメータを更新します。 solve_result : ソルバーが報告した結果のカテゴリ (例: "optimal", "infeasible", "unbounded",

    "limit", "error")。 solve_message : ソルバーからのより詳細なメッセージ。 solve_exitcode : ソルバープロセスの終了コード。 これらをスクリプトの if 文でチェックすることで、求解結果に応じた処理を行うことができます。 ampl: solve; Gurobi 9.0.0: optimal solution; objective 1234.5 6 simplex iterations ampl: display solve_result; solve_result = optimal ampl: display solve_message; solve_message = Gurobi 9.0.0: optimal solution; objective 1234.5 72
  55. 目的関数値 ( _obj ) solve コマンド成功後、 _obj パラメータには最適化された目的関数の値が格納されます。 display _obj;

    で表示できます。 モデルで目的関数に名前 ( MyObjective ) を付けている場合、 display MyObjective; でも同じ値が表示され ます。 ampl: display _obj; _obj = 1234.5 ampl: display TotalProfit; # Assuming objective was named TotalProfit TotalProfit = 1234.5 74
  56. 変数値 ( variable.val or variable ) 最適解における各決定変数の値。 display variable_name; で表示できます。

    非線形問題などで、 .val 接尾辞が必要になる場合がありますが、通常は不要です。 ampl: display Produce; Produce [*] := WidgetA 100 WidgetB 150 ; ampl: display Transport['Seattle', 'Chicago']; # Display single indexed variable Transport['Seattle','Chicago'] = 50 75
  57. 双対変数 ( constraint.dual ) LP問題において、制約条件の右辺値を1単位緩和したときの目的関数値の改善量を示します。 display ConstraintName; または display ConstraintName.dual;

    で表示できます。 解釈: 非ゼロの双対変数を持つ制約は「有効 (binding)」であり、リソースを使い切っている、または要求をち ょうど満たしていることを示します。 双対変数の値が正(最小化問題)または負(最大化問題)の場合、その制約を緩和すると目的関数が改善 します。 MIP問題では直接的なシャドウプライスの解釈はできません。 ampl: display ResourceLimit; # Display dual values for ResourceLimit constraint ResourceLimit [*] (dual) := Labor 1.5 MachineA 0.0 MachineB 2.0 ; # Interpretation (assuming maximization): # - Increasing Labor availability by 1 unit increases objective by 1.5 # - MachineA has slack (dual = 0) # - Increasing MachineB availability by 1 unit increases objective by 2.0 76
  58. 被約費用 ( variable.rc ) LP問題において、現在基底に入っていない(値が0の)非基底変数を1単位増加させたときの目的関数値の変 化量。 display VariableName.rc; で表示できます。 解釈

    ( 最小化問題の場合): .rc > 0 : その変数を増加させるとコストが増加するため、最適解では0のまま。 .rc = 0 : その変数は基底に入っている(値が非ゼロの可能性がある)、または縮退により0。 .rc < 0 は通常最適解では発生しない(発生する場合は、さらにコストを削減できるため)。 MIP問題では直接的な解釈は限定的。 ampl: display Produce.rc; Produce.rc [*] := WidgetA 0.0 # Basic variable (likely > 0) WidgetB 0.0 # Basic variable (likely > 0) WidgetC 5.3 # Non-basic variable (Produce['WidgetC'] is 0, increasing it costs 5.3 per unit) ; 77
  59. 制約のスラック (Slack) 制約がどれだけ余裕を持って満たされているか、あるいは不足しているかを示す値。 constraint.body : 制約式の左辺の値。 constraint.lb , constraint.ub :

    制約の下限値、上限値 ( = , >= , <= に応じて定義される)。 constraint.slack : 制約の余裕。 <= 制約: ub - body (非負) >= 制約: body - lb (非負) = 制約: 0 (常に) display constraint.slack; などで表示。 ampl: display ResourceLimit.body; # Show how much of each resource is used ampl: display ResourceLimit.ub; # Show the availability of each resource ampl: display ResourceLimit.slack; # Show the unused amount of each resource ResourceLimit.slack [*] := Labor 0.0 # Binding constraint MachineA 15.0 # 15 units of slack MachineB 0.0 # Binding constraint ; 78
  60. ネットワークモデリング AMPLにはネットワークフロー問題を効率的に記述するための構文 ( node , arc ) が組み込まれている。 最小費用流問題、最大流問題、輸送問題などを自然に表現できる。 一部のソルバーはネットワーク構造を認識し、特殊なアルゴリズムで高速に解くことができる。

    set NODES; node Balance {n in NODES}; # Define balance constraint at each node set ARCS within NODES cross NODES; param cost {ARCS}; param capacity {ARCS}; var Flow {ARCS} >= 0, <= capacity; minimize TotalCost: sum {(u,v) in ARCS} cost[u,v] * Flow[u,v]; subject to BalanceConstraint {n in NODES}: sum {(u,n) in ARCS} Flow[u,n] + supply[n] # In-flow + supply = sum {(n,v) in ARCS} Flow[n,v] + demand[n]; # Out-flow + demand 82
  61. 論理制約 (Logical Constraints) バイナリ変数を用いて、条件間の論理的な関係(if-then, OR, AND など)を表現する。 例: 「もし施設Aを建設するなら(yA=1)、施設Bは建設できない(yB=0)」 ->

    yA + yB <= 1; AMPLは ==> (implication), if-then-else などの構文もサポートしており、これらがMIP制約に変換され る。 var BuildX binary; var BuildY binary; var UseProcessA binary; var UseProcessB binary; # If we build X, we must build Y subject to Implication1: BuildX ==> BuildY; # Equivalent to BuildX <= BuildY # Use either Process A or Process B, but not both subject to Choice: UseProcessA + UseProcessB = 1; 83
  62. API (Application Programming Interfaces) Python, R, C++, Java, C#, MATLAB

    などのプログラミング言語からAMPLの機能(モデル構築、データ連携、 求解、結果取得)を利用するためのライブラリ。 利点: 既存のアプリケーションやデータ処理パイプラインにAMPLを統合。 複雑なデータ前処理・後処理を使い慣れた言語で記述。 カスタムワークフローやGUIの構築。 自動化された分析やレポート作成。 例 ( amplpy for Python): from amplpy import AMPL ampl = AMPL() # Create AMPL instance ampl.read("diet.mod") ampl.read_data("diet.dat") ampl.option["solver"] = "cplex" ampl.solve() total_cost = ampl.get_objective("Total_Cost").value() buy_values = ampl.get_variable("Buy").get_values().to_pandas() print(f"Total cost: {total_cost}") print(buy_values) 87
  63. 学習リソース AMPL 公式サイト: https://ampl.com/ ドキュメント、ダウンロード、ブログ、例題など。 AMPL Book: "AMPL: A Modeling

    Language for Mathematical Programming" by Robert Fourer, David M. Gay, and Brian W. Kernighan. AMPLのバイブル。詳細な解説と多数の例題。オンラインで利用可能な章も多い。 日本語サイト https://scmopt.github.io/ampl ソルバーのマニュアル: CPLEX, Gurobiなどの各ソルバーのドキュメントも、オプション設定などで参照が必 要。 オンラインコースやチュートリアル: 様々な大学やプラットフォームでAMPLを用いた最適化コースが提供さ れている。 89
  64. まとめ (2/2) 基本要素: 集合 (Sets), パラメータ (Parameters), 変数 (Variables), 目的関数

    (Objective), 制約 (Constraints)。 AMPL コマンド ( model , data , solve , display , option など) を用いて対話的に操作できます。 スクリプティング ( .run ファイル、 for , if ) により、プロセスを自動化できます。 結果分析には、変数値、目的関数値、双対変数、被約費用などの情報が利用できます。 API を通じて、他のプログラミング言語との連携も可能です。 91