這種最短路徑問題也可以用圖論
model:
sets:
cities/s,a1,a2,a3,b1,b2,c1,c2,t/:l; !定義城市集合,l(i)為對應的屬性(s到城市i最短路徑)
roads(cities,cities)/
a1,b1 a1,b2 a2,b1 a2,b2 a3,b1 a3,b2
b1,c1 b1,c2 b2,c1 b2,c2
c1,t c2,t/:d;
!roads表示城市間道路集合,由cities匯出的乙個派生集合(請特別注意其用法),由於只有一部分城市 之間有道路相連,所以不應該把它定義成稠密集合,將其元素通過列舉給出,這就是乙個稀疏集合。d(i,j)為兩城市間直接距離
endsets
data:
d= 6 3 3
6 5 8 6 7 4
6 7 8 9
5 6;
l=0,,,,,,,,;
enddata
@for(cities(i)|i#gt#@index(s):l(i)=@min(roads(j,i):l(j)+d(j,i)););
end
來做,只要寫出帶權鄰接矩陣就ok
圖中min寫錯了應該是max;
這很明顯是0-1線性規劃問題,通過總效率目標函式+約束條件進行求解。
model:
sets:
students/s1..s8/;
pairs(students,students)| &2 #gt# &1 :benefit,match;
endsets
!在派生集合pairs定義中增加了過濾條件 「&2#gt#&1」,意思是第2個父集合的元素的索引值(用「&2」表示)大於第1個父集合的元素的索引值(用「&1」表示)。pairs中的元素對應於上表中的嚴格上三角部分的二維下標(共28個元素)。benefit和match是pairs的屬性。
data:
benefit=
9 3 4 2 1 5 6
1 7 3 5 2 1
4 4 2 9 2
1 5 5 2
8 7 6
2 34;
enddata
[obj] max=@sum(pairs(i,j):benefit(i,j)*match(i,j));
@for(students(i):[constraints]
@sum (pairs(j,k)|j #eq# i #or# k #eq# i: match(j,k))=1);
! 注意資料段對benefit的賦值方式,「lingo按照列的順序對屬性變數的元素進行賦值。在約束部分,過濾條件「j #eq# i #or# k #eq# i」是由邏輯運算子「#or#(或者)」連線的乙個復合的邏輯關係式,連線由「#eq#(等於)」表示的兩個邏輯關係。由於「#or#」的運算級別低於「#eq#」,所以這個邏輯式中沒有必要使用括號指定運算次序。
@for(pairs(i,j):@bin(match(i,j)));
end
數學模型演算法實現之Lingo求解一
lingo基本用法說明 模型以model開始,end結束 集合相當於下標,quarters lingo中模型優化由四部分組成 1.集合段 定義集合變數及元素和屬性 sets endsets 2.目標與約束段 目標函式 約束條件 需要用到lingo內部函式如 sum和 for 3.資料段 對集合屬性輸...
數學模型演算法實現之Dijkstra演算法
dijkstra演算法能求乙個頂點到另一頂點最短路徑。它是由dijkstra於1959年提出的。實際它能求出初始點到其它所有頂點的最短路徑。dijkstra演算法是一種標號法 給賦權圖的每乙個頂點記乙個數,稱為頂點的標號 臨時標號,稱t標 號,或者固定標號,稱為p標號 t標號表示從始頂點到該標點的最...
數學模型演算法實現之種群競爭模型
fun.m function dx fun t,x,r1,r2,n1,n2,s1,s2 r1 1 r2 1 n1 100 n2 100 s1 0.5 s2 2 dx r1 x 1 1 x 1 n1 s1 x 2 n2 r2 x 2 1 s2 x 1 n1 x 2 n2 p3.m h 0.1 所取時間...