【博弈论】实验项目7-讨价还价

预习报告部分

一、实验目的:

通过计算机程序和数据分析来验证讨价还价博弈中折现因子对博弈的各方面影响

二、实验内容:

假设甲乙两同学正在对1000元奖金的分配进行讨价还价。双方互相不知道对方的折现因子(可以相同也可能不同),但都随机在[0.1,0.9]区间取值(取1位小数)。 然后双方开始进行讨价还价博弈,直到一方接受为止。由于双方的折现因子是不互知的,因此多阶段博弈得以进行,双方互相猜测对方的折现因子,并探查对方的“底线”。 当博弈结束后,两名同学各自给出自己对对方折现因子的猜测,并统计各自的得益结果。

三、实验原理:

讨价还价博弈体现了消耗战的一般特点

假设有两个人就如何分享10000元进行谈判,规则如下:首先由甲提出一个分割比例,乙可以选择接受或者拒绝;如果乙拒绝甲的方案,则他提出另一个方案,让甲选择接受与否。博弈按此规则不断循环进行,直至其中一方接受对方的方案,博弈宣告结束。被拒绝的方案对以后的博弈阶段没有影响。由于谈判费用和利息损失等,讨价还价每多进行一个阶段,博弈双方的利益就会有一定损失。因此,引入“折现因子δ”(0<δ<1),δ也被称为消耗系数,即博弈每多进行一个阶段,参与者所得利益需乘以δ。

四、实验工具:

开发软件:pycharm

开发语言:python

五、实验步骤:

a.编写计算机程序模拟上述实验过程,实验轮数尽可能多,以便能从实验数据中验证规律。

b.收集实验数据,绘制比较图表,并在屏幕上展示。

c.通过对博弈模型的计算,先得出理论上折现因子对博弈的各方面影响(对得益的影响,对双方策略选择的影响,对结果的影响等)。

d.通过对博弈数据的分析,再验证理论分析的正确性。

e.在实验报告中给出详细的分析过程和结论。

f.撰写设计说明书(包括程序的设计细节和操作说明等)写入实验报告。

g.将验证实验的详细运行效果截图,粘贴到实验报告中。

h.将验证实验的数据折线图,粘贴到实验报告中,用来证明理论分析的正确性。

i.注意:每位同学的实验内容和程序应当完全不同,若雷同则不能获得成绩。

实验报告部分

一、实验结果分析:

a.编写计算机程序模拟上述实验过程,实验轮数尽可能多,以便能从实验数据中验证规律。

import random
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Songti SC']


# 生成随机折扣因子的函数
def random_discount_factor():
    return round(random.uniform(0.1, 0.9), 1)


# BargainingGame 类,模拟博弈过程
class BargainingGame:
    def __init__(self):
        self.total_amount = 1000
        self.reset()

    def reset(self):
        # 初始化游戏状态
        self.discount_factor_a = random_discount_factor()
        self.discount_factor_b = random_discount_factor()
        self.guess_factor_a = random.uniform(0.1, 0.9)  # A的初始猜测,随机选择在0.1和0.9之间
        self.guess_factor_b = random.uniform(0.1, 0.9)  # B的初始猜测,随机选择在0.1和0.9之间
        self.guess_history_a = []  # 记录A的猜测历史
        self.guess_history_b = []  # 记录B的猜测历史

    def update_guess(self, turn):
        step_size = 0.05  # 较小的步长
        if turn == 'A':
            # A调整猜测以逼近B的折扣因子
            if self.guess_factor_a < self.discount_factor_b:
                self.guess_factor_a = round(min(self.guess_factor_a + step_size, self.discount_factor_b), 2)
            elif self.guess_factor_a > self.discount_factor_b:
                self.guess_factor_a = round(max(self.guess_factor_a - step_size, self.discount_factor_b), 2)
        else:
            # B调整猜测以逼近A的折扣因子
            if self.guess_factor_b < self.discount_factor_a:
                self.guess_factor_b = round(min(self.guess_factor_b + step_size, self.discount_factor_a), 2)
            elif self.guess_factor_b > self.discount_factor_a:
                self.guess_factor_b = round(max(self.guess_factor_b - step_size, self.discount_factor_a), 2)

    def play_game(self):
        turn = 'A'
        for _ in range(100):  # 使用较大的数字确保游戏能够自然结束
            self.update_guess(turn)

            self.guess_history_a.append(self.guess_factor_a)
            self.guess_history_b.append(self.guess_factor_b)

            # 检查是否收敛到真实的折扣因子
            if self.guess_factor_a == self.discount_factor_b and self.guess_factor_b == self.discount_factor_a:
                break  # 如果猜测匹配真实的折扣因子,则结束游戏

            turn = 'B' if turn == 'A' else 'A'

        return self.guess_history_a, self.guess_history_b


# 运行5轮游戏
for i in range(5):
    game = BargainingGame()
    guess_history_a, guess_history_b = game.play_game()

    # 输出猜测过程
    print(f"\n第{i + 1}轮模拟:")
    for round_num, (guess_a, guess_b) in enumerate(zip(guess_history_a, guess_history_b), 1):
        print(f"第{round_num}轮: A猜测 {guess_a}, B猜测 {guess_b}")

    # 绘制猜测历史
    plt.figure(i)
    plt.plot(guess_history_a, label='A的猜测')
    plt.plot(guess_history_b, label='B的猜测')
    plt.axhline(y=game.discount_factor_a, color='r', linestyle='--', label='真实折扣因子 A')
    plt.axhline(y=game.discount_factor_b, color='g', linestyle='--', label='真实折扣因子 B')
    plt.xlabel('轮数')
    plt.ylabel('猜测因子')
    plt.title(f'第{i + 1}轮模拟:A和B的猜测历史')
    plt.legend()
    plt.show()

程序分析见心得体会。

c.通过对博弈模型的计算,先得出理论上折现因子对博弈的各方面影响(对得益的影响,对双方策略选择的影响,对结果的影响等)。

d.通过对博弈数据的分析,再验证理论分析的正确性。

对c、d的回答:我认为我的模型并没有体现出以上博弈模型中折现因子的影响,(原因见总结),故只对该实验的背景进行计算和分析。

 

二、实验效果截图:

b.收集实验数据,绘制比较图表,并在屏幕上展示。

a和b猜测双方的结果如图所示:

博弈过程如下图:(共博弈五次,放出二次博弈的结果)

三、总结及心得体会:

1、程序设计:

显而易见的,我的程序并不算符合题意,且看起来实现简单。但实际上,这篇代码我修改了十八遍,并且在反复修改中,认为题目中有些矛盾的地方。

虽然可能是我对题意的理解不到位,读题后我对题目的理解为:

①甲和乙互猜测对方的折现因子,通过本次收益=下一轮对方的预期收益从而达到自身利益的最大化。

②若自己猜测对方的折现因子小于对方本人的折现因子,那么对方将不同意该策略。

③在博弈中,通过不断猜测对方的折现因子,从而达到自身利益的最大化。

但在实际的运行中,则遇到了好多问题。

(1).最明显的问题就是折现因子给的太大了。假设本次两个人有一千元,那么两个人下一轮加起来的钱就是从100到900,最少也得扣一百,加上两个人的折扣因子都随机,很难碰到两个人的折现因子都是0.8或者0.9这种损失最小的数。因此两个人很容易在计算得益时选择同意。

(2)第二个问题:实验轮数尽可能多。为了达成这个目的,我让两个人不猜对对方的折扣因子就不停止循环,结果是:陷入了(0.9,0.1)分配策略的无尽循环。

经过思考,原因如下:折现因子随机,又很大,假设乙随机到的折现因子是0.2,两个人下次总和就只剩200块钱了,而甲的折现因子很大,有0.8,那甲就不怕第三轮自己吃160的钱,毕竟160总比0强。所以无论甲是什么策略,乙都同意。

而我设计的程序思路是:当乙不同意时,甲就改变自己猜测的数值,直至乙同意。但因为乙一直同意,甲就一直猜那个数,导致一直循环循环循环,进入了死循环。

(3)第三个问题:观察折现因子对两人选择的影响规律。这一点我也做不到,感觉这一点融合了以上两点的问题,达成了一种矛盾:

①要预测折现因子,那么得益只会越来越少越来越少,以至于两个人终于博弈完了,钱就剩一分了。

②要博弈得益,那么回合基本就在第一个回合第二个回合结束了,因为再往后无论是0.9还是0.1都非常亏,这就导致折现因子还没猜出来,博弈就结束了。“猜折现因子”不如“得到一个好折现因子”来得更实际。

综上,应该是我的个人原因,而且我博弈论学得不算好思路没有打开,所以没能完美通过命题设计代码。只设计出了“双方判断对方的折现因子”这种逻辑简单的代码。

2.程序最初设计思路:

(1)假设a、b两同学正在对1000元奖金的分配进行讨价还价。双方互相不知道对方的折现因子(可以相同也可能不同),但都随机在[0.1,0.9]区间取值(取1位小数)。 然后双方开始进行讨价还价博弈,直到一方接受为止。由于双方的折现因子是不互知的,因此多阶段博弈得以进行,双方互相猜测对方的折现因子,并探查对方的“底线”。 当博弈结束后,两名同学各自给出自己对对方折现因子的猜测,并统计各自的得益结果。

a,b两人依次提出分配策略,假设a的策略为s1,他的折现因子为x1,b的策略为s2,她的折现因子为x2。那么他提出的策略即“s1,1000-s1”,其中1000-s1=x1(1000)。若b不同意,说明她的折现因子比b更大。故a将自己猜测的折现因子加0.1。再反过来b同理,两个人相互猜测,直到都猜对彼此的折现因子为止。

两个人分别将博弈持续至1回合、2回合、3回合、4回合各自收益的折线图,两个人用不同颜色的线表示。

(2)a、b根据自己的猜测提出分配策略。如果对方不接受,他们会将自己对对方折现因子的猜测增加0.1,直到猜对为止。而且参与者双方应该还存在一种关系:当a猜测b的折现因子偏大时,b则会得知a的折现因子偏小,故a不同意分配,此时a将猜测的折现因子缩小0.1。因此只有两人都成功猜测到对方的折现因子,博弈才能结束。

(3)如果一方的提议被拒绝,那么这一方在下一轮中会增加其猜测的折现因子(如果是A方则增加,如果是B方则减少)。如果提议被接受,那么另一方会调整其猜测的折现因子(反向调整)。

(4)

设置阈值为5,当双方猜测值连续5次保持不变时该轮次终止。

但b不知道咋回事,每次都赋值成一个很长的小数,导致a总是猜不对b的折扣因子。添加新机制:当a或b玩家的猜测值接近于对方的真实折扣因子时,直接将猜测值设置为真实值。

(5)

改进猜测更新策略:确保猜测值总是朝着真实值的方向移动。

优化终止条件:当猜测值达到或非常接近真实值时,游戏应该停止。

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值