首页 > 其他分享 >数学建模

数学建模

时间:2024-01-27 22:00:16浏览次数:28  
标签:matrix initial 矩阵 建模 veg state 数学 import

1.层次分析法

解决问题

评价类问题,即选哪种方案更好

基本原理

考虑影响结果的不同指标(这个指标可以通过知网查文献获取),并且知道它们的重要程度,构造一个判断矩阵

在用判断矩阵求权重之前,先进行一致性检验

引理:\(n\) 阶正反矩阵 \(A\)为一致矩阵时,当且仅当最大特征值\(\lambda(max)=n\)

为非一致矩阵时,\(\lambda(max)>n\)

越不一致,与 \(n\) 相差越大

一致性检验步骤:

1.计算一致性指标

2.查找对应的平均随机一致性指标

3.计算一致性比例

同时我们还需要计算权重,有三种方法,检验通过权重时才能够继续用

代码

1 构建判断矩阵

点击查看代码
import pandas as pd
import numpy as np
from functools import reduce
#定义两个元素相乘
import math
def chf(x,y):
    return x*y

###1.构建判断矩阵
#1.1方法一,手动录入全部矩阵
matrix_initial= np.array([[1,0.333,1,3],[3,1,1,3],[1,1,1,3],[0.333,0.333,0.333,1]])
print(matrix_initial)
#1.1.1取得行数和列数
[m,n] = a.shape

或者

点击查看代码
import pandas as pd
import numpy as np
from functools import reduce
#定义两个元素相乘
import math
def chf(x,y):
    return x*y

#1.2方法二,部分录入矩阵内容
#1.2.1构建对角线为1的矩阵 
n = int(input("请输入维度数n,代码将根据输入数据构建n维矩阵,按回车键完成录入")) 
matrix_initial = np.eye(n) 
#1.2.2填写矩阵值 
for j in range(0,n-1):
    for i in range(j,n-1):
        i=i+1
        matrix_initial[i,j]=float(input("请输入a%s%s处矩阵值,按回车键完成录入"%(i,j)))
        matrix_initial[j,i]=round(1/matrix_initial[i,j],6)
        if matrix_initial[j,i]>1:
            matrix_initial[j,i]=int(matrix_initial[j,i])
        print("当前结构为\n%s"%matrix_initial)
    j=j+1
print("判断矩阵最终为\n%s"%(matrix_initial))

2 方根法计算权重

点击查看代码
#2.方根法计算权重
#2.1每一行元素相乘并求出对应立方根,并存入列表。f为对应立方根,
matrix_mid = []
for i in range(0,n):
    f =  reduce(chf,matrix_initial[i,:])
    f =  pow(f,1/n)
    matrix_mid.append(f)
matrix_mid = np.array(matrix_mid)
matrix_mid = matrix_mid.reshape(-1,1)
#计算立方根之和
matrix_weight = []
matrix_add = sum(matrix_mid)
#计算权重
for i in range(0,n):
    f = matrix_mid[i,:]/matrix_add
    matrix_weight.append(f)
matrix_weight = np.array(matrix_weight)
print(matrix_weight)

3 一致性检验

点击查看代码
#3.一致性检验
#特征值和特征向量
E,F = np.linalg.eig(matrix_initial)
#最大特征值
eigenval = np.max(E)
#CI和RI数据获取
CI=(eigenval-n)/(n-1)
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59]
#判断是否通过一致性检验
CR=CI/RI[n-1]
if CR>=0.1:
    print('没有通过一致性检验\n')
else:
    print('通过一致性检验\n')
    print(CR)
    print(matrix_weight)

参考网址

https://zhuanlan.zhihu.com/p/181711354

2.元胞自动机

解决问题

流行病的传播,生命游戏等

基本原理

每一个元胞下一时刻的状态只受到此时元胞自身和周围元胞的影响,全局变化是由一个个个体变化引起的

边界条件:

定值型:边界均为某个定值

周期型:像轮胎一样首尾相接

反射型:到边界外时呈现镜面反射

吸收型(绝热型):边界外元胞和边界元胞的状态保持一致

代码

模拟森林火灾

点击查看代码
close;

clear;

clc;

n = 300; %元胞矩阵大小

Plight = 0.000001; Pgrowth = 0.001;

UL = [n 1:n-1];

DR = [2:n 1];

veg = zeros(n,n); %初始化

% The value of veg:

% empty == 0

% burning == 1

% green == 2

imh = image(cat(3,veg,veg,veg));

m=annotation('textbox',[0.1,0.1,0.1,0.1],'LineStyle','-','LineWidth',1,'String','123');

for i = 1:100000

sum = (veg(UL,:) == 1) + (veg(:,UL) == 1) + (veg(DR,:) == 1) + (veg(:,DR) == 1);

%根据规则更新森林矩阵:树 = 树 - 着火的树 + 新生的树

veg = 2 * (veg == 2) - ( (veg == 2) & (sum > 0 | (rand(n,n) < Plight)) ) + 2 * ( (veg == 0) & rand(n,n) < Pgrowth);

a=find(veg==2);

b=find(veg==1);

aa=length(a);

bb=length(b);

shu(i)=aa;

fire(i)=bb*30;

if (bb>=0&&bb<=10)

str1='森林正常';

elseif (bb>10&&bb<=100)

str1='火灾发展';

elseif (bb>100)

str1='森林大火';

end

if ((aa>48000)||(bb>=10))

str2='火灾预警:红色预警';

elseif (aa>42000&&aa<=48000)

str2='火灾预警:黄色预警';

elseif (aa>35000&&aa<=42000)

str2='火灾预警:蓝色预警';

elseif (aa>=0&&aa<=35000)

str2='火灾预警:安全';

end

str=[str1 10 str2];

set(imh, 'cdata', cat(3, (veg == 1), (veg == 2), zeros(n)) )

drawnow

figure(2)

delete(m)

plot(shu);

hold on

plot(fire);

legend(['绿树的数量',num2str(aa)],['火的数量',num2str(bb)]);

title(['时间T=',num2str(i),'天']);

m=annotation('textbox',[0.15,0.8,0.1,0.1],'LineStyle','-','LineWidth',1,'String',str);

hold off

% pause(0.0001)

end

参考网址

https://zhuanlan.zhihu.com/p/602124985

https://blog.csdn.net/qq_42112448/article/details/109514612

3 模拟退火

解决问题

在一个大的范围内寻找最优解(避免了像爬山算法一样陷入局部最优解,但也只是一定概率找到最优解)

基本原理

在初始阶段,尽可能地尝试不同的方向,到后期逐渐缩小,最终趋于稳定

初始化:

1.随机选择一个初始点 \(x_{0}\)

2.设置初始 “温度”,即控制参数 \(T_{0}\)

3.确定终止温度 \(T_{f}\) 达到这个温度或以下时,算法即可终止

如果 \(x_{new}\) 比 \(x\) 更好,就接受 \(x_{new}\),如果 \(x_{new}\) 比不上 \(x\),我们也有一定的概率接受 \(x_{new}\),这个概率受到时间的影响

代码

点击查看代码
作者:小树
链接:https://zhuanlan.zhihu.com/p/676926594
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

from simanneal import Annealer
import random
import numpy as np
import matplotlib.pyplot as plt

class TravelingSalesmanProblem(Annealer):

    def move(self):
        a = random.randint(0, len(self.state) - 1)
        b = random.randint(0, len(self.state) - 1)
        self.state[a], self.state[b] = self.state[b], self.state[a]

    def energy(self):
        e = sum(
            dist_matrix[self.state[i-1]][self.state[i]] 
            for i in range(city_num)
        )
        return e

# 初始解(即初始城市访问顺序),随机产生
init_state = list(range(city_num))
random.shuffle(init_state)

tsp = TravelingSalesmanProblem(init_state)
tsp.set_schedule(tsp.auto(minutes=.2))
state, e = tsp.anneal()

print('最短总距离为:', e)
print('最佳路径为:', state)

# 使用 matplotlib 绘图
order_by_best = list(map(int, state)) + [int(state[0])]
plt.plot([cities[i][0] for i in order_by_best], [cities[i][1] for i in order_by_best], 'xb-')
for city, pos in cities.items():
    plt.text(pos[0], pos[1], str(city))
plt.show()
点击查看代码
%% I. 清空环境变量
clear all
clc
%% II. 一元函数优化
x = 1:0.01:2;
y = sin(10*pi*x) ./ x;
figure
plot(x,y,'linewidth',1.5)
ylim([-1.5, 1.5])
xlabel('x')
ylabel('y')
title('y = sin(10*pi*x) / x')
hold on
%%
% 1. 标记出最大值点
[maxVal,maxIndex] = max(y);
plot(x(maxIndex), maxVal, 'r*','linewidth',2)
text(x(maxIndex), maxVal, {['X: ' num2str(x(maxIndex))];['Y: ' num2str(maxVal)]})
hold on
%%
% 2. 标记出最小值点
[minVal,minIndex] = min(y);
plot(x(minIndex), minVal, 'ks','linewidth',2)
text(x(minIndex), minVal, {['X: ' num2str(x(minIndex))];['Y: ' num2str(minVal)]})

function fitnessVal = fitness( x ) 
fitnessVal = sin(10*pi*x) / x; 
end

fun = @fitness;
x0 = [1];
lb = [1];
ub = [2];
x = simulannealbnd(fun,x0,lb,ub)

参考网址

https://www.zhihu.com/search?type=content&q=数学建模模拟退火

https://zhuanlan.zhihu.com/p/617855897

4 聚类分析

标签:matrix,initial,矩阵,建模,veg,state,数学,import
From: https://www.cnblogs.com/ataraxyyeah/p/17991998

相关文章

  • 『数学记录』概率导论(一):样本空间与概率
      概率系列的第一篇文章。概率是用计算概括的常识。——拉普拉斯Part1 集合  在概率论中,集合论的应用是极为重要的,许多问题的处理都需要集合运算。下面首先引进集合相关的记号与术语。  将一些研究对象放在一起,形成集合,而这些对象就称为集合的元素。若\(x\)是......
  • 史上最全知识图谱建模实践(上):本体结构与语义解耦
    在“无需复杂图谱术语,7个原则搞定Schema建模”一文中,我们总结了知识建模最佳实践的7个指导原则。本文中,我们将分基础篇、进阶篇,针对不同业务场景的建模需求,由浅及深讲解基于SPG的知识建模的方法和案例,并涉及术语的解释。本文档所提出的建模方案,已经在OpenSPG做了对应的能力支持实现......
  • 数学建模入门笔记(2) 聚类分析
    聚类分析​ 聚类分析(ClusterAnalysis):又称群分析,对多个样本/指标定量分类的多元分析方法,是无监督学习1聚类分析的分类​Q型聚类(QualitativeClustering):也称硬聚类,一般用于将样本聚类,每一簇之间无交集,用距离作为相似性度量,包括K-Means聚类、层次聚类、DBSCAN聚类等​ R......
  • Maya 2024:塑造未来的专业3D建模大师 mac/win版
    Maya2024是一款备受赞誉的专业3D建模软件,广泛应用于电影、游戏和设计等领域。作为Autodesk推出的最新版本,Maya2024在3D建模、动画和渲染方面有了许多创新和改进,为用户提供了更强大、更灵活的工具集。→→↓↓载Maya2024mac+winMaya2024的建模工具集非常丰富,包括多边形建模......
  • 阿里序列建模论文DIEN
    背景DIEN通过引入GRU结构来建模用户的兴趣进化趋势 方法整体结构DIEN和常用模型的差异点在序列建模的部分,该部分结构由兴趣提取层和兴趣进化层两个部分组成:兴趣提取层:从用户的行为序列中提取用户的兴趣序列兴趣进化层:建模和targetitem相关的兴趣进化过程 兴趣提取......
  • 《数学分析习题课讲义2.1-2.2》
    ......
  • 【数学】博弈论初步
    平等博弈问题的基本模型:一个状态DAG上的移动。解决博弈论的重要方法:打表。博弈论问题一般有一些方向:观察先手怎么做,后手怎么做。一般是一些显然的贪心策略。结合SG函数。结合已有模型。FergusonGame两堆石子,每次可以清空一堆,拆另一堆为两堆,无法操作者输。分......
  • 斜45度瓦片地图(Staggered Tiled Map)里的简单数学
    转载至:ShuaiYUAN斜45度瓦片地图(StaggeredTiledMap)里的简单数学前段时间在做游戏的地图编辑功能,我们是在一个斜45度视角的场景上,对地图上的建筑或装饰物进行添加、移动、移除等基本操作,而且位置的改变是以网格作为最小操作单位的。本渣是用StaggeredTiledMap实现的,与垂直视......
  • P4588 [TJOI2018] 数学计算
    题目描述小豆现在有一个数x,初始值为1。小豆有Q次操作,操作有两种类型:1m:将x变为×*m,并输出xmodM。2pos:将x变为x除以第pos次操作所乘的数(保证第pos次操作一定为类型1,对于每一个类型1的操作至多会被除一次),并输出xmodM。输入格式一共有t组输入。对于每一......
  • 《算法引论》第二章(数学归纳法)
    第二章总结2.1原始的数学归纳法可以变形为各种形式,核心是有几个知道的n比较小的值或者性质+有一些从前向后的推断方式,然后推出一系列东西。比较常见的变形有强归纳法、间隔归纳法(n=1,2,..k时成立,n-k成立能推出n成立)、指数归纳法(n/k推n),等等。关键:根据我们掌握了什么决定使用什么......