2022年第五届中青杯数学建模-时间序列预测模型及基于多特征条件下的决策优化
开放三孩背景下的生育政策研究
众所周知,人口的数量和结构是影响社会经济发展的重要因素。我国经历了“计划生育”到“全面二孩”,再到“放开三孩”政策的实施,这都是对我国人口发展变化趋势的调整。
三孩政策,是中国积极应对人口老龄化而实行的一项计划生育政策。2021年5月31日,中共中央政治局召开会议,审议《关于优化生育政策促进人口长期均衡发展的决定》并指出,为进一步优化生育政策,实施一对夫妻可以生育三个子女政策及配套支持措施。在2022年中华人民共和国第十三届全国人民代表大会第五次会议和中国人民政治协商会议第十三届全国委员会第五次会议中许多人大代表也纷纷发出了很多“好声音”,全国人大代表刘庆峰建议:“落实鼓励生育政策,要为年轻人和用人单位减负。关注企业女员工职业发展通道,解决女性职场后顾之忧。个税专项附加扣除尽快覆盖0-3岁幼儿家庭”。全国人大代表卢馨建议“适当延长男性育儿假并建立灵活的休假制度,男性陪产育儿假可以不一次性休完,而是建立假期分割、共享的灵活休假制度”。
基于以上可知,对于生育后的配套支持措施如何实施是当前育龄人群最为关心的问题之一,请你结合相关数据,建立相关数学模型,完成以下问题。
问题一:结合我国人口的年龄结构,建立数学模型,预测开放三孩后我国未来10年的人口状况;
问题二:“双减”政策的实施,一定程度上减缓了家长对孩子教育的压力,请你建立数学模型,分析“双减”政策落地后对我国新出生人口是否会有影响;
问题三:请你结合当下实际情况,分析在医疗方面如何推行实施新的政策,从而进一步缓解我国人口老龄化进程;
问题四:请你从“教育”、“医疗”、“住房”、“用人单位减负”、“个税专项附加扣除”、“延长男性育儿假”等多方面综合考虑,给出促进生育意愿的有效方案。
模型的建立与求解过程
针对问题一应采用灰色预测模型或平稳时间序列模型来做,先从题目要求出发,先对不同年龄段的人口简单做个统计分析,掌握人口结构情况;(可以环形图、饼形图),然后分析三孩政策对于整体人口的影响具体影响的是那部分人群?影响权重是多少?怎么得出的影响权重?根据是什么?紧接着主干来了,问题一是一个回归预测的问题并非是分类预测的问题,该预测是时间为十年的人口预测趋势,人口与什么相关?一、政策;二、地区经济;三、结婚率 总共大面上就这么点事
针对问题二,这就得考虑到教育了,也就是说你第一问必须得考虑一下教育因素然后为第二问做铺垫,这样评委看的满意,也符合逻辑依据。出生人口影响因素:教育、双减政策、问题一考虑的因素,就这么多。
针对问题三,相同的套路得考虑医疗因素
针对问题四,综合分析,这个地方就要用到权重占比、单因子分析及综合多因素了,并给出方案的可取性及使用依据。
程序代码
import numpy as np
import itertools
import matplotlib.pyplot as plt
'''如有问题if you want my model and word'''
'''小编QQ:631183848'''
#自适应层数的层次分析法
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()
来源:小小数模