数学建模

1.启发式算法

它主要包括禁忌搜索,模拟退火,遗传算法,神经网络,蚁群算法

模拟退火算法

流程图

Metropolis准则:对于目标函数E,若,则接收E_{i+1},否则依概率接受。
模拟退火与物理退火的对应关系:

解--粒子状态
目标函数--能量
最优解--能量最低态
设定初温--加热过程
扰动--热涨落
Metropolis采样--热平衡
控制参数的下降--冷却

关于初始解:初始解不宜太好,否则很难从邻域跳出,并且邻域要尽可能小。

降温方式:
1.经典模拟退火:
2.快速模拟退火:
3.其他:

花费函数COST:
1.一般直接用目标函数构造,或目标函数的倒数/相反数。
2.终止条件:理论上温度要降为0时才终止退火算法,但实际温度较低时接受的概率就接近0了。

旅行商问题(TSP)

有一个商人要拜访n个城市,表示两城市间的距离,为0,1变量,表示拜访路径是否包含
限制:每个城市必须且只能拜访一次,且最后要回到原来的城市,即出度与入度都为1。
目标:路径之和最小,即:

解:
1.设置初始解S0
[1,...,i,..,j...,n,1]
2.产生邻解S1
[1,...,j...,i,...,n,1]//将i与j位置互换
3.定义COST函数

4.设置温度,降温

计算各个城市两两之间距离的函数:

function dis = distancematrix(city)
% DISTANCEMATRIX
% dis = DISTANCEMATRIX(city) return the distance matrix, dis(i,j) is the 
% distance between city_i and city_j

numberofcities = length(city);
R = 6378.137; % The radius of the Earth
for i = 1:numberofcities
    for j = i+1:numberofcities
        dis(i,j) = distance(city(i).lat, city(i).long, ...
                            city(j).lat, city(j).long, R);
        dis(j,i) = dis(i,j);
    end
end

制造扰动的函数:

function route = perturb(route_old, method)
% PERTURB
% route = PERTURB(route_old, method) generate randomly a neighbouring route by
% perturb old route. perturb methods:
%                        ___________            ___________         
%     1. reverse:   [1 2 3 4 5 6 7 8 9] -> [1 2 8 7 6 5 4 3 9]
%                        _         _            _         _
%     2. swap:      [1 2 3 4 5 6 7 8 9] -> [1 2 8 4 5 6 7 3 9]

route = route_old;
numbercities = length(route);
city1 = ceil(numbercities*rand);
city2 = ceil(numbercities*rand);
switch method
    case 'reverse'
        citymin = min(city1,city2);
        citymax = max(city1,city2);
        route(citymin:citymax) = route(citymax:-1:citymin);
    case 'swap'
        route([city1, city2]) = route([city2, city1]);
end

计算总距离的函数:

function d = totaldistance(route, dis)
% TOTALDISTANCE
% d = TOTALDISTANCE(route, dis) calculate total distance of a route with
% the distance matrix dis.

d = dis(route(end),route(1)); % closed path
for k = 1:length(route)-1
    i = route(k);
    j = route(k+1);
    d = d + dis(i,j);
end

main主函数

clear;clc;

load china; % geographic information
plotcities(province, border, city); % draw the map of China

numberofcities = length(city);      % number of cities
% distance matrix: dis(i,j) is the distance between city i and j.
dis = distancematrix(city);   


temperature = 1000;                 % Initialize the temperature.
cooling_rate = 0.94;                % cooling rate
iterations = 1;                     % Initialize the iteration number.

% Initialize random number generator with "seed". 
rand('seed',0);                    

% Initialize the route by generate a sequence of random
route = randperm(numberofcities);
% This is objective function, the total distance for the routes.
previous_distance = totaldistance(route,dis);

% This is a flag used to cool the current temperature after 100 iterations
temperature_iterations = 1;
% This is a flag used to plot the current route after 200 iterations
plot_iterations = 1;

% plot the current route
plotroute(city, route, previous_distance, temperature);

while 1.0 < temperature
    % generate randomly a neighbouring solution
    temp_route = perturb(route,'reverse');
    % compute total distance of the temp_route
    current_distance = totaldistance(temp_route, dis);
    % compute change of distance
    diff = current_distance - previous_distance;
    
    % Metropolis Algorithm
    if (diff < 0) || (rand < exp(-diff/(temperature)))
        route = temp_route;         %accept new route
        previous_distance = current_distance;
        
        % update iterations
        temperature_iterations = temperature_iterations + 1;
        plot_iterations = plot_iterations + 1;
        iterations = iterations + 1;
    end
    
    % reduce the temperature every 100 iterations
    if temperature_iterations >= 100
       temperature = cooling_rate*temperature;
       temperature_iterations = 0;
    end
    
    %  plot the current route every 200 iterations
    if plot_iterations >= 200
       plotroute(city, route, previous_distance,temperature);
       plot_iterations = 0;
    end
end

% plot the final solution
plotroute(city, route, previous_distance,temperature);

遗传算法

遗传算法的流程:
初始阶段:
随机生成一组可行解,也就是第一代染色体。
采用适应度函数计算每一条染色体的适应度,并根据适应度计算每一条染色体在下一代被选中的概率。
进化过程:
通过交叉生成N-M条染色体
对交叉后的染色体进行变异
最后选出这M条染色体,完成这次进化并进行下一次进化。

基因:染色体上的一个单元,解中的一个参数
染色体:由一组基因构成,问题可能的一个解
种群:由一系列染色体组成的一个集合
伪代码:

set initial generation k=0//初代为0
probability of mutation = alpha//变异概率为 $\alpha$
probability of performing crossover = beta//杂交概率
construct a population of n individuals Pk//设置一个含有n个个体的种群
while not termination do
  evalute:compute fitness(i) for each individuals in Pk//评价函数,得到每一个个体的适应度
  select:select m of Pk into Pk+1//选择函数,挑出m个到下一代当中  
  crossover:add alpha*m into Pk+1//杂交
  mutate:add beta*m into Pk+1//变异
  k=k+1
end while
return the fittest individual from P_last//返回一个最优秀的个体
如何对解进行编码

编码方法有二进制编码,格雷编码,实数编码,符号编码
编码的方法取决于变异杂交等等。

适应度函数

一般由目标函数直接或间接改造得到,且一般是非负的

选择

轮盘赌(比例选择):
两两竞争:
从父代中随机选择两个个体,比较适应值,保留优秀个体,淘汰较差个体。
排序选择:
根据个体适应度大小进行排序,然后根据序号进行选择。

杂交

有单点交叉和两点交叉,根据交叉点互换部分基因。

变异

分为单点变异和换位变异

TSP问题的遗传算法求解

对问题进行编码:
[1,...,i...j...,n,1]
构造适应度函数:
由于距离越短越好,所以构造适应度函数为目标函数的倒数。

选择运算:
两两竞争、轮盘赌


2.元胞自动机

元胞分布于一维线性网格上,且元胞仅具有占和空两种状态,一个元胞的状态由两个邻居决定(某种规则,总共8种状态)。
对于二维的元胞,则其相当于生命游戏,元胞状态由周围八个邻居决定。
将元胞自动机抽象为数学:
A=(L,d,S,N,f)

L:元胞网格空间
d:元胞空间的维数
S:有限离散的状态集合
N:某邻域内所有元胞的集合
f:局部映射或局部规划

常用的二维网格:正方形网格,六边形网格,三角形网格。
对于边界条件:邻居周围是边界,一般有定值型、周期型、反射型、吸收型。
规则:实际上是一种状态转移函数,类型为总和型与合法型。

交通问题

总路程:L
车距:d
车长:l
车的数目:N
满足
其中
流量方程:单位时间内通过某路段的车辆数
对于一段长x的路段,通过求导,有如下方程:
,即流量对x的导数加上密度对t的导数和等于0,
又,所以方程变为:
速度函数:

3.预测与评价

评价问题

(1)加权平均

(2)层次分析

一般来讲分为三个层:目标层、准则层、备选层。
准则可以分为:C1颜值、C2身材....,然后将各个准则两两比较,相对于的重要程度,。
将所有的因素两两比较,可以得到一个判断矩阵A,对角线上的元素都为1。若比较结果前后完全一致。
一致性检验:,,n为判断矩阵的维数,为最大特征值,RI(n)的取值可以查表获得。
一致性检验程序:

>> A=[1/1 2/1 5/1 3/1
1/2 1/1 3/1 1/2
1/5 1/3 1/1 1/4
1/3 2/1 4/1 1/1];
>> [V,D]=eig(A);%计算特征向量V与特征值D
>> [lamda,i]=max(diag(D))
>> CI=(lamda-4)/(4-1);
>> CR=CI/0.9

层次单排序,可以求出权重w:

>> W=V(:,i);
>> w=W/sum(W)

w =

    0.4816
    0.1864
    0.0713
    0.2608

对于层次的总排序:
得到的P即为最终的评分

function ahpactor

A = [1/1  2/1  5/1  3/1 
     1/2  1/1  3/1  1/2 
     1/5  1/3  1/1  1/4
     1/3  2/1  4/1  1/1];
[w, CR] = AHP(A);

% face
A1 = [1/1  1/2  3/1
      2/1  1/1  5/1
      1/3  1/5  1/1];
[w1, CR1] = AHP(A1);

% body
A2 = [1/1  1/3  2/1
      3/1  1/1  5/1
      1/2  1/5  1/1];
[w2, CR2] = AHP(A2);

% voice
A3 = [1/1  2/1  1/5
      1/2  1/1  1/7
      5/1  7/1  1/1];
[w3, CR3] = AHP(A3);

% acting
A4 = [1/1  2/1  1/3
      1/2  1/1  1/5
      3/1  5/1  1/1];
[w4, CR4] = AHP(A4);


CRs = [CR1 CR2 CR3 CR4]
P = [w1 w2 w3 w4] * w

 % ------------------------------------------------------------------------
 
function [w, CR] = AHP(A)
% n= [ 1    2    3    4    5    6    7    8    9
RI = [ 0.00 0.00 0.58 0.90 1.12 1.24 1.32 1.41 1.45];

n = size(A,1);
[V, D] = eig(A);

[lamda, i] = max(diag(D));
CI=(lamda-n)/(n-1);
CR = CI/RI(n);

W = V(:,i);
w = W/sum(W);

总结:
通过目标层与准则层两两比较,得到准则层的权重,再通过准则层与备选层两两比较,得到各项的加权权重。同样,如果有多层,也是这样层层分析。

模糊总和评价

模糊总和评价要素:因素集,评语集。
主要由权重以及投票(%)R来表示。投票是对每一个因素进行评语。
假设W是权重,R是投票情况,则模糊合成:,算出来n个值,n也为评语数目,第几个最大,就对应第几个评语。

预测问题

(1)拟合

多次线性拟合:polyfit/fit用法
具体内容见机器学习

(2)时间序列

时间序列:预测对象按照时间顺序排列而成的序列。
时间预测:根据时序过去的变化规律,推测今后趋势。
时间序列变化形式:

长期变动趋势
季节变动
循环变动
不规则变动

模型:

加法模型
乘法模型
混合模型

移动平均法:
即t+1时刻的值为前N个时刻的值的算术平均
类似还有一次指数平滑法、一次差分指数平滑法等等。

(2)灰色预测

不使用原始数据,使用生成数据,且不需要很多数据,只适用于中短期的预测,只适合指数增长的预测。
最常用GM(1,1)预测模型,表示一阶微分方程,且只含一个变量。
对于原始序列
可行性检验条件在范围内。如果不满足条件,可在原始序列上加上常数c组成新的原始序列。
一次累加生成序列,对于序列,
均值生成序列,在一次累加序列的基础上得到。
灰微分方程,,a与b是要求的两个参数。
白化微分方程:,若求出a与b,则可以得到序列与时间的关系式。

a与b的估计值最小二乘估计自行上网查找。然后白化微分方程求解,然后将模型还原,还原为1阶。
例子:

t0 = [1999:2003]';
X0 = [89, 99, 109, 120, 135]';
n = length(X0);
lambda = X0(1:n-1)./X0(2:n);
%range = minmax(lambda')
%exp([-2/(n+1), 2/(n+2)])
X1 = cumsum(X0);
Z1 = (X1(1:n-1)+X1(2:n))/2
B = [-Z1, ones(n-1,1)];
Y = X0(2:n);
u = B\Y; a = u(1); b = u(2);
k = 0:n+4;
xhat1 = (X0(1) - b/a).*exp(-a*k) + b/a;%代入公式
xhat0 = [X0(1) diff(xhat1)]%还原
plot(t0,X0,'o',t0(1)+k, xhat0,'-+')

图论模型与算法

图的构成:顶点集V(G),边集E(G),关联函数,其为从边映射到节点的函数。环:端点重合为一点。连杆:端点不重合的边,重边:具有两个相同端点的边。
图分为有向图和无向图
对于有向图,我们把边改名为弧。
子图:原图去掉边或者节点得到的图。
完全图:图上任意两点都是有边相连的。
连通图:从图上的一点可以到任意一点。
图的表示方法:邻接矩阵、关联矩阵,如对于右向关联矩阵:表示边a与顶点v的关系,1表示头,-1表示尾,0表示无关系。邻接矩阵表示是否存在定点u到v的弧。
度:图G中与v关联的边数。对于有向图,度=入度+出度。
matlab的图论工具箱:

graphallshortestpaths 求图中所有顶点之间的最短距离
graphconnredcomp 找无(有)向图的(强/弱)连通分支
graphmaxflow 计算有向图中的最大流
graphshortestpaths 求指定两点间的最短路径
。。。

计算最短路的代码示例:

[a,b,c,d,e,f]=deal(1,2,3,4,5,6);
w=[0 2 3 0 0 0
2 0 6 5 3 0
3 6 0 0 1 0
0 5 0 0 1 2
0 3 1 1 0 4
0 0 0 2 4 0];
W=sparse(w);
[dist,path,pred]=graphshortestpath(W,a,f)

此外还有网络分析的工具箱,求一些关于度的算法。

排队论

排队论的基本构成:
输入过程:顾客总体(有限or无限),到达的类型(单个or成批),到达时间间隔。
排队规则:顾客按怎样的规定次序接受服务。有等待制、损失制、闭合制。
服务机构:服务台的数量、服务时间服从的分布。

排队论的数量指标:
队长:系统中的平均顾客数
等待对长:系统中处于等待的顾客数量
等待时间:系统中包括顾客的平均逗留时间。
忙期:连续保持服务的时常

关于排队论中的符号表示:
A/B/C/n
A输入过程 B服务时间 C服务台数 n系统容量

一个实例

输入过程服从Poisson流
服务时间服从负指数分布
系统有S个服务台平行服务
系统容量为无穷大的等待排队系统
当S=1,即单服务台
输入:
,[0,t]时间内平均到达顾客数为
服务时间:
每个顾客接受服务的时间1服从参数为的负指数分布。,每个顾客的平均服务时间为
系统服务强度:
无顾客的概率:

有n个顾客的概率:

平均队长:
平均逗留时间:
平均等待时间:
对于S>0的情况:
服务能力和强度分别为与,其他的公式直接查找参考文献使用即可。
对于单服务台:
服务时刻(i)=max{到达时刻(i),离开时刻(i-1)}
离开时刻(i)=服务时刻(i)+服务时长(i)
等待时长(i)=离开时刻(i)-到达时刻(i)
对于多个服务台也有近似情况。

你可能感兴趣的:(数学建模)