最近在学数学建模,把代码和遇到的问题记录一下
线性规划
基本类型
基本直接套函数
[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
x返回决策向量取值,fval返回最优解,f目标函数,A,b线性不等式约束,Aeq,beq线性等式约束,lb,ub界值向量
一般都是矩阵形式
一个easy题,把代码复习一下
max z=2x1+3x2-5x3,
s.t.
x1+x2+x3=7,
2x1-5x2+x3>=10,
x1+3x2+x3<=12,
x1,x2,x3>=0
程序如下
f=[-2;-3;-5];
a=[-2 5 -1;1 3 1];
b=[-10;12];
aeq=ones(1,3);
beq=7;
[x,y]=linprog(f,a,b,aeq,beq,zeros(3,1));
特殊类型
即带绝对值的,也挺简单的,改一下模型就行,用lingo可以直接求
一类问题
主要就是投资的收益和风险,具体问题具体分析,大部分可以简化模型,比如固定一个值,优化另一个,再用循环改变固定值
整数规划
0-1型整数规划
相互排斥
改写约束条件,比如
x=0或500<x<800
改写为 500y<x<800y,y=0或1
思路比较灵活,有时候需要引入M(充分大)
指派问题
直接用intlinprog,比linprog多了个参数intcon,还是比较复杂的,需要把多维变量转变成一维向量
clc,clear
c=[3 8 2 10 3;
8 7 2 9 7;
6 4 2 7 5;
8 4 2 3 5;
9 10 6 9 10;]; //系数矩阵
c=reshape(c,[25 1]);
a=zeros(10,25);
intcon=1:25;
for i=1:5
a(i,(i-1)*5+1:5*i)=1;
a(5+i,i:5:25)=1;
end
b=ones(10,1);
lb=zeros(25,1);
ub=ones(25,1);
x=intlinprog(c,intcon,[],[],a,b,lb,ub);
x=reshape(x,[5 5])
蒙特卡洛法
很经典的随机模拟方法,直接上代码
mengte.m函数文件
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(x)-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];
测试代码
rng(sum(clock));
p0=0;
tic
for i=1:10^6
x=randi([0,99],1,5);
[f,g]=mengte(x);
if all(g<=0)
if p0<f
x0=x;p0=f;
end
end
end
x0,p0
toc
暂时写这么多,碰到问题再补充