社会及经济的发展带来了人与人之间或团体之间的竞争及矛盾,应用科学的方法来 解决这样的问题开始于 17 世纪的科学家,如 C.,Huygens 和 W.,Leibnitz 等。现代对策论起源于 1944 年 J.,Von Neumann 和 O.,Morgenstern 的著作《Theory of Games and Economic Behavior》。
对策论亦称竞赛论或博弈论。是研究具有斗争或竞争性质现象的数学理论和方法。 一般认为,它既是现代数学的一个新分支,也是运筹学中的一个重要学科。对策论发展 的历史并不长,但由于它所研究的现象与人们的政治、经济、军事活动乃至一般的日常 生活等有着密切的联系,并且处理问题的方法又有明显特色。所以日益引起广泛的注意。
深度学习的生成对抗网络的目标函数就是这个原理:二人零和博弈思想,用极大极小原理来判断某个对策是否有鞍点。
在日常生活中,经常看到一些具有相互之间斗争或竞争性质的行为。具有竞争或对抗性质的行为称为对策行为。在这类行为中。参加斗争或竞争的各方各自具有不同的目标和利益。为了达到各自的目标和利益,各方必须考虑对手的各种可能的行动方案,并力图选取对自己最为有利或最为合理的方案。对策论就是研究对策行为中斗争各方是否 存在着最合理的行动方案,以及如何找到这个合理的行动方案的数学理论和方法。
目录
1 引言
2 对策问题 例题1 囚徒的困境
2.1 对策的基本要素 (i)局中人 (ii)策略集(iii) 赢得函数(支付函数)
2.2 零和对策(矩阵对策) 例题2
什么是鞍点 最优纯策略
极大极小原理-----判断某个对策是否有鞍点 对策问题的多个解之间的关系(两条性质)
3 零和对策的混合策略
3.1 零和对策的混合策略 3.2 混合策略对策问题的鞍点 例题3
3.3 关于对策解集性质的主要结果的三个定理
4 零和对策的线性规划解法 例题4
5 二人非常数和对策
5.1 常数和对策 5.2 纯策略问题 ---分析囚徒困境
5.3 双矩阵对策 5.4 Nash平衡点 / 纳什均衡
5.5 混合对策问题
(1) 混合对策问题的基本概念:赢得值 (2)混合对策问题的求解方法 例题5 习题
对策问题的特征是参与者为利益相互冲突的各方,其结局不取决于其中任意一方的努力而是各方所采取的策略的综合结果。 先考察一个实际例子。
警察同时逮捕了两人并分开关押,逮捕的原因是他们持有大量伪币,警方怀疑他们伪造钱币,但没有找到充分证据,希望他们能自己供认,这两个 人都知道:如果他们双方都不供认,将被以持有大量伪币罪被各判刑 18 个月;如果双 方都供认伪造了钱币,将各被判刑 3 年;如果一方供认另一方不供认,则供认方将被从 宽处理而免刑,但另一方面将被判刑 7 年。将嫌疑犯 A、B 被判刑的几种可能情况列于表 1。
表 1 中每对数字表示嫌疑犯 A、B 被判刑的年数。如果两名疑犯均担心对方供认并希 望受到最轻的惩罚,最保险的办法自然是承认制造了伪币。 从这一简单实例中可以看出对策现象中包含有的几个基本要素。
本节我们只讨论有两名局中人的对策问题,其结果可以推广到一般的对策模型中 去。
零和对策是一类特殊的对策问题。在这类对策中,只有两名局中人,每个局中人都 只有有限个策略可供选择。在任一纯局势下,两个局中人的赢得之和总是等于零,即双 方的利益是激烈对抗的。
给定一个对策G ,如何判断它是否具有鞍点呢?为了回答这一问题,先引入下面 的极大极小原理。
上述定理给出了对策问题有稳定解(简称为解)的充要条件。
当对策问题有解时, 其解可以不唯一,当解不唯一时,解之间的关系具有下面两条性质:
具有稳定解的零和问题是一类特别简单的对策问题,它所对应的赢得矩阵存在鞍 点,任一局中人都不可能通过自己单方面的努力来改进结果。然而,在实际遇到的零和对策中更典型的是 μ + ν ≠ 0 的情况。由于赢得矩阵中不存在鞍点,此时在只使用纯策略的范围内,对策问题无解。
使用纯策略的对策问题(具有稳定解的对策问题)可以看成使用混合策略的对策问 题的特殊情况,相当于以概率 1 选取其中某一策略,以概率 0 选取其余策略。
编写程序如下:
clear
a=[1/3,1/2,-1/3;-2/5,1/5,-1/2;1/2,-3/5,1/3];b=10;
a=a+b*ones(3); %把赢得矩阵的每个元素变成大于0的数
[x0,u]=linprog(ones(3,1),-a',-ones(3,1),[],[],zeros(3,1));
x=x0/u,u=1/u-b
[y0,v]=linprog(-ones(3,1),a,ones(3,1),[],[],zeros(3,1));
y=y0/(-v),v=1/(-v)-b
下面我们使用式(2)和(3),利用 LINGO 编程求例 4 的解。LINGO 程序如下:
model:
sets:
player1/1..3/:x;
player2/1..3/:y;
game(player1,player2):c;
endsets
data:
ctrl=?; !ctrl取1求局中人1的策略,ctrl取0求局中人2的策略;
c=0.3333333 0.5 -0.3333333
-0.4 0.2 -0.5
0.5 -0.6 0.3333333;
enddata
max=u*ctrl-v*(1-ctrl);
@free(u);@free(v);
@for(player2(j):@sum(player1(i):c(i,j)*x(i))>u);
@for(player1(i):@sum(player2(j):c(i,j)*y(j))
由定理4知,混合对策问题的求解问题可以转化为求不等式约束的可行点,而 LINGO软件很容易做到这一点。我们编写如下Lingo程序求解上述问题。
model:
sets:
player1/1..3/:x;
player2/1..3/:y;
game(player1,player2):c;
endsets
data:
c=0.3333333 0.5 -0.3333333
-0.4 0.2 -0.5
0.5 -0.6 0.3333333;
enddata
@free(u);
u=@sum(game(i,j):c(i,j)*x(i)*y(j));
@for(player1(i):@sum(player2(j):c(i,j)*y(j))u);
@sum(player1:x)=1;
@sum(player2:y)=1;
end
所谓常数和对策是指局中人I和局中人II所赢得的值之和为一个常数。显然,二人零和对策是二人常数和对策的特例,即常数为零。 对于二人常数和对策,有纯策略对策和混合策略对策,其求解方法与二人零和对策是相同的。 二人非常数和对策也称为双矩阵对策。也有纯策略对策和混合策略对策两种策略。
例1给出了典型的二人非常数和对策,每人的赢得矩阵是不相同的,因此称为双矩阵对策。
问题分析: 这是一个二人非常数和对策问题。从表面上看,两犯罪嫌疑人拒不供认,只能被判18个月徒刑,结果是最好的。但仔细分析,却无法做到这一点。因为犯罪嫌疑人A如 果采用不供认策略,他可能被判刑的刑期为18个月或7年,而犯罪嫌疑人B 可能判的刑 期为0或18个月。而 A选择供认,他被判的刑期为0或3年,此时,犯罪嫌疑人B 可能判 的刑期为3年或7年。因此,犯罪嫌疑人 A一定选择供认。基于同样的道理,犯罪嫌疑 人B 也只能选择供认。 选择供认是他们最好的选择,各自被判3年。
如果不存在使式(4)成立的对策,则需要求混合对策。类似于二人零和对策情况, 需要给出混合对策的最优解。
对于混合对策问题有如下定理
由定义6可知,求解混合对策就是求非合作对策的平衡点,进一步由定理8得到, 求解非合作对策的平衡点,就是求解满足不等式约束(5)的可行点。因此,混合对策问题的求解问题就转化为求不等式约束(5)的可行点,而LINGO软件可以很容易做到 这一点。
有甲、乙两支游泳队举行包括三个项目的对抗赛。这两支游泳队各有一名健 将级运动员(甲队为李,乙队为王),在三个项目中成绩都很突出,但规则准许他们每 人只能参加两项比赛,每队的其他两名运动员可参加全部三项比赛。已知各运动员平时 成绩(秒)见表 3。
clc,clear
a=[59.7 63.2 57.1 58.6 61.4 64.8
67.2 68.4 63.2 61.5 64.7 66.5
74.1 75.5 70.3 72.6 73.4 76.9];
m=3;n=3;kk=3;T=1000;
sc1=[5:-2:1,zeros(1,3)]; %1-6 名的得分
sc2=repmat(sc1,kk,1);
for i=1:m
for j=1:n
b=a;
b(i,3)=T;b(j,4)=T; %不参加比赛,时间成绩取为充分大
[b,ind]=sort(b,2); %对 b 的每一行进行排序
for k=1:m
sc2(k,ind(k,:))=sc1; %计算得分
end
A_sc(i,j)=sum(sum(sc2(:,1:m))); %统计得分
B_sc(i,j)=sum(sum(sc2(:,m+1:end)));
end
end
A_sc,B_sc
fid=fopen('txt2.txt','w');
fprintf(fid,'%f\n',A_sc');
fwrite(fid,'~','char'); %往纯文本文件中写 LINGO 数据的分割符 fprintf(fid,'%f\n',B_sc');
fclose(fid);
按照定理8,求最优混合策略,就是求不等式约束(5)的可行解,写出相应的LINGO 程序如下:
model:
sets:
pa/1..3/:x;
pb/1..3/:y;
link(pa,pb):c1,c2;
endsets
data:
c1=@file(txt2.txt);
c2=@file(txt2.txt);
enddata
v1=@sum(link(i,j):c1(i,j)*x(i)*y(j));
v2=@sum(link(i,j):c2(i,j)*x(i)*y(j));
@for(pa(i):@sum(pb(j):c1(i,j)*y(j))