721 建模模拟 饲料混合加工问题 (20 五一 C)

721 饲料混合加工问题

题目整理

  • 加工部分
  1. 9个加工窖 16个加工原料(见表1)
  2. 一个加工窖的混合产品称为一个加工包 如只有一种原料,一个加工包加工原料重量不少于500千克
  3. 品种代码10的加工原料不能单独成为一个加工包
  4. 一个加工窖能够加工的重量有限定范围(见表2)
  5. 加工窖加工成本只考虑由点火成本(也称固定成本)与加工量成本(也称可变成本)构成
  • 饲料质量部分(亲缘度)
  1. 每种加工原料得到了10个关键位点的基因序列(见表1)
  2. 两个加工原料如果有N个相同位点的基因序列标记相同,N大于0,则说明这两种加工原料之间具有亲缘关系
  3. 原料两两之间亲缘值的平均值称为亲缘度
  4. 只含有一种加工原料,则该加工包的亲缘度为10
  5. 本题仅从亲缘度角度考虑混合加工饲料的质量,亲缘度越高,饲料质量就越高
  • 题目
  1. 请研究16个加工原料两两之间的亲缘值,并进行统计性分析。
  2. 将16个加工原料进行混合全部放入9个加工窖中。请建立数学模型,求出饲料质量最高的混合方案并给出每个加工包的亲缘度。
  3. 将16个加工原料进行混合全部放入9个加工窖中。请建立数学模型,求出平均能耗率超
    过80%的加工包数量最多的混合方案并给出每个加工包的能耗率,并将结果填入表3。
  4. 如果饲料加工厂允许部分加工窖不生产,请建立数学模型,给出混合加工方案,用尽量
    低的加工成本完成整个加工任务,同时要求平均能耗率超过80%的加工包尽量的多。
  5. 如果饲料加工厂允许部分加工窖不生产,但必须完成整个加工任务。请建立数学模型,
    给出混合加工方案使得(1)饲料质量尽量高,(2)加工成本尽量低,(3)平均能耗率超过80%的加工包尽量多。

题示

分析

  1. 请研究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制成热力图

excel热力图
较为轻松,一个半小时完成

  1. 将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

然而并未有解,说明此假设不成立,考虑到综合因素大致会是以下两种:
四种大重量原料不能单独放置
不能简化为只考虑两种原料的亲缘度规划

这样来看这个模型并非合适,需要更普遍化的数学模型。

  1. 将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包解。

在这里插入图片描述

  1. 如果饲料加工厂允许部分加工窖不生产,请建立数学模型,给出混合加工方案,用尽量低的加工成本完成整个加工任务,同时要求平均能耗率超过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

题说不必所有的窑子都投入生产,而不难看出,所有加工窑都投入了生产,无疑一定程度上加大了生产成本。

期待交流斧正

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值