给出5个整数规划数学建模案例,要求每个案例都同时包含Matlab和lingo代码且题目详细
时间: 2024-03-12 09:44:09 浏览: 146
案例一:生产调度问题
问题描述:某工厂生产两种产品,需求量分别为1000和2000,可以通过两个车间进行生产,车间1每小时可生产300件第一种产品和200件第二种产品,车间2每小时可生产200件第一种产品和400件第二种产品。每小时车间1的生产成本为400元,车间2的生产成本为500元。求生产调度方案,使得总成本最小。
Matlab代码:
```matlab
cvx_begin
variables x y
minimize(400*x + 500*y)
subject to
300*x + 200*y >= 1000;
200*x + 400*y >= 2000;
x >= 0;
y >= 0;
cvx_end
```
Lingo代码:
```Lingo
Model:
MIN = 400*x1 + 500*x2;
Capacity1: 300*x1 + 200*x2 >= 1000;
Capacity2: 200*x1 + 400*x2 >= 2000;
Bounds: x1 >= 0;
x2 >= 0;
End;
```
案例二:货车调度问题
问题描述:某货车要从A地经过B、C、D、E四个城市,最终到达F地。各城市之间的距离和所需时间如下表所示:
| 城市 | A到B | A到C | A到D | A到E | B到C | B到D | B到E | C到D | C到E | D到E |
|------|------|------|------|------|------|------|------|------|------|------|
| 距离 | 100 | 200 | 300 | 400 | 150 | 250 | 350 | 200 | 300 | 150 |
| 时间 | 5 | 10 | 15 | 20 | 8 | 12 | 18 | 12 | 16 | 10 |
货车的速度固定,每小时60公里。求从A到F的最短时间和最短路径。
Matlab代码:
```matlab
% 城市之间的距离
dis=[0 100 200 300 400;100 0 150 250 350;200 150 0 200 300;300 250 200 0 150;400 350 300 150 0];
% 城市之间的时间
time=[0 5 10 15 20;5 0 8 12 18;10 8 0 12 16;15 12 12 0 10;20 18 16 10 0];
% 货车的速度,每小时60公里
speed=60;
% A到F的距离和时间
dis_AF=dis(1,5);
time_AF=time(1,5);
% 定义变量
cvx_begin
variables x1 x2 x3 x4 x5
% 最小化时间
minimize((dis(1,2)*x1+dis(1,3)*x2+dis(1,4)*x3+dis(1,5)*x4+dis_AF*x5)/speed)
subject to
% 从A出发,到达各个城市的时间之和等于总时间
(time(1,2)*x1+time(1,3)*x2+time(1,4)*x3+time(1,5)*x4+time_AF*x5) == (dis(1,2)*x1+dis(1,3)*x2+dis(1,4)*x3+dis(1,5)*x4+dis_AF*x5)/speed;
% 从A出发,到达各个城市的时间不能超过总时间
(time(1,2)*x1+time(1,3)*x2+time(1,4)*x3+time(1,5)*x4+time_AF*x5)/speed <= 24;
% 货车到达每个城市的时间必须大于等于0
x1 >= 0;
x2 >= 0;
x3 >= 0;
x4 >= 0;
x5 >= 0;
cvx_end
% 最短时间
shortest_time=(dis(1,2)*x1+dis(1,3)*x2+dis(1,4)*x3+dis(1,5)*x4+dis_AF*x5)/speed;
% 最短路径
shortest_path=['A','B','C','D','E','F'];
```
Lingo代码:
```Lingo
Model:
MIN = (100*x1 + 200*x2 + 300*x3 + 400*x4 + 500*x5)/60;
Time1: (5*x1 + 10*x2 + 15*x3 + 20*x4 + 25*x5)/60 = (100*x1 + 200*x2 + 300*x3 + 400*x4 + 500*x5)/60;
Time2: (5*x1 + 8*x2 + 12*x3 + 18*x4 + 23*x5)/60 = (100*x1 + 150*x2 + 250*x3 + 350*x4 + 450*x5)/60;
Time3: (5*x1 + 12*x2 + 12*x3 + 16*x4 + 21*x5)/60 = (200*x1 + 150*x2 + 200*x3 + 300*x4 + 400*x5)/60;
Time4: (5*x1 + 15*x2 + 10*x3 + 10*x4 + 15*x5)/60 = (300*x1 + 250*x2 + 200*x3 + 150*x4 + 250*x5)/60;
Time5: (5*x1 + 20*x2 + 10*x3 + 15*x4 + 10*x5)/60 = (400*x1 + 350*x2 + 300*x3 + 150*x4 + 100*x5)/60;
Bounds: x1 >= 0;
x2 >= 0;
x3 >= 0;
x4 >= 0;
x5 >= 0;
End;
```
案例三:线性回归问题
问题描述:给定一个数据集,求解线性回归模型,即找到一个线性函数,最小化预测值与真实值之间的均方误差。
Matlab代码:
```matlab
% 生成数据集
x = linspace(0,1,100)';
y = 2*x + 1 + randn(size(x))*0.1;
% 定义变量
cvx_begin
variables a b
% 最小化误差
minimize(sum_square(y - a*x - b))
cvx_end
% 绘制图像
plot(x,y,'o');
hold on;
plot(x,a*x+b);
```
Lingo代码:
```Lingo
Model:
MIN = SUM((y[i] - a*x[i] - b)^2, i=1 to 100);
End;
```
案例四:网络流问题
问题描述:某公司的产品需要从原材料仓库运输到加工车间,每个车间的加工时间不同,需要的原材料数量也不同。给定原材料仓库、加工车间和产品数量,求解最大流问题,即最大化运输的产品数量。
Matlab代码:
```matlab
% 邻接矩阵
capacities = [0 7 0 4 0 0 0;0 0 6 0 5 0 0;0 0 0 0 0 3 0;0 0 0 0 0 4 5;0 0 0 0 0 2 3;0 0 0 0 0 0 6;0 0 0 0 0 0 0];
% 源点
source = 1;
% 汇点
sink = 7;
% 定义变量
cvx_begin
variables flows(7,7)
% 最大化流量
maximize(sum(flows(:,sink))-sum(flows(source,:)))
subject to
% 流量不能超过容量
flows <= capacities;
% 流量必须大于等于0
flows >= 0;
% 流量守恒
for i = 1:7
if i ~= source && i ~= sink
sum(flows(:,i)) == sum(flows(i,:))
end
end
cvx_end
% 最大流量
max_flow=sum(flows(:,sink))-sum(flows(source,:));
```
Lingo代码:
```Lingo
Model:
MAX = SUM(flows[1,sink] + flows[2,sink] + flows[3,sink] + flows[4,sink] + flows[5,sink] + flows[6,sink] - flows[source,1] - flows[source,2] - flows[source,3] - flows[source,4] - flows[source,5] - flows[source,6]);
Capacity1: flows[1,2] <= 7;
Capacity2: flows[1,4] <= 4;
Capacity3: flows[2,3] <= 6;
Capacity4: flows[2,5] <= 5;
Capacity5: flows[3,6] <= 3;
Capacity6: flows[4,6] <= 4;
Capacity7: flows[4,7] <= 5;
Capacity8: flows[5,6] <= 2;
Capacity9: flows[5,7] <= 3;
Capacity10: flows[6,7] <= 6;
Bounds: flows >= 0;
Balance1: SUM(flows[i,1], i=2 to 6) - flows[source,1] = 0;
Balance2: flows[1,2] - flows[2,3] - flows[2,5] - flows[source,2] = 0;
Balance3: flows[3,6] - flows[source,3] = 0;
Balance4: flows[4,6] + flows[4,7] - flows[source,4] = 0;
Balance5: flows[5,6] + flows[5,7] - flows[source,5] = 0;
Balance6: SUM(flows[6,i], i=3 to 7) - flows[3,6] - flows[4,6] - flows[5,6] - flows[source,6] = 0;
Balance7: SUM(flows[7,i], i=4 to 5) - flows[2,5] - flows[5,7] - flows[4,7] - flows[source,7] = 0;
End;
```
案例五:整数规划问题
问题描述:给定一个非负整数矩阵,求解一个非负整数向量,使得矩阵乘以向量后,得到的向量中所有元素的和最小。
Matlab代码:
```matlab
% 非负整数矩阵
A=[3 2 1;4 1 2;1 1 3];
% 定义变量
cvx_begin
variable x(3) integer nonnegative
% 最小化和
minimize(sum(A*x))
cvx_end
% 最小和
min_sum=sum(A*x);
```
Lingo代码:
```Lingo
Model:
MIN = 3*x1 + 2*x2 + x3 + 4*x4 + x5 + 2*x6 + x7 + x8 + 3*x9;
Bounds: x1 >= 0;
x2 >= 0;
x3 >= 0;
x4 >= 0;
x5 >= 0;
x6 >= 0;
x7 >= 0;
x8 >= 0;
x9 >= 0;
End;
```
阅读全文