Slide 1

Slide 1 text

AMPL 詳細解説 A Mathematical Programming Language 数理最適化モデリングのための強力な代数的言語 1

Slide 2

Slide 2 text

アジェンダ (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

Slide 3

Slide 3 text

アジェンダ (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

Slide 4

Slide 4 text

アジェンダ (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

Slide 5

Slide 5 text

アジェンダ (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

Slide 6

Slide 6 text

アジェンダ (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

Slide 7

Slide 7 text

アジェンダ (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

Slide 8

Slide 8 text

1. AMPL 概要 (Introduction) 8

Slide 9

Slide 9 text

AMPL とは? (What is AMPL?) A Mathematical Programming Language 大規模な数理最適化問題を記述し、解決するための 代数的モデリング言語。 ベル研究所で開発され、長年にわたり学術界および産業界で広く利用されている。 宣言的 (Declarative): 「何を」最適化するかを記述することに焦点を当て、「どのように」解くか(アルゴ リズム)はソルバーに任せる。 9

Slide 10

Slide 10 text

主な特徴 (Key Features) 代数的な表現: 数学的な記述に近い直感的な構文。 sum , prod , forall , exists など。 モデルとデータの分離: 同じモデルを異なるデータセットで再利用可能。 .mod ファイル: モデル構造 (変数、制約など) .dat ファイル: 具体的な数値データ (パラメータ値、集合要素) ソルバー非依存: 様々な最適化ソルバー (CPLEX, Gurobi, MINOS, Knitro, CBC など) と連携可能。 スケーラビリティ: 小規模な教育用問題から、非常に大規模で複雑な実務問題まで対応。 強力なスクリプト機能: モデルの求解プロセスや結果分析を自動化。 10

Slide 11

Slide 11 text

なぜAMPL を使うのか? (Why use AMPL?) 生産性の向上: 数式に近い記述でモデル開発を迅速化。 可読性と保守性: モデルの構造が明確で理解しやすい。 柔軟性: 様々なタイプの最適化問題(線形計画、整数計画、非線形計画など)に対応。 再利用性: モデルとデータの分離により、モデルの使い回しが容易。 強力なコミュニティと実績: 長年の利用実績と豊富なドキュメント、サポート。 11

Slide 12

Slide 12 text

基本的なワークフロー (Basic Workflow) 1. モデル定義 (Model Formulation): .mod ファイルに、集合、パラメータ、変数、目的関数、制約条件を代数的に記述。 2. データ準備 (Data Preparation): .dat ファイルに、モデルで使用するパラメータの具体的な値や集合の要素を記述。 3. AMPL 環境での実行 (Execution in AMPL): AMPLを起動。 model コマンドで .mod ファイルを読み込み。 data コマンドで .dat ファイルを読み込み。 option solver ; で使用するソルバーを選択。 solve コマンドで最適化を実行。 4. 結果分析 (Results Analysis): display コマンドなどで、最適解(変数値)、目的関数値、双対変数などを確認。 12

Slide 13

Slide 13 text

2. インストールと環境 (Installation & Environment) 13

Slide 14

Slide 14 text

入手方法 (Getting AMPL) 公式サイト: ampl.com からダウンロード可能。 ライセンス: 無料版 (Community Edition): 変数・制約数に制限があるが、学習や小規模問題に利用可能。多くの一 般的なソルバーがバンドルされている。 商用ライセンス: 制限なし。様々なライセンス形態あり。 アカデミックライセンス: 教育・研究目的で無料または割引価格で提供。 インストール: ダウンロードしたファイルを展開し、環境変数 PATH にAMPL実行ファイルのあるディレクト リを追加するのが一般的。 14

Slide 15

Slide 15 text

AMPL IDE 統合開発環境 (Integrated Development Environment)。 コードエディタ(シンタックスハイライト付き)、モデル/データ/実行管理、結果表示機能などを提供。 初心者や視覚的なインターフェースを好むユーザーに適している。 ampl.com からダウンロード可能。 15

Slide 16

Slide 16 text

コマンドラインインターフェース (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

Slide 17

Slide 17 text

3. AMPL モデリングの基本要素 (Core Modeling Concepts) 17

Slide 18

Slide 18 text

モデルファイル ( .mod ) とデータファイル ( .dat ) .mod ファイル: モデルの 構造を定義。 集合 (Sets)、パラメータ (Parameters)、変数 (Variables)、目的関数 (Objective)、制約 (Constraints) の 宣 言を行う。 一般的・抽象的な記述。 .dat ファイル: モデルで使用される 具体的なデータを提供。 パラメータの 値や集合の 要素を定義。 特定の インスタンスに対応。 この分離がAMPLの強力な特徴の一つです。 18

Slide 19

Slide 19 text

コメント (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

Slide 20

Slide 20 text

集合 (Sets) - 概要 モデルの基本的な インデックスを定義するもの。 製品、期間、場所、原材料など、モデル内の要素の集まりを表す。 パラメータ、変数、制約は通常、集合上でインデックス付けされる。 20

Slide 21

Slide 21 text

集合 (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

Slide 22

Slide 22 text

集合 (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

Slide 23

Slide 23 text

集合 (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

Slide 24

Slide 24 text

集合 (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

Slide 25

Slide 25 text

集合 (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

Slide 26

Slide 26 text

パラメータ (Parameters) - 概要 モデル内の 既知の定数を表す。 コスト、容量、需要、係数など。 通常、 .dat ファイルで値が与えられる。 26

Slide 27

Slide 27 text

パラメータ (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

Slide 28

Slide 28 text

パラメータ (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

Slide 29

Slide 29 text

パラメータ (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

Slide 30

Slide 30 text

決定変数 (Variables) - 概要 モデルが決定すべき 未知の値。 最適化によって値が見つけられる。 生産量、輸送量、割り当て(0か1か)など。 30

Slide 31

Slide 31 text

決定変数 (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

Slide 32

Slide 32 text

決定変数 (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

Slide 33

Slide 33 text

決定変数 (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

Slide 34

Slide 34 text

決定変数 (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

Slide 35

Slide 35 text

目的関数 (Objective Function) - 概要 最適化(最大化または最小化)したい 指標。 通常はモデルに一つだけ定義される (複数定義も可能だが、solve時に一つを選択)。 変数とパラメータを用いた数式で表現される。 35

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

制約条件 (Constraints) - 概要 モデルの解が満たすべき 条件や 制限。 リソースの制限、需要の充足、物理的な制約などを表現。 subject to キーワードで宣言される。 38

Slide 39

Slide 39 text

制約条件 (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

Slide 40

Slide 40 text

制約条件 (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

Slide 41

Slide 41 text

制約条件 (Constraints) - 式の表現 目的関数と同様に、算術演算子、組み込み関数、 sum , prod , if-then-else などが使用可能。 線形計画 (LP) 問題では、制約式が線形(変数の一次結合)である必要がある。 整数計画 (MIP) 問題では、変数が整数またはバイナリ。 非線形計画 (NLP) 問題では、非線形な式を含むことができる。 41

Slide 42

Slide 42 text

4. データファイルの構造 ( .dat file) 42

Slide 43

Slide 43 text

データファイルの目的と基本構文 .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

Slide 44

Slide 44 text

パラメータデータの指定方法 スカラー: 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

Slide 45

Slide 45 text

集合データの指定方法 単純な集合: 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

Slide 46

Slide 46 text

テーブル形式 (Table Format) - 概要 多次元のパラメータや集合データを効率的に記述するための形式。 スプレッドシートの表に似た形式でデータを表現できる。 大規模なデータを扱う際に特に有用。 46

Slide 47

Slide 47 text

テーブル形式 - 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

Slide 48

Slide 48 text

テーブル形式 - 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

Slide 49

Slide 49 text

テーブル形式 - 集合 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

Slide 50

Slide 50 text

5. AMPL コマンド (AMPL Commands) 50

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

モデルとデータの読み込み model ; 指定されたモデルファイルを読み込み、解釈する。 複数回実行すると、前のモデルは上書きされる。 data ; 指定されたデータファイルを読み込み、現在のモデルのパラメータと集合に値を代入する。 複数回実行すると、データは追加・上書きされる (挙動は reset data の有無による)。 include ; 指定されたファイルの内容をその場で実行する。 .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

Slide 53

Slide 53 text

ソルバーの選択 option solver ; 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

Slide 54

Slide 54 text

問題の求解 ( solve ) solve; 現在のモデルとデータに基づいて、選択されたソルバーを呼び出して最適化問題を解く。 ソルバーからのメッセージ(求解状況、結果ステータス)が表示される。 成功すると、変数値、目的関数値などが更新される。 ampl: model diet.mod; ampl: data diet.dat; ampl: option solver cplex; ampl: solve; CPLEX 12.10.0.0: optimal solution; objective 88.2 2 dual simplex iterations (0 in phase I) ampl: # Solution found 54

Slide 55

Slide 55 text

結果の表示 ( display ) 最適化結果やモデルの要素を表示するための最も重要なコマンド。 構文: display , , ... ; 表示可能なアイテム: パラメータ: 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

Slide 56

Slide 56 text

モデル要素の確認 ( show , expand ) show ; 指定されたモデル要素(変数、制約、パラメータなど)の 宣言を表示する。 例: show Produce; は var Produce {PRODUCTS} >= 0; のような宣言を表示。 expand ; 指定されたインデックス付きの制約や目的関数を、現在のデータに基づいて 展開し、具体的なインスタン スを表示する。デバッグに非常に便利。 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

Slide 57

Slide 57 text

リセット ( reset , reset data ) reset; 現在のモデル、データ、オプション設定など、 すべてをクリアし、AMPLセッションを初期状態に戻す。 reset data; 現在の データ値のみをクリアする。モデルの構造(宣言)は保持される。 異なるデータセットで同じモデルを解く際に使う。 reset data , , ... ; 指定されたパラメータや集合のデータのみをリセットする。 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

Slide 58

Slide 58 text

オプション設定 ( option ) option ; AMPLの動作やソルバーの挙動を制御する様々なオプションを設定する。 option ; 現在のオプションの値を確認する。 よく使われるオプション: 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

Slide 59

Slide 59 text

ファイル操作 include ; ファイルの内容を現在の場所で実行 (前述)。 commands ; include と似ているが、主にスクリプトファイル ( .run ) を実行するのに使われる。 リダイレクト: display > ; : display の結果をファイルに書き込む (上書き)。 display >> ; : display の結果をファイルに追記する。 print > ; : printf コマンドの出力をリダイレクト。 log_file ; : 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

Slide 60

Slide 60 text

データチェック ( 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

Slide 61

Slide 61 text

6. スクリプティング ( .run file) 61

Slide 62

Slide 62 text

スクリプトの目的 一連のAMPLコマンドをファイルにまとめて保存し、自動実行する。 主な用途: 定型的なモデル読み込み、データ読み込み、求解、結果表示の自動化。 パラメータを変えながら複数回の求解を実行(パラメータ分析)。 複雑なデータ前処理や後処理。 条件に応じた求解プロセスの制御。 62

Slide 63

Slide 63 text

基本的なスクリプト構造 .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

Slide 64

Slide 64 text

スクリプトの実行 AMPL環境内から commands または include コマンドを使用する。 ampl: commands solve_my_model.run; ampl: include solve_my_model.run; コマンドラインから直接実行する。 $ ampl solve_my_model.run (AMPLが起動し、スクリプトを実行して終了) 64

Slide 65

Slide 65 text

ループ ( 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

Slide 66

Slide 66 text

条件分岐 ( if-then-else ) 条件式に基づいて実行するコマンドを切り替える。 構文: if then { ; } else { ; } 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

Slide 67

Slide 67 text

スクリプトでの入出力 出力: 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

Slide 68

Slide 68 text

7. ソルバーとの連携 (Interfacing with Solvers) 68

Slide 69

Slide 69 text

ソルバーの役割 AMPLはモデルを記述し、問題を 生成する。 ソルバーは、AMPLが生成した問題を実際に 解くアルゴリズムを実行するソフトウェア。 AMPLはソルバーへのインターフェースを提供し、結果をAMPL環境に返す。 graph LR A[User] --> B(AMPL Environment); B -- model & data --> C{Problem Instance Generation}; C -- problem instance --> D[Solver]; D -- solution --> C; C -- results (values, duals, status) --> B; B -- display --> A; 69

Slide 70

Slide 70 text

利用可能なソルバー ( 例) AMPLは多種多様なソルバーに対応しています。 線形計画 (LP) / 混合整数計画 (MIP): CPLEX Gurobi Xpress COIN-OR CBC (オープンソース) HiGHS (オープンソース) 非線形計画 (NLP): MINOS CONOPT Knitro Ipopt (オープンソース) SNOPT その他: 特定の問題クラス(二次計画、制約充足問題など)に対応したソルバーも多数。 ソルバーの選択は、問題のタイプ、規模、ライセンス状況によって決まります。 70

Slide 71

Slide 71 text

ソルバー固有オプション 各ソルバーには、求解アルゴリズムの挙動を細かく制御するための独自のオプションがあります。 option _options ''; で指定します。 の内容はソルバーのマニュアルを参照する必要があります。 # 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

Slide 72

Slide 72 text

求解結果の確認 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

Slide 73

Slide 73 text

8. 結果の分析 (Analyzing Results) 73

Slide 74

Slide 74 text

目的関数値 ( _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

Slide 75

Slide 75 text

変数値 ( 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

Slide 76

Slide 76 text

双対変数 ( 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

Slide 77

Slide 77 text

被約費用 ( 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

Slide 78

Slide 78 text

制約のスラック (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

Slide 79

Slide 79 text

感度分析 (Sensitivity Analysis) LP問題において、パラメータ(目的関数の係数や制約の右辺値)が変化したときに、現在の最適基底(どの 変数が非ゼロで、どの制約が有効か)が維持される範囲を分析すること。 AMPL自体に直接的な感度分析コマンドは少ないが、ソルバーが出力する情報(双対変数、被約費用)や、ス クリプトを使ってパラメータを変化させて再求解することで分析可能。 79

Slide 80

Slide 80 text

9. 高度なトピック 80

Slide 81

Slide 81 text

区分的線形 (Piecewise Linear) 非線形なコスト関数や制約を、複数の線形セグメントで近似する機能。 piecewise_linear 構文や、特殊順序集合 (SOS2) を使ってモデル化できる。 これにより、非線形関数を含む問題を (M)IPソルバーで解ける場合がある。 # Example syntax (conceptual) var x; param breakpoints {1..n}; param slopes {1..n}; minimize Cost: <> x; # Piecewise linear objective 81

Slide 82

Slide 82 text

ネットワークモデリング 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

Slide 83

Slide 83 text

論理制約 (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

Slide 84

Slide 84 text

ユーザー定義関数 (User-Defined Functions) 外部のプログラミング言語(C/C++など)で記述された関数をAMPLモデル内で呼び出す機能。 AMPLの組み込み関数では表現できない複雑な計算や、外部システムとの連携が必要な場合に使用。 関数のライブラリをコンパイルし、AMPLからロードする必要がある。 84

Slide 85

Slide 85 text

10. インターフェースとエコシステム 85

Slide 86

Slide 86 text

AMPL IDE 前述の通り、統合開発環境。 主な機能: シンタックスハイライト、コード補完(限定的) モデル、データ、スクリプトファイルの管理 実行ボタンによる簡単な求解 表形式やグラフでの結果表示 デバッグ支援(エラー箇所のハイライトなど) 教育やインタラクティブなモデル開発に適している。 86

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

11. リソースとまとめ 88

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

まとめ (1/2) AMPLは数理最適化問題を記述するための強力で柔軟な 代数的モデリング言語です。 モデルとデータの分離により、再利用性と保守性が向上します。 宣言的な構文により、数式に近い形で直感的にモデルを記述できます。 多様なソルバーとの連携が可能で、問題タイプに応じた最適なソルバーを選択できます。 90

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

ご清聴ありがとうございました Q&A 92