用matlab求此数学建模问题

请教高人一道数学建模题,谢谢。

机器编号 1 2 3 4 5 6 7
维修时间(小时) 5 8 7 8 4 9 13
停工损失(万元/小时) 0.6 1.8 1.2 0.8 0.8 1.7 1.0

问题:1.维修工人只有一人,求总损失最小的维修次序。
2.维修工人有两人,每台机器只能一人修,求总损失最小的维修次序。
3.维修工人有一人,有n台机器需要维修,每台的停工损失已知,维修时间已知,求总损失最小的模型。

求高人把代码发到我邮箱,谢谢!
[email protected]

n=[ 1 2 3 4 5 6 7];
T=[ 5 8 7 8 4 9 13];
M=[ 0.6 1.8 1.2 0.8 0.8 1.7 1.0]; %输入对应矩阵
P=perms(n); %求出修理顺序的全排列
[h,w]=size(P); %h是有多少行,就是多少种排列,w是宽度也就是列数为7
total=10000; %设定一个很大的数用于后面的比较找最小损失
optimal=0; %最小损失对应哪种排列,未知赋值为0
for i=1:h %将所有的情况进行对比,循环h次
D=T(P(i,:)); %按修理顺序排列维修时间
Me=M(P(i,:)); %按修理顺序排列维修损失
s=0;
for k=1:7 %按修理顺序计算每台机器的停工时间
delay(k)=D(k)+s;
s=delay(k); %后面时间是前面的累积
end
Tot=Me*delay'; %行向量与列向量相乘,就是单位时间损失乘以时间在求和
if total>Tot %比较这种情况下损失是否比已知最小的还小
optimal=i; %是的话,记录这种情况
total=Tot; %记录这种损失
end %在有些数据下可能有多种情况,这里没有写出判断相等的处理
end
optimal %穷举之后,得到最小的序列编号
sequence=P(optimal,:) %序列
total %损失
M./T %这里是推断第三题的结果,单位时间损失除以时间得到的顺序大到小即是最优顺序
下面是输出结果
optimal =

3732

sequence =

2 5 6 3 1 4 7

total =

199.9000

ans =

0.1200 0.2250 0.1714 0.1000 0.2000 0.1889 0.0769
下面是两人情况,与上面类似
n=[ 1 2 3 4 5 6 7];
T=[ 5 8 7 8 4 9 13];
M=[ 0.6 1.8 1.2 0.8 0.8 1.7 1.0];
P=perms(n);
[h,w]=size(P);
total=10000;
optimal=0;
for i=1:h
D=T(P(i,:));
Me=M(P(i,:));
s=0;

for k=1:4 %这里处理的时候认为工人一按顺序处理前四个
delay(k)=s+D(k);
s=delay(k);
end
s=0;
for k=5:7 %工人二处理后三个,这里顺序有重复,即工人一和工人二是等价的,可以调换的,一种其实是两种
delay(k)=s+D(k);
s=delay(k);
end

Tot=Me*delay';
if total>Tot
optimal=i;
total=Tot;
end
end
optimal
sequence=P(optimal,:)
total

下面是结果
optimal =

1539

sequence =

5 6 1 4 2 3 7

total =

117.3000

第三问从matlab的实验情况看就是单位时间的停工损失,除以维修时间,得到的结果从大到小排列,对应编号就是维修顺序。具体要说明应该是数学证明,不是程序的问题,刚调了程序有些头昏,你自己看看有没有什么证明,或者改天我搞清了再加上

目前有思路但没有具体证明,如两个机器,对应时间和单位时间损失为T1、T2,M1、M2两种方法损失为M1T1+M2*(T1+T2)和M2T2+M1(T1+T2),相差部分为M2T1和M1T2,M1/T1>M2/T2则有M1T2>M2T1,所以要先修理1号,归纳法如何归纳,还是用别的方法就不知道了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-08
5台机器
第2个回答  2010-05-08
数学知识太有实用价值了,能够运用好数学,可以大大减少不必要的损失,关注下!
相似回答