Steam平台while True: learn() 关卡Medx的python算法

引言

本文编写python程序,以模拟的思路,用枚举法寻找最优策略。

关卡Medx的策略空间

Medx包含三个决策树,三个输出流。决策树的标签、与输出流的连接共同组成了策略空间。

import itertools as itl

colorScheme = itl.product(list('RGBA'), repeat=6)

colorScheme = list(colorScheme)

def group222(line):
    scheme = []
    it = iter(line)
    for i in range(3):
        left, right = next(it), next(it)
        scheme.append((left, right))
    return scheme

colorScheme = [group222(s) for s in colorScheme]
colorScheme
>> 
[[('R', 'R'), ('R', 'R'), ('R', 'R')],
 [('R', 'R'), ('R', 'R'), ('R', 'G')],
 [('R', 'R'), ('R', 'R'), ('R', 'B')],
 [('R', 'R'), ('R', 'R'), ('R', 'A')],
 [('R', 'R'), ('R', 'R'), ('G', 'R')],
......

import pickle as pk

pk.dump(colorScheme, open('colorScheme.dat', 'wb'))

生成RGBA(A指any),的笛卡尔积,每个决策树有两个标签所以一共六个。group222将它们打包成两个两个一组以备后续使用。
连接策略的生成类似。

决策树,收集器对象设计

要反应问题的计算图,同时具有一定的可拓展性。

from collections import Counter

class DT:
    
    def __init__(self, unext=None, dnext=None):
        self.unext = unext
        self.dnext = dnext
        
    def config(self, ucolor, dcolor):
        self.ucolor = ucolor
        self.dcolor = dcolor
    
    def activate(self, package):
        color, amount = package
                
        umatch = color == self.ucolor or self.ucolor == 'A'
        dmatch = color == self.dcolor or self.dcolor == 'A'
        
        uamount = damount = 0
        if umatch == dmatch:
            uamount = damount = amount / 2
        else:
            uamount = umatch * amount
            damount = dmatch * amount
                
        self.unext.activate((color, uamount))
        self.dnext.activate((color, damount))

class Collector(Counter):
    
    def __init__(self):
        self.update(dict(R=0, G=0, B=0))
    
    def activate(self, package):
        color, amount = package
        self[color] += amount
    
    def reset(self):
        self['R'] = 0
        self['G'] = 0
        self['B'] = 0
    

设计activate,是为了让决策树和收集器统一接口。收集器继承collections.Counter,获得方便的合并操作(后面作用体现)。

在策略空间中寻找最小误差

from node import DT, Collector

import pickle as pk

import itertools as it

# 加载颜色空间和连接空间
colorScheme = pk.load(open('colorScheme.dat', 'rb'))
linkScheme = pk.load(open('linkScheme.dat', 'rb'))

# 布置决策树结点
widgets = [DT() for i in range(3)]
# 布置收集器
collectors = [Collector() for i in range(4)]

# 连接计算图
widgets[0].__init__(widgets[1], widgets[2])
widgets[1].__init__(collectors[0], collectors[1])
widgets[2].__init__(collectors[2], collectors[3])

# 记录各个策略的表现
exitsRecords = []

for colorS, linkS in it.product(colorScheme, linkScheme):
    # 在颜色空间和连接空间的笛卡尔积中查找
    
    # 按颜色策略配置决策树
    for i in range(3):
        ucolor, dcolor = colorS[i]
        widgets[i].config(ucolor, dcolor)
    
    # 安放输出流
    exits = [Collector() for i in range(3)]
    
    # 数据输入,激活根结点
    widgets[0].activate(('R', 36))
    widgets[0].activate(('G', 40))
    widgets[0].activate(('B', 26))
    
    # 按连接策略合并收集器
    for i, c in enumerate(collectors):
        exits[linkS[i]].update(c)
        c.reset()
    
    # 统计本策略误差
    e0, e1, e2 = exits
    if e0['B'] != 0 or e1['R'] != 0 or e2['B'] != 0 :
        continue
        
    diff0 = (e0['R'] + e0['G'] - 19) ** 2
    diff1 = (e1['G'] + e1['B'] - 16) ** 2
    diff2 = (e2['R'] + e2['G'] - 15) ** 2
    cost = diff0 + diff1 + diff2
    exitsRecords.append((cost, colorS, linkS, (e0, e1, e2)))

from operator import itemgetter

sorted(exitsRecords, key=itemgetter(0))[0]
>>
(914.0,
 [('R', 'B'), ('R', 'G'), ('R', 'B')],
 (0, 2, 2, 1),
 (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
  Collector({'R': 0, 'G': 10.0, 'B': 26}),
  Collector({'R': 0, 'G': 30.0, 'B': 0.0})))

程序输出的即最佳策略(之一),如图

medx.png

本关所有最佳策略

输出结果应做如下解读:

  • 误差值(本关914已最小)
  • 决策树配色方案,按左、上、右顺序
  • 4个终端出口连接的输出流
  • 输出流获得色块的分布
[(914.0,
  [('R', 'B'), ('R', 'G'), ('R', 'B')],
  (0, 2, 2, 1),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('R', 'G'), ('G', 'A')],
  (0, 2, 2, 1),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('R', 'G'), ('B', 'R')],
  (0, 2, 1, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('R', 'G'), ('A', 'G')],
  (0, 2, 1, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('G', 'R'), ('R', 'B')],
  (2, 0, 2, 1),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('G', 'R'), ('G', 'A')],
  (2, 0, 2, 1),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('G', 'R'), ('B', 'R')],
  (2, 0, 1, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('R', 'B'), ('G', 'R'), ('A', 'G')],
  (2, 0, 1, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('R', 'B'), ('R', 'G')],
  (2, 1, 0, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('R', 'B'), ('G', 'R')],
  (2, 1, 2, 0),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('G', 'A'), ('R', 'G')],
  (2, 1, 0, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('G', 'A'), ('G', 'R')],
  (2, 1, 2, 0),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('B', 'R'), ('R', 'G')],
  (1, 2, 0, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('B', 'R'), ('G', 'R')],
  (1, 2, 2, 0),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('A', 'G'), ('R', 'G')],
  (1, 2, 0, 2),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0}))),
 (914.0,
  [('B', 'R'), ('A', 'G'), ('G', 'R')],
  (1, 2, 2, 0),
  (Collector({'R': 36, 'G': 0.0, 'B': 0.0}),
   Collector({'R': 0, 'G': 10.0, 'B': 26}),
   Collector({'R': 0, 'G': 30.0, 'B': 0.0})))]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容