Matlab编程思想和编程训练

目录

一、随机游走问题。

二、指派授课问题


在老师的带领下学习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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值