lingo學習筆記1

2021-10-03 05:04:05 字數 2419 閱讀 1659

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

執行結果:

這種方法顯而易見,但是當變數和條件很多的時候,我們不可能一一列取

法二:法一的小優化,當變數多,條件不多的時候我們可以這樣寫

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

執行結果:

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...