博弈论 —— matlab

目录

1.简介

2.算法原理

3.实例分析

1.各参数初始化

2.计算期望与实际期望

3.博弈过程

4.绘图

 完整代码


1.简介

        博弈论又被称为对策论(Game Theory)既是现代数学的一个新分支,也是运筹学的一个重要学科。

        博弈论主要研究公式化了的激励结构间的相互作用。是研究具有斗争或竞争性质现象的数学理论和方法。 博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。生物学家使用博弈理论来理解和预测进化论的某些结果。

        博弈论已经成为经济学的标准分析工具之一。在生物学、经济学、国际关系、计算机科学、政治学、军事战略和其他很多学科都有广泛的应用。

        基本概念中包括局中人、行动、信息、策略、收益、均衡和结果等。其中局中人、策略和收益是最基本要素。局中人、行动和结果被统称为博弈规则。

        博弈论简单讲就是,A采取措施影响B的行为,B的行为影响A的决策,两者来回博弈,最终达到一个动态平衡。博弈论严格来讲只是一种解题方式。

2.算法原理

        以电动出租车与换电站为例,假设电动出租车及换电站均属于同一家公司,公司想通过换电站价格定价措施去控制目标区域内的出租车数量达到预期分布。

        对于司机而言,有两个成本,一个是距离成本d,一个是支付成本p,支付成本即是换电池所支付的电价,我们可以设立权重因子a将两者合并构建为一个效用函数,司机会选择该函数最小的换电站更换电池,更换电池后司机一般会在周围开始接单

        对于公司而言,目标函数则是不同地区的出租车实际分布e与期望分布E的绝对差之和,公司通过调整价格去影响司机的选择,从而调整司机在不同区域的分布

双层博弈论的模型分析

①第一阶段,充电站统计出各电动出租车的换电请求后,根据优化目标,制定价格策略

②第二阶段,电动出租车根据自身效用函数从所有换电站中选择出目标换电站进行跟换电池

③第一阶段和第二阶段交替往复进行,直到达到均衡

算法设计步骤

博弈论 —— matlab_第1张图片

3.实例分析

1.各参数初始化

n=900;%换电需求数
min_price=170;%换电价格范围
max_price=230;
A=normrnd(36,5,1,25);%初始期望,平均值为36,方差为5的高斯分布
E=fix(A); %朝0方向取整,如,4.1,4.5,4.8取整都是4
%下面是根据需求数调整E的大小
a=sum(E)-n;
A=A-a/25;
E=fix(A);
b=sum(E)-n;
A=A-b/25;
E=fix(A);
a1=0.05;a2=0.95;%距离成本与换点价格权重
x=rand(n,1).*20000;%初始化需求车辆位置
y=rand(n,1).*20000;
H=[2,2;2,6;2,10;2,14;2,18%初始化换电站位置
6,2;6,6;6,10;6,14;6,18
10,2;10,6;10,10;10,14;10,18
14,2;14,6;14,10;14,14;14,18
18,2;18,6;18,10;18,14;18,18].*1000;
%绘制初始化的司机与换电站的位置图
figure
plot(x,y,'r*')
hold on
plot(H(:,1),H(:,2),'bo')
legend('司机','换电站')
title('初始位置图')

返回:

博弈论 —— matlab_第2张图片

2.计算期望与实际期望

%% 计算期望与实际期望
D=[];%需求车辆到各换电站的需求比例
price=200.*ones(1,25);
for i=1:length(H)
    for j=1:length(x)
            D(i,j)=a1*sqrt((H(i,1)-x(j))^2+(H(i,2)-y(j))^2)+a2*price(i);%总费用
    end
end
[d1,d2]=min(D);%选择最近距离换电站
C=tabulate(d2(:));%统计选择换电站次数
e=C(:,2);
err=sum(abs(E-e')) %期望差之和,即博弈对象

返回:因为随机,所有每次结过可能不一样

博弈论 —— matlab_第3张图片

3.博弈过程

%% 博弈
J=[]; %价格变化的差值
ER(1)=err;
for k=2:100
    j=0;
    for i=1:25
        if e(i)=min_price
            price(i)=price(i)-1;
            j=j+1;
        end
        if e(i)>E(i) && price(i)<=max_price
            price(i)=price(i)+1;
            j=j+1;
        end
    end
    J=[J,j];
    DD=[];
    for i=1:length(H)
        for j=1:length(x)
            DD(i,j)=a1*sqrt((H(i,1)-x(j))^2+(H(i,2)-y(j))^2)+a2*price(i);
        end
    end
    [dd1,dd2]=min(DD);
    CC=tabulate(dd2(:));
    e=CC(:,2);
    err=sum(abs(E-e'));
    ER=[ER,err];
end

4.绘图

% 绘图
figure
plot(ER,'-o')
title('E-e的差值变化')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32])
legend('E-e')

figure
plot(J,'r-o')
title('价格的差值变化')
xlabel('Iterations(t)')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32])
legend('sum of Price(t)-Price(t-1)')

figure
bar(price,0.5)
hold on
plot([0,26],[min_price,min_price],'g--')
plot([0,26],[max_price,max_price],'r--')
title('换电站的换电价格')
ylabel('Price(¥)')
axis([0,26,0,300])
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32]);

figure
h=bar([e,E'],'gr');
set(h(1),'FaceColor','g'); set(h(2),'FaceColor','r');
axis([0,26,0,50])
title('出租车的预期和实际数量')
ylabel('E and e')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32]);
xlabel('换电站')
legend('e','E')

返回:

博弈论 —— matlab_第4张图片

博弈论 —— matlab_第5张图片

博弈论 —— matlab_第6张图片

博弈论 —— matlab_第7张图片

 完整代码

clear;clc;
setenv('BLAS_VERSION','') %进行错误修改
n=900;%换电需求数
min_price=170;%换电价格范围
max_price=230;
A=normrnd(36,5,1,25);%初始期望,平均值为36,方差为5的高斯分布
E=fix(A); %朝0方向取整,如,4.1,4.5,4.8取整都是4
%下面是根据需求数调整E的大小
a=sum(E)-n;
A=A-a/25;
E=fix(A);
b=sum(E)-n;
A=A-b/25;
E=fix(A);
a1=0.05;a2=0.95;%距离成本与换点价格权重
x=rand(n,1).*20000;%初始化需求车辆位置
y=rand(n,1).*20000;
H=[2,2;2,6;2,10;2,14;2,18%初始化换电站位置
6,2;6,6;6,10;6,14;6,18
10,2;10,6;10,10;10,14;10,18
14,2;14,6;14,10;14,14;14,18
18,2;18,6;18,10;18,14;18,18].*1000;
%绘制初始化的司机与换电站的位置图
figure
plot(x,y,'r*')
hold on
plot(H(:,1),H(:,2),'bo')
legend('司机','换电站')
title('初始位置图')

%% 计算期望与实际期望
D=[];%需求车辆到各换电站的需求比例
price=200.*ones(1,25);
for i=1:length(H)
    for j=1:length(x)
            D(i,j)=a1*sqrt((H(i,1)-x(j))^2+(H(i,2)-y(j))^2)+a2*price(i);%总费用
    end
end
[d1,d2]=min(D);%选择最近距离换电站
C=tabulate(d2(:));%统计选择换电站次数
e=C(:,2);
err=sum(abs(E-e')); %期望差之和,即博弈对象
% ER(1)=err

%% 博弈
J=[]; %价格变化的差值
ER(1)=err;
for k=2:100
    j=0;
    for i=1:25
        if e(i)=min_price
            price(i)=price(i)-1;
            j=j+1;
        end
        if e(i)>E(i) && price(i)<=max_price
            price(i)=price(i)+1;
            j=j+1;
        end
    end
    J=[J,j];
    DD=[];
    for i=1:length(H)
        for j=1:length(x)
            DD(i,j)=a1*sqrt((H(i,1)-x(j))^2+(H(i,2)-y(j))^2)+a2*price(i);
        end
    end
    [dd1,dd2]=min(DD);
    CC=tabulate(dd2(:));
    e=CC(:,2);
    err=sum(abs(E-e'));
    ER=[ER,err];
end
% 绘图
figure
plot(ER,'-o')
title('E-e的差值变化')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32])
legend('E-e')

figure
plot(J,'r-o')
title('价格的差值变化')
xlabel('Iterations(t)')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32])
legend('sum of Price(t)-Price(t-1)')

figure
bar(price,0.5)
hold on
plot([0,26],[min_price,min_price],'g--')
plot([0,26],[max_price,max_price],'r--')
title('换电站的换电价格')
ylabel('Price(¥)')
axis([0,26,0,300])
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32]);

figure
h=bar([e,E'],'gr');
set(h(1),'FaceColor','g'); set(h(2),'FaceColor','r');
axis([0,26,0,50])
title('出租车的预期和实际数量')
ylabel('E and e')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32]);
xlabel('换电站')
legend('e','E')

你可能感兴趣的:(数学建模,matlab,开发语言,几何学)