首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >囚犯困境v.3 - Petri困境

囚犯困境v.3 - Petri困境
EN

Code Golf用户
提问于 2017-05-23 00:22:31
回答 19查看 2.3K关注 0票数 17

一位疯狂的科学家刚刚发明了一种新的细菌!他在观察了它的行为后,决定将它命名为Noblus Gentlemanus。然而,他的细菌已经耗尽了食物,并宣战了,因为他们能够收获其他细菌的身体,以获得足够的食物来制造自己的副本。这种细菌有许多不同的亚种,他们在玩囚徒困境时有不同的策略,这是他们最喜欢的游戏。每个亚种有五种细菌。在囚徒困境中,两人同时选择缺陷或合作。如果一名玩家选择合作,另一名选择默认,违约者将获得2分,而合作伙伴将损失3分。如果双方都选择合作,双方都能得到1分。如果双方都选择默认,则双方都会损失1分。

作为高贵的绅士们,细菌们决定通过玩200轮反复的囚徒困境游戏来打这场战争。每一场决斗的失败者都会自杀,让胜利者克隆自己。如果出现这种情况,这两种细菌都将继续存活,但两者都无法克隆自己。此外,所有的细菌从一个火柴携带超过10%的积分到下一场比赛。一个克隆体携带着它所克隆的细菌的点。另外,每一个回合中有一个细菌变异成另一个亚种的几率是1/10,加分为0(如果我收到关于这个随机性的抱怨,我可以去除它)。在细菌进行了相当于细菌亚种数乘以十次的决斗之后,疯狂的科学家不小心把细菌所在的培养皿掉了下来,所有的细菌都获得了新的食物来源,结束了它们的决斗。这与一个普通的反复囚犯进退两难的竞赛不同,因为它涉及1v1决斗与携带积分,而不是简单地试图获得最大的积分。这对一个给定的策略的有效性有很大的影响。

每一种细菌将在其回合开始时收到输入的格式:(回合数,当前点,敌人点,你先前的移动在字符串中,使用字符“c”表示合作,使用字符“d”表示缺陷.,敌人先前的移动以同样的格式)。

以下是将要输入的四个示例策略。事实上,我认为叛逃者可能会赢,尽管这是非常简单的。

Tat for Tat

代码语言:javascript
运行
复制
def titfortatfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter==0 or enlist[counter-1] == "c":
        return "c"
    else:
        return "d"

RandomPick

代码语言:javascript
运行
复制
from random import choice
def randompickfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter == 199:
        return "d"
    else:
        return choice(["d", "c"])

余算子

代码语言:javascript
运行
复制
def cooperatorfunc(counter, mypoints, enpoints, mylist, enlist):
    return "c"

叛逃者

代码语言:javascript
运行
复制
def defectorfunc(counter, mypoints, enpoints, mylist, enlist):
    return "d"

所有提交必须以Python2.7函数的形式出现,名称是提交的名称,没有空格,结尾是func。如果有人想以另一种语言提交答案,请输入伪代码,以便我在编辑到您的答案时将其转换为Python,或者给我关于如何将您的语言与我的控制器接口的说明,这是从6月4日开始为所有提交文件设置的如下所示。

代码语言:javascript
运行
复制
from titfortat import titfortatfunc
from randompick import randompickfunc
from cooperator import cooperatorfunc
from defector import defectorfunc
from luckytitfortat import luckytitfortatfunc
from randomtitfortat import randomtitfortatfunc
from remorsefulaggressor import remorsefulaggressorfunc
from everyother import everyotherfunc
from niceguy import niceguyfunc
from titfortatbackstab import titfortatbackstabfunc
from gentleDefector import gentleDefectorfunc
from anticapitalist import anticapitalistfunc
from grimtrigger import grimtriggerfunc
from bizzaro import bizzarofunc
from neoanticapitalist import neoanticapitalistfunc
from bittertat import bittertatfunc
from teamer import teamerfunc
from copyfirst import copyfirstfunc
from exploitivetat import exploitativetatfunc
from defectorv2 import defectorv2func
from crazytat import crazytatfunc
from randomchoicev2 import randomchoicev2func
from twotitsforatat import twotitsforatatfunc
from threetitsforatat import threetitsforatatfunc
from fourtitsforatat import fourtitsforatatfunc
from fivetitsforatat import fivetitsforatatfunc
from sixtitsforatat import sixtitsforatatfunc
from tentitsforatat import tentitsforatatfunc
from theelephant import theelephantfunc
from xbittertat import xbittertatfunc
from fifteentitsforatat import fifteentitsfortatfunc
from twentytitsforatat import twentytitsforatatfunc
from fox import foxfunc
from onehundredfortysixtitsforatat import onehundredfourtysixtitsforatatfunc
from gameofthrones import gameofthronesfunc
from boy import boyfunc
from grimace import grimacefunc
from fiftytitsforatat import fiftytitsfortatfunc
from soreloser import soreloserfunc
from everyotherd import everyotherdfunc
from fiftythreetitsfortat import fiftythreetitsfortatfunc
from twentyfivetitsfortat import twentyfivetitsfortatfunc
from handshake import handshakefunc
from anty import antyfunc
from fiftyfourtitsforatat import fiftyfourtitsfortatfunc
from kindatitsfortat import kindatitsfortatfunc

import random

players = 38

rounds = players*10

def runcode(num, points1, points2, history1, history2, cell):
    ans = ""
    if cell == 0:
        ans = titfortatfunc(num, points1, points2, history1, history2)
    elif cell == 1:
        ans = randompickfunc(num, points1, points2, history1, history2)
    elif cell == 2:
        ans = cooperatorfunc(num, points1, points2, history1, history2)
    elif cell == 3:
        ans = defectorfunc(num, points1, points2, history1, history2)
    elif cell == 4:
        ans = luckytitfortatfunc(num, points1, points2, history1, history2)
    elif cell == 5:
        ans = randomtitfortatfunc(num, points1, points2, history1, history2)
    elif cell == 6:
        ans = remorsefulaggressorfunc(num, points1, points2, history1, history2)
    elif cell == 7:
        ans = everyotherfunc(num, points1, points2, history1, history2)
    elif cell == 8:
        ans = niceguyfunc(num, points1, points2, history1, history2)
    elif cell == 9:
        ans = titfortatbackstabfunc(num, points1, points2, history1, history2)
    elif cell == 10:
        ans = gentleDefectorfunc(num, points1, points2, history1, history2)
    elif cell == 11:
        ans = anticapitalistfunc(num, points1, points2, history1, history2)
    elif cell == 12:
        ans = grimtriggerfunc(num, points1, points2, history1, history2)
    elif cell == 13:
        ans = bizzarofunc(num, points1, points2, history1, history2)
    elif cell == 14:
        ans = neoanticapitalistfunc(num, points1, points2, history1, history2)
    elif cell == 15:
        ans = tentitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 16:
        ans = bittertatfunc(num, points1, points2, history1, history2)
    elif cell == 17:
        ans = copyfirstfunc(num, points1, points2, history1, history2)
    elif cell == 18:
        ans = exploitativetatfunc(num, points1, points2, history1, history2)
    elif cell == 19:
        ans = sixtitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 20:
        ans = fifteentitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 21:
        ans = fivetitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 22:
        ans = twentytitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 23:
        ans = threetitsforatatfunc(num, points1, points2, history1, history2)
    elif cell == 24:
        ans = fiftyfourtitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 25:
        ans = theelephantfunc(num, points1, points2, history1, history2)
    elif cell == 26:
        ans = xbittertatfunc(num, points1, points2, history1, history2)
    elif cell == 27:
        ans = foxfunc(num, points1, points2, history1, history2)
    elif cell == 28:
        ans = gameofthronesfunc(num, points1, points2, history1, history2)
    elif cell == 29:
        ans = boyfunc(num, points1, points2, history1, history2)
    elif cell == 30:
        ans = grimacefunc(num, points1, points2, history1, history2)
    elif cell == 31:
        ans = soreloserfunc(num, points1, points2, history1, history2)
    elif cell == 32:
        ans = everyotherdfunc(num, points1, points2, history1, history2)
    elif cell == 33:
        ans = twentyfivetitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 34:
        ans = fiftythreetitsfortatfunc(num, points1, points2, history1, history2)
    elif cell == 35:
        ans = handshakefunc(num, points1, points2, history1, history2)
    elif cell == 36:
        ans = antyfunc(num, points1, points2, history1, history2)
    elif cell == 37:
        ans = kindatitsfortatfunc(num, points1, points2, history1, history2)


    return ans

def fight(l1,l2):
    num1,num2=l1[0],l2[0]
    points1,points2=l1[1],l2[1]
    history1 = ""
    history2 = ""

    for num in range(200):
        p1 = runcode(num, points1, points2, history1, history2, num1)
        p2 = runcode(num, points2, points1, history2, history1, num2)

        history1+=p1
        history2+=p2

        if p1 == "c" and p2 == "c":
            points1 += 1
            points2 += 1
        elif p1 == "c" and p2 == "d":
            points1 -= 3
            points2 += 2
        elif p1 == "d" and p2 == "c":
            points1 += 2
            points2 -= 3
        elif p1 == "d" and p2 == "d":
            points1 -= 1
            points2 -= 1

    if points1 > points2:
        return [l1[0], points1/10], [l1[0], points1/10]
    elif points1 < points2:
        return [l2[0], points2/10], [l2[0], points2/10]
    else:
        return [l1[0], points1/10], [l2[0], points2/10]

def rounddoer(bots):
    bots2=[]
    for x in range(len(bots)):
        if x%2==0:
            out1, out2 = fight(bots[x], bots[x-1])
            bots2.append(out1)
            bots2.append(out2)

    return bots2

def gamedoer():

    bots=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,0],[11,0],[12,0],[13,0],[14,0],[15,0],[16,0],[17,0],[18,0],[19,0],[20,0],[21,0],[22,0],[23,0],[24,0],[25,0],[26,0],[27,0],[28,0],[29,0],[30,0],[31,0],[32,0],[33,0],[34,0],[35,0],[36,0],[37,0]]
    random.shuffle(bots)
    counter=0

    while counter < rounds:

        counter += 1
        bots = rounddoer(bots)

        if random.randint(0,10) == 9:
            bots[random.randint(0, players*5)-1] = [random.randint(0, players-1), 0]

        random.shuffle(bots)

##        for item in bots:
##            print str(item[0]) + " with " + str(item[1]) + " bonus points."

    return bots

a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,mycounter=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

while mycounter < 1000:
    mycounter += 1
    bots = gamedoer()

    print "Game: " + str(mycounter)

    for item in bots:
        if item[0]==0:
            a0 += 1
        if item[0]==1:
            a1 += 1
        if item[0]==2:
            a2 += 1
        if item[0]==3:
            a3 += 1
        if item[0]==4:
            a4 += 1
        if item[0]==5:
            a5 += 1
        if item[0]==6:
            a6 += 1
        if item[0]==7:
            a7 += 1
        if item[0]==8:
            a8 += 1
        if item[0]==9:
            a9 += 1
        if item[0]==10:
            a10 += 1
        if item[0]==11:
            a11 += 1
        if item[0]==12:
            a12 += 1
        if item[0]==13:
            a13 += 1
        if item[0]==14:
            a14+=1
        if item[0]==15:
            a15+=1
        if item[0]==16:
            a16+=1
        if item[0]==17:
            a17+=1
        if item[0]==18:
            a18 += 1
        if item[0]==19:
            a19+=1
        if item[0]==20:
            a20+=1
        if item[0]==21:
            a21+=1
        if item[0]==22:
            a22+=1
        if item[0]==23:
            a23+=1
        if item[0]==24:
            a24+=1
        if item[0]==25:
            a25+=1
        if item[0]==26:
            a26+=1
        if item[0]==27:
            a27+=1
        if item[0]==28:
            a28+=1
        if item[0]==29:
            a29+=1
        if item[0]==30:
            a30+=1
        if item[0]==31:
            a31+=1
        if item[0]==32:
            a32+=1
        if item[0]==33:
            a33+=1
        if item[0]==34:

这场比赛现在结束了,

如果你想加入一个答案,我会看看我是否有时间增加一个挑战后的记分板下的原始选手。我将在测试程序完成后添加一个(可能还要2-3天)。

最终得分

代码语言:javascript
运行
复制
Tit for Tat: 18
Random Pick: 28
Cooperator: 19
Defector: 24
Lucky Tit for Tat: 23
Random Tit for Tat: 23
Remorseful Aggressor: 22
Every Other C: 23
Nice Guy: 18
Tit for Tat Backstab: 15
Gentle Defector: 22
Anticapitalist: 27
Grim Trigger: 19
Bizzaro: 21
NeoAnticapitalist: 24
Ten Tits for a Tat: 240
Bitter Tat: 12
Copy First: 30
Exploitative Tat: 19
Six Tits for a Tat: 16
Thirty Tits for Tat: 4129
Five Tits for a Tat: 22
Forty Tits for a Tat: 1972
Three Tits for a Tat: 22
Fifty Four Tits for a Tat: 25805
The Elephant: 31
Extra Bitter Tat: 28
Fox: 35
Game of Thrones: 11297
The Boy: 31
Grimace: 26
Sore Loser: 39
Every Other D: 18
Twenty Five Tits for a Tat: 2399
Fifty Three Tits for a Tat: 5487
Handshake: 28
Anty: 26
Kinda Tits for Tat: 20
Prudent Defector: 154539
Bizzarro Trigger: 25
Young Mathematician: 21
Older Mathematician: 16
Perfect Gentleman: 1953341

看来完美的绅士才是胜利者。恭喜Draco18,他绝对配得上他的绿色标记。

EN

回答 19

Code Golf用户

回答已采纳

发布于 2017-05-23 04:05:41

,完美的绅士

我对这个机器人没有很好的描述。我无意中发现了一些潜在的优化,对它们进行了测试,并对它们进行了微调,最后得到了一种彻底摧毁竞争的细菌。相反,我对代码本身进行了注释,以解释它所做的事情。

代码语言:javascript
运行
复制
import random
def perfectgentlemanfunc(num, i, d, c, en):
    if num>0 and i < 0 and d > 0 and -i%3 == 0 and d%2 == 0 and en[0] == "d":
        #probably very first iteration, probably facing a defector: feed it free points
        #    defector cannot be beaten by *any* bot unless that bot
        #    entered with a point lead. defector does some of our work for us
        if num >= 140:
            #140 threshold restricts how much we feed
            return "d"
        return "c"
    turn_to_betray = 130
    if num > turn_to_betray and en[turn_to_betray -2] == "c" and
     en[turn_to_betray -1] == "c" and en[turn_to_betray] == "d":
        #if self, then sacrifice the lower point bot to raise the points of the higher
        #(better net outcome than "c/c" cooperation)
        #    Handshake independently arrived at this same optimization
        if i == d:
            #max 50% probability of choosing different possible. May as well take it
            #    "ccd" has a 55% chance of choosing the same
            #    better outcomes for splitting early
            return "cd"[random.randint(0,1)]
        if i > d:
            return "d"
        return "c"
    #betray after betray point, or if behind by >200
    #performs 6 percentage points better than not having the condition
    if num >= turn_to_betray or i + 200 < d
        return "d"
    else:
        #be nice the first turn
        if num == 0:
            return "c";
        #finally, be tit-for-tat
        return en[-1]

几个值是任意选择与方案测试,这里的数值是接近最优在这一点。针对目前敌对派别的蔓延,完美的绅士获得了完全的优势(100%的细菌数量),大约90%的时间(正负3个百分点)。

我还没有在我的测试中加入数学家,然而,这两种方法应该只是为了满足现有的策略,而不是对结果有很大的改变。

它确实通过支持叛逃者来管理很大一部分控制权,但这是根据规则允许的(示例策略是针对目标的公平游戏)。它有一个副作用,也支持“权力的游戏”,但这是无意的,因为根据我选择的标准,这两个人是无法区分的。这些“叛逃者类型”然后在第二轮中有了一个点优势,并因此排除了几个麻烦的邻居( N-T4T类型),当他们重新面对完美的绅士时,他们已经使用了他们的点优势,并且很快被消耗掉。

有大约5%的机会,所有完美的绅士最终与叛逃者类型配对,在第一轮,并最终集体自杀。在这种情况下,其中一种n-T4t类型达到完全控制(196个细胞).很少有其他类型的(权力的游戏,男孩,鬼脸,痛楚的失败者.)设法不完全灭绝,并获得一两分。

目前的模拟(仍在进行中的200总游戏)。所有得分为0的条目被删除。看上去就像“权力的游戏”和54-T4T在PG被淘汰后分出一轮(195分)。

代码语言:javascript
运行
复制
Game: 90

Cooperator: 1
Remorseful Aggressor: 1
Copy First: 1
Six Tits for a Tat: 1
Thirty Tits for Tat: 393
Five Tits for a Tat: 1
Fifty Four Tits for a Tat: 538
Game of Thrones: 248
Perfect Gentleman: 16456 (93.2)%

##Simulation Terminated: Adding new bots

暗中刺杀针锋相对(饶恕)

这基本上是幸运的以牙还牙(也就是以牙还牙),这是“解决”的最佳解决方案(对于“幸运”的一些值),有一点扭曲。正如我们确切知道这场游戏会持续多少回合一样,这种细菌在最后一轮比赛中暗地里捅了一刀,从而确保了对任何其他以牙还牙和协营细菌的净受益结果(对自己来说,它以净零结束,就像它曾经合作过一样)。由于10%的结转,这将带来长期的优势.

代码语言:javascript
运行
复制
from random import randint
def titfortatbackstabfunc(num, i, d, c, enlist):
    if num == 199:
        return "d";
    lucky = randint(0, 200)
    if lucky == 0:
        return "c"
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

苦味

Tat

尖刻的针锋相对,是利用敌人的任何合作企图,当敌人在点上领先的时候。大多数细菌在200轮的比赛中至少提供一次橄榄枝,由于苦涩的针锋相对,它将挤奶这5点,绝望地争取恢复。

否则,它就会按照通常的主导策略迎头赶上。而且,它比它的表弟更像个混蛋,而且更早地背弃了一个回合,没有给予任何宽恕。

代码语言:javascript
运行
复制
def bittertatfunc(num, i, d, c, enlist):
    if i < d:
        return "d";
    if num >= 198:
        return "d";
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

苦涩的Tat是通过观察其他机器人对Tat for Tat的行为和这些结果中所表达的模式来设计的,但并不是为了明确地对抗这些策略:它仍然是一个通用的公式。

特苦Tat

代码语言:javascript
运行
复制
def xbittertatfunc(num, i, d, c, enlist):
    if i < d:
        return "d";
    if num >= 188:
        return "d";
    if num == 0 or enlist[-1] == "c":
        return "c"
    else:
        return "d"

更痛苦的是过早叛逃。

票数 8
EN

Code Golf用户

发布于 2017-05-23 12:52:33

Anticapitalist

又一个简单的。甚至连比赛(从同样的分数开始)的行为都与TitForTat很相似,但主要的想法是要在比赛中生存下来。

代码语言:javascript
运行
复制
def anticapitalistfunc(counter, mypoints, enpoints, mylist, enlist):
    if mypoints >= enpoints:
        return "c"
    else:
        return "d"

Gentle叛逃者

我在这里的想法是叛逃,除非我的敌人通常合作。但它开始合作了。

代码语言:javascript
运行
复制
def gentleDefectorfunc(counter, mypoints, enpoints, mylist, enlist):
    if enlist.count("d") * 4 > len(enlist):
        return "d"
    else:
        return "c"

NeoAnticapitalist

反错派的改进(至少我认为是这样)。我看不出有什么理由在最后一轮合作。当我确信我的对手不会合作的时候,我也看不出有什么理由合作。

代码语言:javascript
运行
复制
def neoanticapitalistfunc(counter, mypoints, enpoints, mylist, enlist):
    if mypoints >= enpoints:
        if counter > 1:
            if counter == 199 or (enlist[-1] != "c" and enlist[-2] != "c"):
                return "d"
        return "c"
    else:
        return "d"
票数 8
EN

Code Golf用户

发布于 2017-05-23 04:26:45

悔恨的侵略者

代码语言:javascript
运行
复制
from random import randint
def remorsefulaggressorfunc(counter, mypoints, enpoints, mylist, enlist):
    if counter == 0:
        return "d"
    if (counter > 195 and mylist[-1] == "d"):
        return "d"
    if ((counter == 1 or counter > 2) and enlist[-1] == "d"):
        return "d"
    if (counter == 2 and enlist[-1] == "d" and enlist[-2] == "d"):
        return "d"
    if (counter >= 195 and randint(0, 200 - counter) == 0):
        return "d"
    else:
        return "c"

这是为了“跟上”叛逃者,每一次背叛它,也是为了击败以牙还牙的战略。

我们的基本思想是从叛变开始,但如果对手配合1,那么我们就合作两次,以避免相互指责循环,从而避免太大的点球。(然而,如果对手后来有缺陷,我们不会打破我们自己的循环;我们会让他们这样做,结果很可能会输掉比赛。)在游戏结束时,我们会在最后5个回合中随机选择一个时间来背刺敌人,给我们比他们多一次叛逃,这意味着只要我们在积分上不落后太远,我们就会获胜,而不会在这个过程中牺牲太多。(将时间周期随机化意味着我们很可能首先使用反刺,而且这种策略不能通过提前一次回击来“调整”。)

票数 6
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/122118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档