优化问题
一、选修课程策略问题
某学校规定,运筹学专业的学生毕业时必须至少学习过两门数学课、三门运筹学课和两门计算机课。这些课程的编号、名称、学分、所属类别和先修课要求如表1所示。那么,毕业时学生最少可以学习这些课程中哪些课程。
如果某个学生既希望选修课程的数量少,又希望所获得的学分多,他可以选修哪些课程?
约束条件包括两个方面:
这样,所有课程的先修课要求可表为如下的约束
总的 0-1规划模型为
//LingoD代码
model:
sets:
item/1..9/:c,x;
endsets
data:
c=5,4,4,3,4,3,2,2,3;
enddata
min=@sum(item(i):x(i));
x(1)+x(2)+x(3)+x(4)+x(5)>=2;
x(3)+x(5)+x(6)+x(8)+x(9)>=3;
x(4)+x(6)+x(7)+x(9)>=2;
x(3)<=x(1);
x(3)<=x(2);
x(4)<=x(7);
x(5)<=x(1);
x(5)<=x(2);
x(6)<=x(7);
x(8)<=x(5);
x(9)<=x(1);
x(9)<=x(2);
@for(item(i):@bin(x(i)));
end
二、最优组队问题
//Lingo代码
sets:
TM/1..14/:y,s;
P/1..5/:;
U(P,TM):a,x;
endsets
data:
a=10,1,4,10,5,5,4,6,2,4,8,6,10,9,
9,5,6,4,4,7,4,7,8,6,7,8,1,4,
7,5,5,6,7,7,8,8,7,10,2,6,4,5,
3,5,9,5,8,6,9,10,6,6,5,4,2,4,
3,10,8,2,8,7,7,5,8,6,9,8,3,7;
enddata
max = 0.8*@sum(TM(j):s(j)*y(j))+@sum(U(i,j):a(i,j)*x(i,j));
@sum(TM(j):y(j))=3;
@for(P(i):@for(TM(j):x(i,j)<=1-y(j)));
@for(TM(j):@sum(P(i):x(i,j))>=1-y(j));
@for(TM(j):@sum(P(i):x(i,j))<=3);
@for(P(i):@sum(TM(j):x(i,j))<=6);
@for(TM(j):s(j)=@sum(P(i):a(i,j)));
@for(U(i,j):@bin(x(i,j)));
@for(TM(j):@bin(y(j)));
三、最优树模型
树:连通且不含圈的无向图称为树.常用T表示。
树枝:树中的边称为树枝,树中度为1的顶点称为树叶 。
图论中最优树的的求解通常有两种算法:
Kruskal算法(或避圈法)和Prim算法(破圈法).
这里利用LINGO求解最优树。
问题1 某有10个城镇见右图,它们之间的距离见表6。城镇1处有一条河流,现需要从各城镇之间铺设管道,使城镇1处的水可以输送到各城镇,求铺设管道最少的设计方式。
//Lingo代码
model:
sets:
point/1..10/:u;
link(point,point):d,x;
endsets
data:
d=0,8,5,9,12,14,12,16,17,22,
8,0,9,15,16,8,11,18,14,22,
5,9,0,7,9,11,7,12,12,17,
9,15,7,0,3,17,10,7,15,15,
12,16,9,3,0,8,10,6,15,15,
14,8,11,17,8,0,9,14,8,16,
12,11,7,10,10,9,0,8,6,11,
16,18,12,7,6,14,8,0,11,11,
17,14,12,25,15,8,6,11,0,10,
22,22,17,15,15,16,11,11,10,0;
enddata
min=@sum(link(i,j)|i#ne#j:d(i,j)*x(i,j));
n=@size(point);
@sum(point(j)|j#gt#1:x(1,j))>=1; //从起始点出来至少1条路
@for(point(i)|i#ne#1:@sum(point(j)|j#ne#i:x(j,i))=1); //除起始点外,每点只有一路进入
@for(link(i,j):@bin(x(i,j)));
@for(link(i,j)|i#ne#j:u(i)-u(j)+n*x(i,j)<=n-1); //用来不构成圈
end
四、货郎担模型
//lingo代码
Model:
sets:
city/1..10/:u;
link(city,city):d,x;
endsets
data:
d=0 7 4 5 8 6 12 13 11 18
7 0 3 10 9 14 5 14 17 17
4 3 0 5 9 10 21 8 27 12
5 10 5 0 14 9 10 9 23 16
8 9 9 14 0 7 8 7 20 19
6 14 10 9 7 0 13 5 25 13
12 5 21 10 8 13 0 23 21 18
13 14 8 9 7 5 23 0 18 12
11 17 27 23 20 25 21 18 0 16
18 17 12 16 19 13 18 12 16 0;
enddata
min=@sum(link:d*x);
@for(city(j):@sum(city(i)|i#ne#j:x(i,j))=1);
@for(city(i):@sum(city(j)|j#ne#i:x(i,j))=1);
@for(link(i,j)|i#ne#j#and#i#gt#1:u(i)-u(j)+10*x(i,j)<=9);
@for(link:@bin(x));
end
五、蒙特卡洛法
文章来源:https://www.toymoban.com/news/detail-858169.html
Matlab代码:
clc,clear
%rng('shurffle') %报据当前时间为随机数生成癣提供种子
rng(0) %进行一致性比较,每次产生的随机数是一样的
p0=0; n=10^6;tic %计时开始
for f=1:n
x=randi([0,99],1,5); %舍产生一行五列的区间【0,99】上的随机整数
[f,g]=mengte(x);
if all (g<=0)
if p0<f
x0=X; p0=f; %记录当前较好的解
end
end
end
X0,P0,toc %计时结束
function[f,g]=mengte(x); %定义目标函数和约束条件
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-...
x(4)-2*x(5);
g=[sum(×)一400
x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200];
end
文章来源地址https://www.toymoban.com/news/detail-858169.html
Lingo代码:
model:
sets:
row/1..4/:b;
col/1..5/:c1,c2,x;
link(row,col):a;
endsets
data:
c1=1 1 3 4 2;
c2=-8 -2 -3 -1 -2;
a = 1 1 1 1 1
1 2 2 1 6
2 1 6 0 0
0 0 1 1 5;
b=400 800 200 200;
enddata
max=@sum(col:c1*x^2+c2*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));
@for(col:@gin(x));
@for(col:@bnd(0,x,99));
end
到了这里,关于数学建模优化问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!