綜述:我們在使用很多數學求解器時,會用到MathProg模型語言。MathProg語言能將一個純數學語言描述的模型轉化爲求解器能讀懂的格式。例如在使用線性規劃求解器GLPK求解一個線性規劃問題或者混合整數規劃問題時,就需要用到MathProg語言。下面將以一個具體的例子深入淺出地講解MathProg語言的使用規則。
一、數學模型:
二、寫成MathProg格式
# 參數就是模型中的常量
param n,integer,>=0;
param s,integer,>=0;
param t,integer,>=0;
param c{(i, j) in A},integer,>=1,<=20;
#集合就是模型中下標的索引空間
set V := 0..n;
set P within V;
set Aplus := V cross V;
set Al := V cross Aplus;
set A within Aplus;
#變量就是模型中的變量
var x{(i, j) in Aplus}, binary;
var lamd{(k,i,j) in Al}, binary;
#目標函數
minimize obj : sum {(u,v) in A} c[u,v]*x[u,v];
#約束條件,必須給每個約束條件命名,名字後的花括號是約束條件中的索引空間,求和函數的索引範圍放在sum後的花括號中。
s.t.
second1{v in V: v = s}: (sum{(i,v) in A} x[i,v]) - (sum{(v,j) in A} x[v,j]) = -1;
second2{v in V: v = t}: (sum{(i,v) in A} x[i,v]) - (sum{(v,j) in A} x[v,j]) = 1;
second3{v in V: v <> s and v <> t}: (sum{(i,v) in A} x[i,v]) - (sum{(v,j) in A} x[v,j]) = 0;
third{v in P}: sum{(u,v) in A} x[u,v]=1;
sixth{i in V,j in V,k in V: i <> j}: lamd[k,i,j]+lamd[k,j,i]>=x[i,j];
seventh{i in V,k in V: i <> k}: sum {j in V diff {i}} lamd[k,i,j]<=1;
eighth{j in V,k in V: k <> j}: lamd[k,k,j]=0;
ninth{u in V,v in V diff {u}: (u,v) not in A}: x[u,v]=0;
tenth{u in V,v in V: (u,v) in A and (v,u) in A}: x[u,v]+x[v,u]<=1;
#開始求解
solve;
#輸出變量的值
display {(i,j) in A} x[i,j];
end;