721 饲料混合加工问题
题目整理
- 加工部分
- 9个加工窖 16个加工原料(见表1)
- 一个加工窖的混合产品称为一个加工包 如只有一种原料,一个加工包加工原料重量不少于500千克
- 品种代码10的加工原料不能单独成为一个加工包
- 一个加工窖能够加工的重量有限定范围(见表2)
- 加工窖加工成本只考虑由点火成本(也称固定成本)与加工量成本(也称可变成本)构成
- 饲料质量部分(亲缘度)
- 每种加工原料得到了10个关键位点的基因序列(见表1)
- 两个加工原料如果有N个相同位点的基因序列标记相同,N大于0,则说明这两种加工原料之间具有亲缘关系
- 原料两两之间亲缘值的平均值称为亲缘度
- 只含有一种加工原料,则该加工包的亲缘度为10
- 本题仅从亲缘度角度考虑混合加工饲料的质量,亲缘度越高,饲料质量就越高
- 题目
- 请研究16个加工原料两两之间的亲缘值,并进行统计性分析。
- 将16个加工原料进行混合全部放入9个加工窖中。请建立数学模型,求出饲料质量最高的混合方案并给出每个加工包的亲缘度。
- 将16个加工原料进行混合全部放入9个加工窖中。请建立数学模型,求出平均能耗率超
过80%的加工包数量最多的混合方案并给出每个加工包的能耗率,并将结果填入表3。 - 如果饲料加工厂允许部分加工窖不生产,请建立数学模型,给出混合加工方案,用尽量
低的加工成本完成整个加工任务,同时要求平均能耗率超过80%的加工包尽量的多。 - 如果饲料加工厂允许部分加工窖不生产,但必须完成整个加工任务。请建立数学模型,
给出混合加工方案使得(1)饲料质量尽量高,(2)加工成本尽量低,(3)平均能耗率超过80%的加工包尽量多。
分析
- 请研究16个加工原料两两之间的亲缘值,并进行统计性分析。
- c++实现
#include<iostream>
using namespace std;
int f[16][10];
int p[16][16];
int main()
{
for(int i=0;i<16;i++)
{
for(int j=0;j<10;j++)
{
cin>>f[i][j];
}
}//初始化位点基因序列
for(int m=0;m<15;m++)//不妨令m<n
{
for(int n=m+1;n<16;n++)
{
for(int j=0;j<10;j++)
{
if(f[m][j]==f[n][j])
{
p[m][n]++;
}
}
}
}//一一比较
for(int m=0;m<15;m++)
{
for(int n=m+1;n<16;n++)
{
cout<<p[m][n];
}
cout<<endl;
}//输出矩阵
return 0;
}
带入表格值:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 11 12 13 14 15
6 7 8 1 10 11 12 13 14 15
6 7 8 9 10 14 12 6 11 12
6 2 8 4 5 11 12 1 11 16
17 15 19 20 21 6 7 1 6 16
17 18 19 20 13 6 7 8 6 3
17 18 19 20 1 2 8 9 10 3
3 18 1 6 22 23 1 9 10 3
2 15 25 9 1 16 8 6 11 16
15 1 15 5 1 16 1 2 1 2
15 3 15 5 24 8 1 2 25 1
2 1 25 26 3 7 15 2 15 2
15 3 15 26 24 7 15 2 25 2
2 24 25 9 3 14 2 3 15 12
3 3 1 6 24 8 2 3 15 10
输出:
500323000000001
51500000000000
5400000000000
400003000030
20002000000
6302000000
520000000
42100000
0110003
202030
53400
1603
541
02
3
- 用excel制成热力图
较为轻松,一个半小时完成
- 将16个加工原料进行混合全部放入9个加工窖中。请建立数学模型,求出饲料质量最高的混合方案并给出每个加工包的亲缘度。
wij --------- 第 i 个窖子第 j 种原料的重量
W --------- 总重量
wi --------- 第 i 个工作包的总重
wj --------- 第 j 种原料的总重
V ---------- 总质量(目标函数)
vi ---------- 第 i 个加工包的总质量
Bi ---------- 第 i 个加工包重量的约束条件
亲缘值只考虑二者的关系
考虑到一个加工包中只含有一种加工原料,则该加工包的亲缘度为10,远大于其余可能亲缘度值,又受每个加工包重量限制,而原料10题令不可单独成包,故将原料2,4,12,13单独提出,分别置入1,2,3,4四加工包中。
现考虑剩余12种原料与5个加工窖
target:V=Σvi
s.t. :
Σi wij = wj
Σj wij ∈ Bi // j加工包重量限制
wij < wi , j = 10 // 品种代码10的加工原料不能单独成为一个加工包
vi = 10 , n = 1
wij >= 500 , n = 1
由于重量与质量仅通过 wij 的下标 j 相连系,目标函数以此建立。
%质量矩阵w s.T.
w=zeros(9,16);
wj=[w(:,1)-300
w(:,3)-200
w(:,5)-300
w(:,6)-400
w(:,7)-300
w(:,8)-300
w(:,9)-400
w(:,10)-600
w(:,11)-100
w(:,14)-400
w(:,15)-300
w(:,16)-300
]; %wj 品种
wi=[w(5,:)-600
-w(5,:)+900
w(6,:)-600
-w(6,:)+900
w(7,:)-900
-w(7,:)+1200
w(8,:)-900
-w(8,:)+1200
w(9,:)-900
-w(9,:)+1200
]; %wi 窖子 >=0
%目标函数初始化
f0=0;f=0;
target=0;
m=zeros(9,2); %有效值矩阵 m
a=1;
v=0;
if all(wj==0)
if all(wi>=0)
for i = 1:16
for j = 1:9
if w(j,i)==0
target=target+1;
end
if target==14
for k = 1:16
if w(j,k)~=0
m(j,a)=i;
a=a+1;
end
end
end %搜索这两种原料下标的值 m(j,1)<m(j,2)
end
end %一个窖子有且只有两种原料
for j = 1:9
v=sub2ind(size(a),m(j,1),m(j,2));%根据下标查找亲缘值
f=f+(w(x,m(j,1))+w(x,m(j,2)))*v;
end
if f>f0
f0=f;
end
end
end
f0
然而并未有解,说明此假设不成立,考虑到综合因素大致会是以下两种:
四种大重量原料不能单独放置
不能简化为只考虑两种原料的亲缘度规划
这样来看这个模型并非合适,需要更普遍化的数学模型。
- 将16个加工原料进行混合全部放入9个加工窖中。请建立数学模型,求出平均能耗率超过80%的加工包数量最多的混合方案并给出每个加工包的能耗率,并将结果填入表3。
采用蒙特卡洛
鉴于仅有7种原料能耗率未达百分之八十,将其分别置入七个窖子中,用其余九种原料进行配比,使这七个加工包能耗率达到要求。
target:目标矩阵w //x0
s.t. :
Σi wij = wj
Σj wij ∈ Bi // j 加工包重量限制
wij * a >= 0.8 * wi // a 为效能矩阵
%'''matlab 自定义函数mengte 文件mengte.m 注意到名称一致,地址一致
function[f,g]=mengte(x) ;
f=sum(x(1,:))/sum(x(1,:)) ; %目标函数
g=[sum(x(1,:))-600
-sum(x(1,:))+300
sum(x(2,:))-600
-sum(x(2,:))+300
sum(x(3,:))-900
-sum(x(3,:))+600
sum(x(4,:))-900
-sum(x(4,:))+600
sum(x(5,:))-1200
-sum(x(5,:))+900
sum(x(6,:))-1200
-sum(x(6,:))+900
sum(x(7,:))-1200
-sum(x(7,:))+900 %七个加工包重量约束
sum(x(:,1))-300
sum(x(:,2))-500
sum(x(:,3))-200
sum(x(:,4))-500
sum(x(:,5))-300
sum(x(:,6))-400
sum(x(:,7))-300
sum(x(:,8))-300
sum(x(:,9))-400
sum(x(:,10))-600
sum(x(:,11))-100
sum(x(:,12))-600
sum(x(:,13))-500
sum(x(:,14))-400
sum(x(:,15))-300
sum(x(:,16))-300 %单一品种重量约束
-x*[0.88;0.6;0.93;0.90;0.90;0.78;0.70;0.83;0.95;0.87;0.65;0.75;0.8;0.68;0.87;0.83]*1.25+[sum(x(1,:));sum(x(2,:));sum(x(3,:));sum(x(4,:));sum(x(5,:));sum(x(6,:));sum(x(7,:))]
%效能约束
];%约束函数
%'''matlab 求解
clc;clear;
p0=0;
x0=zeros(7,16);
for i=1:10^10
x=zeros(7,16);
x(1,7)=300;
x(2,11)=100;
x(3,6)=400;
x(4,14)=400;
x(5,2)=500;
x(6,10)=600;
x(7,12)=600;
x(1,1)=unidrnd(300);
x(3,1)=unidrnd(300);
x(5,1)=unidrnd(300);
x(5,3)=unidrnd(200);
x(5,4)=unidrnd(500);
x(6,4)=unidrnd(500);
x(5,5)=unidrnd(300);
x(6,5)=unidrnd(300);
x(3,5)=unidrnd(300);
x(1,8)=unidrnd(300);
x(2,8)=unidrnd(300);
x(3,8)=unidrnd(300);
x(6,8)=unidrnd(300);
x(1,9)=unidrnd(400);
x(2,9)=unidrnd(400);
x(7,9)=unidrnd(400);
x(2,13)=unidrnd(500);
x(4,13)=unidrnd(500);
x(6,13)=unidrnd(500);
x(7,13)=unidrnd(500);
x(6,15)=unidrnd(300);
x(4,16)=unidrnd(300);
x(7,16)=unidrnd(300);
%初始化矩阵
[f,g]=mengte(x);
if all(g<=0)
if p0<f
x0=x;p0=f;
end
end
end
x0,p0
%蒙特卡洛
注意到,for i=1:10^10
我们起初选用10^6,但是不知是由于数据太小还是无法使七个窖子都满足要求,将数据调大再进行模拟。
然而10^10 matlab 运行6个小时都未能给出结果,我们考虑减少可行的窖子。
既然必然抛弃一个包,我们决定保一推六,让大包退出模拟,剩余六个窖子再次蒙特卡罗模拟。
无果,不得不挨个继续抛弃模拟寻找可行解。 如下图所示 最终抛弃2包,得到7包解。
- 如果饲料加工厂允许部分加工窖不生产,请建立数学模型,给出混合加工方案,用尽量低的加工成本完成整个加工任务,同时要求平均能耗率超过80%的加工包尽量的多。
双目标
考虑到第三问已有模型,我们期望高质量生产之下用尽量低的加工成本完成加工任务。令能耗率的最大值为首要目标,加工成本的最低值为次要目标,非线性规划,蒙特卡洛模拟。
code在第三问基础上加工
clc;clear;
p0=0;
x0=zeros(6,16);
for i=1:10^6
x=zeros(6,16);
x(1,7)=300;
x(2,2)=500;
x(3,6)=400;
x(4,11)=100;
x(4,12)=480;
x(4,14)=400;
x(5,10)=600;
x(6,12)=120;
x(3,5)=300;
x(2,1)=300;
x(2,4)=round(rand(1,1)*500);
x(5,4)=round(rand(1,1)*500);
x(1,9)=round(rand(1,1)*400);
x(6,9)=round(rand(1,1)*400);
x(6,13)=round(rand(1,1)*500);
x(6,16)=round(rand(1,1)*300);
%初始化矩阵
[f,g]=mengte(x);
if all(g<=0)
if p0<f
x0=x;p0=f;
end
end %初始化X0
x2=zeros(3,16);
x2(1,3)=200;
x2(1,4)=500-sum(x0(:,4));
x2(2,8)=300;
x2(2,9)=400-sum(x0(:,9));
x2(3,13)=500-sum(x0(:,13));
x2(3,15)=300;
x2(3,16)=300-sum(x0(:,16));
x1=[x2;x0]; % 计算x1
b0=10^5;
f=[2;2;2;1.8;1.8;1.8;1.6;1.6;1.6];
X=[sum(x1(1,:));
sum(x1(2,:));
sum(x1(3,:));
sum(x1(4,:));
sum(x1(5,:));
sum(x1(6,:));
sum(x1(7,:));
sum(x1(8,:));
sum(x1(9,:))];
win= 50-x1(1,4);
b=f'*X;
if win<0
if b0>b
b0=b;
end
end % 求解
end
b0
x1
题说不必所有的窑子都投入生产,而不难看出,所有加工窑都投入了生产,无疑一定程度上加大了生产成本。
期待交流斧正