目录
在老师的带领下学习Matlab的编程思想和代码,自己的思维能力还是有所欠缺。老师的代码简洁明了,看着也舒服许多(每题第二份代码为老师代码),跟着进度实时更新。
一、随机游走问题。
(1)在-10到10的一维线段上,质点以1/5的概率用左运动1单位,以2/5的概率停止不动,以2/5的概率向右运动2单位,且碰到-10时向右运动3单位,碰到10时向左运动4单位。请画出它的轨迹。
(2)考虑二维空间的布朗运动。画图时加上横坐标和纵坐标说明
#一般代码
x=0;y=0;
changex=0;changey=0;
t=400;
for i=1:t
step1=unidrnd(5);
if step1==1
x=x-1;
if x<=-10
x=-7;
end
elseif step1==2||step1==3
x=x+2;
if x>=10
x=6;
end
end
changex=[changex x];
step2=unidrnd(5);
if step2==1
y=y-1;
if y<=-10
y=-7;
end
elseif step2==2||step2==3
y=y+2;
if y>=10
y=6;
end
end
changey=[changey y];
end
figure(1);
plot(changex);
xlabel('次数');
ylabel('位置');
figure(2);
plot(changex,changey)
#简洁代码
clear
s(1)=0;
g(1)=0;
t=300;
for n=1:t
a=rand(1);
s(n+1)=(s(n)-1).*(a<=1/5)+s(n).*(a<=3/5&a>1/5)+(s(n)+2).*(a>3/5);
s(n+1)=-7.*(s(n+1)<=-10)+6.*(s(n+1)>=10)+s(n+1).*(s(n+1)<10&s(n+1)>-10);
b=rand(1);
g(n+1)=(g(n)-1).*(b<=1/5)+g(n).*(b<=3/5&a>1/5)+(g(n)+2).*(b>3/5);
g(n+1)=-7.*(g(n+1)<=-10)+6.*(g(n+1)>=10)+g(n+1).*(g(n+1)<10&g(n+1)>-10);
end
plot(s,g,'o')
xlabel('x')
ylabel('y')
二、指派授课问题
现有A、B、C、D四门课程,需由甲、乙、丙、丁四人讲授,并且规定:
每人只讲且必须讲1门课;每门课必须且只需1人讲。
四人分别讲每门课的费用示于表中:
课程费用 /人 | A | B | C | D |
甲 | 2 | 10 | 9 | 7 |
乙 | 15 | 4 | 14 | 8 |
丙 | 13 | 14 | 16 | 11 |
丁 | 4 | 15 | 13 | 9 |
对于该问题,自己想到的是线性规划方法。可列出线性规划函数,设aij为课程费用。xij为是否安排上课,取值0或1。可写出目标函数和约束条件如下:
#线性规划
c=[2,10,9,7,15,4,14,8,13,14,16,11,4,15,13,9];
Aeq=[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0;
0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0;
0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1;
1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0;
0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0;
0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0;
0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1];
beq=[1,1,1,1,1,1,1,1];
lb=zeros(16,1);
ub=ones(16,1);
[x,fval] = linprog(c,[],[],Aeq,beq,lb,ub)
但此种方法在人数较多或数据量较大时比较麻烦,老师提出的方法是排列组合,调用函数perms
#方法一
clear
n=4;
%1234的全排列
A=perms(1:n);
%共24种排列方式
G=size(A);n0=G(1);
B=[2,10,9,7;15,4,14,8;13,14,16,11;4,15,13,9];
for n1=1:n0
%安排人上课,记录四个人的课程费用
C(1)=B(1,A(n1,1));C(2)=...
B(2,A(n1,2));C(3)=B(3,A(n1,3));C(4)=B(4,A(n1,4));
%D{n1}=[C(1),C(2),C(3),C(4)];
%对费用求和
s(n1)=sum(C(1),C(2),C(3),C(4));
end
%找到s中最小值
[a,b]=find(s==min(s));
%输出选课方式
K=A(b,:)
#方法二
clear
A=[2 15 13 4];B=[10 4 14 15];C=[9 14 16 13];D=[7 8 11 9];
Y=zeros(1,1000);s=64;x=zeros(1,4);
%暴力查找,随机排列
for i= 1:1000
X=randperm(4);
%求和
Y(i)=A(X(1))+B(X(2))+C(X(3))+D(X(4));
%如果更小,替换原来值
if Y(i)<s
s=Y(i);
%记录当前选课安排
x=X;
end
end
%输出
s,x