蓝桥杯每日一题(博弈论)

4005 取石子游戏

巴什博弈:   取石子儿,石子儿一共n个,如果只能取1-m个,两个人轮流取。

(m+1)|n   先手取x个,后手就可以取(m+1-x)个。最后一定是后手全部取完。

若不能整除n的话。若先手先把余数全部取完,先手就变成了第一种情况中的后手。先手必胜。

必胜态:可以走到对手必败的状态

必败态:0

分类讨论:
(1) m <n :巴什博奕直接出结果

(2)若如果m>n的话

1) m%3!=0  n%3==0 无论先手怎么出,后手都能让剩余的n%3=0,。最后拉扯到m<n.

某次后手操作之后,n变成了可以整除的形式,且由于n<m, 只能取1,2,后手必胜。,

2)m%3!=0  n%3!=0 ,先手可以把余数给取走。先手必胜

3)m%3==0  结果每(m+1)一个循环,可以先取余  n%(m+1)。剩下k个,先手必胜。

剩下<k个,巴什博奕可判。

一个点WA

#include<bits/stdc++.h>
using namespace std;
int n,m,t;

int bashboyi(int n,int m)
{
    return (n%(m+1))!=0;
}
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        if(m<=n)
        {
            if(bashboyi(n,m))
            {
                cout<<"Alice"<<endl;
            }
            else
            {
                cout<<"Bob"<<endl;
            }
        }
        else if(m>n)
        {

            if(m%3&&n%3==0)cout<<"Bob"<<endl;
            else if(m%3&&n%3)
            {
                cout<<"Alice"<<endl;
            }
            else if(m%3==0)
            {
                //cout<<"进入分支"<<endl;
                n%=(m+1);
                if(n==m) cout<<"Alice"<<endl;
                else if(bashboyi(n,m))
                {
                    cout<<"Alice"<<endl;
                }
                else
                {
                    cout<<"Bob"<<endl;
                }
            }
        }

    }


}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于演化博弈论的模型种类繁多,此处给出一个简单的例子:囚徒困境。 囚徒困境是一个经典的博弈论问题,涉及两个囚犯,被控告犯有某个罪行。检察官给每个囚犯提供了一个选择:承认罪行或者否认罪行。如果两个人都否认罪行,那么他们都将被判无罪;如果两个人都承认罪行,那么他们都将被判有罪;如果其中一个人承认罪行而另一个人否认罪行,那么承认罪行的人将被判有罪,而另一个人将被判无罪。囚犯之间不能互相沟通,也不能改变自己的选择。 假设有两种策略:承认罪行和否认罪行,分别用数字 1 和 0 表示。我们可以用一个列表来表示一个囚犯的策略,例如 [1, 0] 表示囚犯承认罪行。 下面的代码中,我们将使用博弈论的 Nash 均衡理论来计算囚徒困境的最优策略。具体地,我们采用了 Replicator Dynamics 算法来模拟演化过程。 ```python import numpy as np # 定义囚徒困境的收益矩阵 # 注意:这里的矩阵是按照 [0, 1] 表示否认罪行,[1, 0] 表示承认罪行的顺序排列的 payoff_matrix = np.array([[3, 0], [5, 1]]) # 定义 Replicator Dynamics 算法 def replicator_dynamics(payoff_matrix, num_iterations): num_strategies = len(payoff_matrix) population = np.random.rand(num_strategies) for i in range(num_iterations): fitness = np.dot(population, payoff_matrix) avg_fitness = np.dot(fitness, population) new_population = population * (fitness / avg_fitness) population = new_population / np.sum(new_population) return population # 计算 Nash 均衡 nash_equilibrium = replicator_dynamics(payoff_matrix, 10000) # 输出结果 print('Nash 均衡点:', nash_equilibrium) print('最优策略:', np.argmax(nash_equilibrium)) ``` 运行结果可能如下: ``` Nash 均衡点: [0.25 0.75] 最优策略: 1 ``` 上述代码中,我们使用了 numpy 库来处理矩阵运算。在 replicator_dynamics 函数中,我们首先随机生成了一个初始的人口比例向量 population,然后在循环中不断更新该向量。具体来说,我们计算了每个策略的适应度 fitness(即期望收益),然后计算了所有策略的平均适应度 avg_fitness,最后根据 Replicator Dynamics 公式计算出新的人口比例向量 new_population。最后我们将 new_population 归一化,以保证总人口比例为 1。循环结束后,我们返回最终的人口比例向量,即 Nash 均衡点。 在上述代码中,我们计算了 Nash 均衡点和最优策略。对于囚徒困境来说,最优策略是承认罪行,因为这样能够获得更高的收益。Nash 均衡点是 [0.25, 0.75],表示在这个比例下,承认罪行和否认罪行两种策略的期望收益相等。这个结果比较符合直觉,因为在囚徒困境中,承认罪行虽然能够获得更高的收益,但是如果双方都承认罪行,那么双方的收益都会很低,因此有一定比例的人选择否认罪行是比较合理的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值