2021年美国大学生数学建模竞赛E题重新优化食品系统解题全过程文档及程序

2021年美国大学生数学建模竞赛

E题 重新优化食品系统

原题再现:

  最近的事件向我们表明,我们的全球粮食系统即使在普遍服务良好的世界地区也是不稳定的。 这些不稳定的部分原因是我们目前的全球大规模国家和国际粮食生产者和分配者系统。 这种食品系统允许相对廉价和高效地生产和分配食品,从而表明目前的模式优先考虑效率和盈利能力。
  尽管该系统效率高,但联合国估计全世界有8.21亿人遭受饥饿[1]即使有足够的食物来养活世界上的每一个人。[2] 粮食无保障的人,即无法获得足够的负担得起和有营养的食物的人,生活在每个大陆、每个国家和每个社区。 而且,即使在富裕国家,粮食短缺的地区也会出现,那里没有足够数量的粮食和营养。 此外,目前的粮食系统留下了巨大的环境足迹,占“29%的温室气体排放,.高达80%的生物多样性丧失,80%的森林砍伐,以及70%的淡水使用。”[3] 随着我们的全球人口继续增加,而我们经历了几十年的环境虐待的影响,在维持甚至改善我们的环境健康的同时生产更多粮食的能力从来没有比这更重要。 因此,全面审查我们目前的食品体系似乎是一个合理和有必要的努力。
  国际组合管理(ICM)委员会挑战您的团队重新设想和重新确定我们的食品系统的优先次序,通过开发一个模型。 虽然ICM委员会将由您的团队来决定这些系统的哪些方面值得成为您建模活动的重点,但您应该提供一个足够健壮的食品系统模型,以便能够根据不同级别的效率、盈利能力、可持续性和/或公平进行调整以优化。
  无论您关注的是全球还是本地,食品系统都是复杂的。 你应该考虑的一些问题包括但不限于:
   如果一个粮食系统被优化以实现公平和可持续性,会发生什么? 这一制度与现行制度有何不同? 这样的制度需要多长时间才能实施?
   改变粮食系统的优先次序的好处和代价是什么? 它们什么时候会发生? 发达国家和发展中国家之间的这些好处和成本有何不同?
   一旦您开发了您的食品系统模型,将您的模型应用于至少一个发达国家和一个发展中国家,以支持您的发现。
   讨论模型的可伸缩性(对更大或更小的食品系统)和适应性(对其他区域。来自环境科学、营养政策和科学、政府和数学领域的跨学科和多样化小组ICM委员会期待着您的最后报告。

整体求解过程概述(摘要)

  在过去几年中,粮食系统将效率和盈利能力视为优先事项,而忽视了环境可持续性和社会公平。由此造成的严重环境破坏和饥饿问题正悬在我们头上,等待解决。
  在本文中,我们将环境和公平因素与经济因素相结合,建立了环境-公平-经济模型(EEE模型),以重新优化当前的粮食系统。EEE 模型由三个互锁子模型组成。它们是环境可持续性模型、食品分配公平模型和经济效益成本分析模型。通过考虑一些参数,可持续性和公平性被提升为以牺牲经济利润为代价的优先事项。
  第一个题:环境模型涉及三个环境指标,分别是温室气体(GHG)排放和粮食系统富营养化排放以及粮食生产的土地利用。在检查大量数据后,我们发现,改变国民的饮食结构将对上述三项指标的减少产生显著影响。我们使用Logistic模型来预测未来情况,并引入时间系数r来衡量实现环境可持续性所需的时间。动物产品税用于推动这一转变。
  第二个题:公平模型是基于社会不均匀的食物分配。我们的理念是通过减缓食物摄入率的增长来降低饥饿率。为了实现这一目标,政府可以将多余的食物提供给粮食短缺地区,并将其提供给粮食不安全的人。援助系数A用于衡量政府援助的强度。至于运费,政府可以向食品生产商和分销商收取食品公平税。
  第三个题:经济模型考虑了食品生产者和分配者的净利润。在我们重新优化的食品系统模型中,经济净利润不仅仅是收益和成本之间的差异。它需要包括第一个E和第二个E模型的动物税和食品公平税。
  我们选择中国和芬兰作为目标国家,并在案例研究中采用我们的模式。经过仿真,我们得出的结果是
  中国的温室气体排放量将减少25.79%,富营养化减少16.15%,土地减少32.79%。同样在2021年,饥饿比率将开始下降,到2029年没有粮食不安全人口。食品生产的成本减少了5.14%的净利润。
  芬兰的温室气体排放量将减少33.22%,富营养化减少32.03%,闲置土地减少26.98%。同样在计划实施后的第一个月,饥饿率将开始下降,到2027年中期,没有粮食不安全的人。食品生产的成本减少了9.77%的净利润。
  我们还讨论了模型的可扩展性和盈利能力,确定模型的优缺点,探索未来工作的概率。

模型假设:

  为了简化问题,我们做出以下基本假设,每个假设都有适当的理由。
  假设1:我们只将卡路里和蛋白质视为一个人的基本饮食需求。
  ‹→理由:对于粮食不安全的人,卡路里提供足够的能量和蛋白质维持健康的身体。因此,它们是最需要的营养。相比之下,维生素和微量元素等其他营养素可以忽略不计。
  假设2:食物的价格是稳定和恒定的。
  ‹→理由:正如问题所说,有足够的食物来养活世界上的每个人,因此供应大于需求,食品生产商和分销商无法改变食物的价格,它是稳定的。
  假设3:食品运输的温室气体排放量可以忽略。
  ‹→理由:根据网站上的统计数据 我们的数据世界,绿色与食品生产相比,食品运输的室内气体排放量要小得多,因此我们可以忽略这部分排放。
  假设4:我们将忽略极端事件的影响。
  ‹→理由:当我们预测改良食品系统的发展时,发展趋势不会改变。不可抗力的影响将不予考虑。我们假设我们的目标国家是正规和稳定的。
  假设5:那些我们没有提到的因素对系统的影响很小。
  ‹→理由:实际上,可能影响粮食系统的因素太多了,无法考虑。因此,这种假设是合理的,有助于避免构建模型时出现不必要的麻烦。
  假设6:我们从网站捕获的统计数据是精确可靠的。
  ‹→理由:我们从权威网站收集大部分数据,我们认为这是值得信赖的。此外,这是我们模型实用的前提。

问题重述:

  了解问题后,我们需要做以下工作:
  开发粮食系统模型,以优化效率、盈利能力、可持续性和公平的优先水平。然后将重新优化的食品系统与当前系统进行比较,并预测实现它所需的时间。
  找到重新优化的食品系统变化的收益和成本,并预测它们何时发生。
  讲述我们的模型在发达国家和发展中国家之间的差异,并将模型应用于实际情况。
  进一步探索我们的模型在不同大小的不同区域使用时的可扩展性和适应性。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

import numpy as np
import itertools
import matplotlib.pyplot as plt
 
#自适应层数的层次分析法
class AHP():
    '''
    注意:python中list与array运算不一样,严格按照格式输入!
    本层次分析法每个判断矩阵不得超过9阶,各判断矩阵必须是正互反矩阵
    FA_mx:下一层对上一层的判断矩阵集(包含多个三维数组,默认从目标层向方案层依次输入判断矩阵。同层的判断矩阵按顺序排列,且上层指标不共用下层指标)
    string:默认为'norm'(经典的层次分析法,需输入9标度判断矩阵),若为'auto'(自调节层次分析法,需输入3标度判断矩阵)
    '''
    #初始化函数 
    def __init__(self,FA_mx,string='norm'):
        self.RI=np.array([0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49])   #平均随机一致性指标
        if string=='norm':
            self.FA_mx=FA_mx           #所有层级的判断矩阵
        elif string=='auto':
            self.FA_mx=[]
            for i in range(len(FA_mx)):
                  temp=[] 
                  for j in range(len(FA_mx[i])):
                      temp.append(self.preprocess(FA_mx[i][j]))
                  self.FA_mx.append(temp)     #自调节层次分析法预处理后的所有层级的判断矩阵
        self.layer_num=len(FA_mx)   #层级数目
        self.w=[]                  #所有层级的权值向量
        self.CR=[]                 #所有层级的单排序一致性比例
        self.CI=[]                 #所有层级下每个矩阵的一致性指标
        self.RI_all=[]              #所有层级下每个矩阵的平均随机一致性指标
        self.CR_all=[]             #所有层级的总排序一致性比例
        self.w_all=[]              #所有层级指标对目标的权值
         
         
    #输入单个矩阵算权值并一致性检验(特征根法精确求解)
    def count_w(self,mx):
        n=mx.shape[0]
        eig_value, eigen_vectors=np.linalg.eig(mx)
        maxeig=np.max(eig_value)         #最大特征值
        maxindex=np.argmax(eig_value)    #最大特征值对应的特征向量
        eig_w=eigen_vectors[:,maxindex]/sum(eigen_vectors[:,maxindex])         #权值向量
        CI=(maxeig-n)/(n-1)
        RI=self.RI[n-1]
        if(n<=2 and CI==0):
                CR=0.0
        else:
            CR=CI/RI
        if(CR<0.1):
            return CI,RI,CR,list(eig_w.T)
        else:
            print('该%d阶矩阵一致性检验不通过,CR为%.3f'%(n,CR))
            return -1.0,-1.0,-1.0,-1.0
     
    #计算单层的所有权值与CR
    def onelayer_up(self,onelayer_mx,index):
        num=len(onelayer_mx)           #该层矩阵个数
        CI_temp=[]
        RI_temp=[]
        CR_temp=[]
        w_temp=[]
        for i in range(num):
            CI,RI,CR,eig_w=self.count_w(onelayer_mx[i])
            if(CR>0.1):
                print('第%d层的第%d个矩阵未通过一致性检验'%(index,i+1))
                return
            CI_temp.append(CI)
            RI_temp.append(RI)
            CR_temp.append(CR)
            w_temp.append(eig_w)
        self.CI.append(CI_temp)
        self.RI_all.append(RI_temp)
        self.CR.append(CR_temp)
        self.w.append(w_temp)
         
    #计算单层的总排序及该层总的一致性比例
    def alllayer_down(self):
        self.CR_all.append(self.CR[self.layer_num-1])
        self.w_all.append(self.w[self.layer_num-1])
        for i in range(self.layer_num-2,-1,-1):
            if(i==self.layer_num-2):
                temp=sum(self.w[self.layer_num-1],[])         #列表降维,扁平化处理,取上一层的权值向量
            CR_temp=[]
            w_temp=[]
            CR=sum(np.array(self.CI[i])*np.array(temp))/sum(np.array(self.RI_all[i])*np.array(temp))
            if(CR>0.1):
                print('第%d层的总排序未通过一致性检验'%(self.layer_num-i))
                return
            for j in range(len(self.w[i])):
                shu=temp[j]
                w_temp.append(list(shu*np.array(self.w[i][j])))
            temp=sum(w_temp,[])        #列表降维,扁平化处理,取上一层的总排序权值向量
            CR_temp.append(CR)
            self.CR_all.append(CR_temp)
            self.w_all.append(w_temp)
        return
         
         
         
    #计算所有层的权值与CR,层次总排序
    def run(self):
        for i in range(self.layer_num,0,-1):
            self.onelayer_up(self.FA_mx[i-1],i)
        self.alllayer_down()
        return
     
     
    #自调节层次分析法的矩阵预处理过程
    def preprocess(self,mx):
        temp=np.array(mx)
        n=temp.shape[0]
        for i in range(n-1):
            H=[j for j,x in enumerate(temp[i]) if j>i and x==-1]
            M=[j for j,x in enumerate(temp[i]) if j>i and x==0]
            L=[j for j,x in enumerate(temp[i]) if j>i and x==1]
            DL=sum([[i for i in itertools.product(H,M)],[i for i in itertools.product(H,L)],[i for i in itertools.product(M,L)]],[])
            DM=[i for i in itertools.product(M,M)]
            DH=sum([[i for i in itertools.product(L,H)],[i for i in itertools.product(M,H)],[i for i in itertools.product(L,M)]],[])
            if DL:
                for j in DL:
                   if(j[0]<j[1] and i<j[0]):
                       temp[int(j[0])][int(j[1])]=1
            if DM:
                for j in DM:
                   if(j[0]<j[1] and i<j[0]):
                       temp[int(j[0])][int(j[1])]=0
            if DH:
                for j in DH:
                   if(j[0]<j[1] and i<j[0]):
                       temp[int(j[0])][int(j[1])]=-1
        for i in range(n):
            for j in range(i+1,n):
                temp[j][i]=-temp[i][j]
        A=[]
        for i in range(n):
            atemp=[]
            for j in range(n):
                a0=0
                for k in range(n):
                    a0+=temp[i][k]+temp[k][j]
                atemp.append(np.exp(a0/n))
            A.append(atemp)
        return np.array(A)   
     
     
             
 
#%%测试函数
if __name__=='__main__' :
    '''
    # 层次分析法的经典9标度矩阵
    goal=[]             #第一层的全部判断矩阵
    goal.append(np.array([[1, 3],   
                [1/3 ,1]]))
    criteria1 = np.array([[1, 3],
                          [1/3,1]])
    criteria2=np.array([[1, 1,3],
                        [1,1,3],
                        [1/3,1/3,1]])
    c_all=[criteria1,criteria2]   #第二层的全部判断矩阵
    sample1 = np.array([[1, 1], [1, 1]])
    sample2 = np.array([[1,1,1/3], [1,1,1/3],[3,3,1]])
    sample3 = np.array([[1, 1/3], [3, 1]])
    sample4 = np.array([[1,3,1], [1 / 3, 1, 1/3], [1,3, 1]])
    sample5=np.array([[1,3],[1/3 ,1]])
    sample_all=[sample1,sample2,sample3,sample4,sample5]  #第三层的全部判断矩阵
    FA_mx=[goal,c_all,sample_all]
    A1=AHP(FA_mx)     #经典层次分析法
    A1.run()
    a=A1.CR           #层次单排序的一致性比例(从下往上)
    b=A1.w            #层次单排序的权值(从下往上)
    c=A1.CR_all       #层次总排序的一致性比例(从上往下)
    d=A1.w_all        #层次总排序的权值(从上往下)
    e=sum(d[len(d)-1],[])       #底层指标对目标层的权值
    #可视化
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    name=['D1','D2','D3','D4','D5','D6','D7','D8','D9','D10','D11','D12']
    plt.figure()
    plt.bar(name,e)
    for i,j in enumerate(e):
        plt.text(i,j+0.005,'%.4f'%(np.abs(j)),ha='center',va='top')
    plt.title('底层指标对A的权值')
    plt.show()
    '''
     
    #自调节层次分析法的3标度矩阵(求在线体系的权值)
    goal=[]             #第一层的全部判断矩阵
    goal.append(np.array([[0, 1],   
                [-1,0]]))
    criteria1 = np.array([[0, 1],
                          [-1,0]])
    criteria2=np.array([[0, 0,1],
                        [0,0,1],
                        [-1,-1,0]])
    c_all=[criteria1,criteria2]   #第二层的全部判断矩阵
    sample1 = np.array([[0, 0], [0, 0]])
    sample2 = np.array([[0,0,-1], [0,0,-1],[1,1,0]])
    sample3 = np.array([[0, -1], [1, 0]])
    sample4 = np.array([[0,1,0], [-1, 0,-1], [0,1,0]])
    sample5=np.array([[0,1],[-1 ,0]])
    sample_all=[sample1,sample2,sample3,sample4,sample5]  #第三层的全部判断矩阵
    FA_mx=[goal,c_all,sample_all]
    A1=AHP(FA_mx,'auto')     #经典层次分析法
    A1.run()
    a=A1.CR           #层次单排序的一致性比例(从下往上)
    b=A1.w            #层次单排序的权值(从下往上)
    c=A1.CR_all       #层次总排序的一致性比例(从上往下)
    d=A1.w_all        #层次总排序的权值(从上往下)
    e=sum(d[len(d)-1],[])       
    #底层指标对目标层的权值
    #可视化
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    name=['D1','D2','D3','D4','D5','D6','D7','D8','D9','D10','D11','D12']
    plt.figure()
    plt.bar(name,e)
    for i,j in enumerate(e):
        plt.text(i,j+0.005,'%.4f'%(np.abs(j)),ha='center',va='top')
    plt.title('底层指标对A的权值')
    plt.show()
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

猜你喜欢

转载自blog.csdn.net/weixin_43292788/article/details/131781145