多くのパラメータ,変数,制約等は,何らかの集合上で インデックス付けされる 集合 set # --- In model file (model.mod) --- set PRODUCTS; # Set of products set RESOURCES; # Set of resources # --- In data file (data.dat) --- set PRODUCTS := Steel Screws Bolts ; set RESOURCES := Labor MachineA MachineB ;
複数のインデックス(多次元)も可 パラメータ param # --- In model file (model.mod) --- set PRODUCTS; param production_capacity; # production capacity: scalar param demand {j in PRODUCTS}; # Demand for each product #param demand {PRODUCTS}; # index j can be omitted # --- In data file (data.dat) --- param production_capacity := 500 ; param demand := Steel 100 Screws 150 Bolts 300 ;
インデックス付けが可能(パラメータと同様) 決定変数 var # --- 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
upper_bound:上限 = fixed_value:固定値(通常はパラメータで表現) 決定変数 var # --- 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]; var Build {LOCATIONS} binary; var NumWorkers {LOCATIONS} integer, >= 0;
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];
# Simple equality constraint subject to ProductionTarget: sum {p in PRODUCTS} Produce[p] = total_production_target; # Resource availability constraint for each resource subject to ResourceLimit {r in RESOURCES}: sum {p in PRODUCTS} usage[r,p] * Produce[p] <= availability[r];
file (model.mod) --- param cost {ORIG,DEST,PROD} >= 0; # --- In data file (data.dat) --- set ORIG := GARY CLEV PITT ; set DEST := FRA DET LAN WIN STL FRE LAF ; set PROD := bands coils plate ; param cost := [*,*,bands]: FRA DET LAN WIN STL FRE LAF := GARY 30 10 8 10 11 71 6 CLEV 22 7 10 7 21 82 13 PITT 19 11 12 10 25 83 15 …
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 ;
ord() などの関数が 利用可能 循環構造をもたせることも可能(circular) 順序付き集合 ordered # --- In model file (model.mod) --- set PERIODS ordered; # Time periods 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)] + ... ; # --- In data file (data.dat) --- set PERIODS := Jan Feb Mar Apr ;
# origins set DEST; # destinations set LINKS = {ORIG,DEST}; #set LINKS dimen 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];
set LINKS dimen 2; # --- In data file (data.dat) --- set LINKS := (GARY,DET) (GARY,LAN) (GARY,STL) (GARY,LAF) (CLEV,FRA) (CLEV,DET) (CLEV,LAN) (CLEV,WIN) (CLEV,STL) (CLEV,LAF) (PITT,FRA) (PITT,WIN) (PITT,STL) (PITT,FRE) ; set LINKS := GARY DET GARY LAN GARY STL GARY LAF CLEV FRA CLEV DET CLEV LAN CLEV WIN CLEV STL CLEV LAF PITT FRA PITT WIN PITT STL PITT FRE ;
LAF (CLEV,*) FRA DET LAN WIN STL LAF (PITT,*) FRA WIN STL FRE ; set LINKS FRA DET LAN WIN STL FRE LAF := GARY - + + - + - + CLEV + + + + + - + PITT + - - + + + - ; set LINKS := (*,FRA) CLEV PITT (*,DET) GARY CLEV (*,LAN) GARY CLEV (*,WIN) CLEV PITT (*,LAF) GARY CLEV (*,FRE) PITT (*,STL) GARY CLEV PITT ;
(model.mod) --- param cost {LINKS} >= 0; # --- In data file (data.dat) --- param cost := GARY DET 14 GARY LAN 11 GARY STL 16 GARY LAF 8 CLEV FRA 27 CLEV DET 9 CLEV LAN 12 CLEV WIN 9 CLEV STL 26 CLEV LAF 17 PITT FRA 24 PITT WIN 13 PITT STL 28 PITT FRE 99 ; param cost := [GARY,*] DET 14 LAN 11 STL 16 LAF 8 [CLEV,*] FRA 27 DET 9 LAN 12 WIN 9 STL 26 LAF 17 [PITT,*] FRA 24 WIN 13 STL 28 FRE 99 ;
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];
--- In model file (model.mod) --- set LOCATIONS; set ORIGINS within LOCATIONS; param ORIGIN symbolic in LOCATIONS; # --- In data file (data.dat) --- set LOCATIONS := London Paris Berlin ; set ORIGINS := London Tokyo ; # Error param ORIGIN := Tokyo; # Error
var Use {ARCS} binary; sum {(i,j) in ARCS} fix_cost[i,j] * Use[i,j]; subject to Capacity {(i,j) in ARCS}: sum {p in PRODUCTS} Flow[p,i,j] <= capacity[i,j] * Use[i,j]; より自然な定式化―バイナリ変数不要 sum {(i,j) in ARCS} if exists {p in PRODUCTS} Flow[p,i,j] > 0 then fix_cost[i,j]
>= min_ship * Use[i,j]; sum {p in PRODUCTS} Flow[p,i,j] <= capacity[i,j] * Use[i,j]; sum {p in PRODUCTS} Flow[p,i,j] = 0 or min_ship <= sum {p in PRODUCTS} Flow[p,i,j] <= capacity[i,j] より自然な定式化―バイナリ変数不要
sum {j in JOBS, k in MACHINES} if MachineForJob[j] = k then cost[j,k]; subject to Multi_Min_Ship {i in ORIG, j in DEST}: sum {p in PROD} Trans[i,j,p] >= 1 ==> minload <= sum {p in PROD} Trans[i,j,p] <= limit[i,j];
Total_Cost: sum {i in ORIG, j in DEST} <<{p in 1..npiece[i,j]-1} limit[i,j,p]; {p in 1..npiece[i,j]} rate[i,j,p]>> Trans[i,j]; maximize WeightSum: sum {t in TRAJ} max {n in NODE} weight[t,n] * Use[n]; Trans[i,j] limit[i,j,1] limit[i,j,2] rate[i,j,1] rate[i,j,2] rate[i,j,3]
subject to Limit_Used: count {(i,j) in ARCS} (sum {p in PRODUCTS} Flow[p,i,j] > 0) <= max_arcs; subject to CapacityOfMachine {k in MACHINES}: numberof k in ({j in JOBS} MachineForJob[j]) <= cap[k];
{0,10,30,45,55}; var Ship {(i,j) in ARCS} in {0} union interval[min_ship,capacity[i,j]]; var Work {j in SCHEDS} integer in {0} union interval[least, max{i in SHIFT_LIST[j]} req[i]];
階層化(辞書式順序) 各目的関数に優先順位(.objpriority)を設定 多目的最適化 minimize total_cost {s in STORE}: sum {j in FOOD} cost[s,j] * Buy[j]; minimize total_number: sum {j in FOOD} Buy[j];
for Mathematical Programming, by R. Fourer, D.M.Gay and B.W. Kernighan AMPLのバイブル.詳細な解説と多数の例題 AMPL公式サイトからダウンロード可能 AMPL Discourse(https://discuss.ampl.com/) 質問したり,他のユーザーと議論したりする場 学習リソース