lingo模型有4個段
目標與約束段: model: end
集合段: sets: endsets
資料段: data: enddata
初始段: init: endinit
1、舉個簡單的例子求z的最大值
z = 2x + 3y
x + y = 5
x >= 2
x,y為整數
model:
max = 2*x + 3*y; !求最大值;
x + y = 5;
x >= 2;
@gin(x); !@gin()表示x取整;
@gin(y);
end
執行後得到的結果為 x=2,y=3。
2、多變數示例處理
求z的最大值
z = 2*x1 + 3*x2 + 4*x3 + 5*x4 + 6*x5
x1 + 2*x2 + 3*x3 + 4*x4 + 5*x5 <= 10
x1 + x2 + x3 <= 2
x4 + x5 >= 1
xi = 0或1
法一:根據條件直接寫出
model:
max = 2*x1 + 3*x2 + 4*x3 + 5*x4 + 6*x5;
x1 + 2*x2 + 3*x3 + 4*x4 + 5*x5 <= 10;
x1 + x2 + x3 <= 2;
x4 + x5 >= 1;
@bin(x1); !令x1=0 或 1;
@bin(x2);
@bin(x3);
@bin(x4);
@bin(x5);
end
執行結果:![](https://pic.w3help.cc/2eb/3a3c1e03cbe047864d23c44bc59c4.jpeg)
這種方法顯而易見,但是當變數和條件很多的時候,我們不可能一一列取
法二:法一的小優化,當變數多,條件不多的時候我們可以這樣寫
model:
sets:
var1/1..5/:x,b,c;
endsets
data:
c = 2 3 4 5 6;
b = 1 2 3 4 5;
enddata
max = @sum(var1(i):x(i)*c(i));
@sum(var1(i):x(i)*b(i)) <= 10;
@sum(var1(i)|i#le#3:x(i)) <= 2; ! le表示小於等於,lt表示小於;
@sum(var1(i)|i#gt#3:x(i)) >= 1; ! ge表示大於等於,gt表示大於;
@for(var1(i):@bin(x));
end
如果要表示 x2 + x3 <= 1:
@sum(var1(i)|i#ge#2#and#i#le#3:x(i)) <= 1;
法三:當變數和條件很多的時候,我們就可以利用@sum()和@for()函式很好的進行處理
model:
sets:
var1/1..5/:x,c;
var2/1..3/:b;
link(var2,var1):a;
endsets
data:
c = 2 3 4 5 6;
b = 10 2 1;
a = 1 2 3 4 5
1 1 1 0 0
0 0 0 -1 -1;
enddata
max = @sum(var1(i):x(i)*c(i));
@for(var2(i):@sum(var1(j):x(j)*a(i,j))<=b(i));
@for(var1(i):@bin(x(i))); !也可以把(i)去掉,表示遍歷全部變數;
end
執行結果:![](https://pic.w3help.cc/505/1a69177ef6b5343247ce90a32c081.jpeg)
3、@if()函式應用
@if(a,b,c)
條件a成立時,值為b,否則為c。
設:f=5(06)
f = @if(x#gt#0#and#x#le#6,5,8);
當有多個分段時
設:f=5(0如有錯誤請指出。
lingo學習筆記(一)
2011年8月9日 用 sum和 for時的相關注意事項 括號內一定要包含有數字的 於哪乙個set,各個括號一定要匹配 比如 sets setname 1.n attribute1,attribute2,attribute3 links attribute,attribute c,x endsets...
學習筆記1
struct test test int x void fun class test1 test1 int x void fun int main void test1 a 行1 a.fun 行2 test1 b 行3 b.fun 行4 test c 行5 c.fun 行6 test d 行7 d....
學習筆記1
1 字串原地逆序 使用臨時變數 void reverse string s 5 求平均值 避免溢位 int f int x,int y 6 楊氏矩陣 bool young int a m n int x return false 7 十進位制轉十六進製制 string decimaltohexade...