but 发表于 2025-2-9 08:53:15

【Paotin++】爵位任务辅助机器人思路的改进

基于doumimi的原帖https://pkuxkx.com/forum/thread-49270-1-1.html 做了进一步的改进。
总体上和原帖的思路一致,但是判断原则改成基于wiki的对这个任务的二个原则:
1、路人A提供特征X,那么除了路人A外,所有不符合特征X的其他路人都不是盗贼。

盗贼只说假话或者不说,而只有一个盗贼,那么如果他是盗贼,则其他路人都不是,如果他不是盗贼,那不符合特征X的路人则都不是。

2、路人A提供特征X,而路人A自身符合特征X,则路人A不是盗贼,特征X为真。

基本思路是:
1. 第一步look luren 分析出路人的所有特征,和原帖一致
2. 第二步询问luren,得到路人的回答,同时根据以上的原则2来尝试排除被询问的人是盗贼的可能性
3. 把所有的路人都做了look和询问后,得到2个表结构,一个表结构记录当前所有人的所有特征,key是人的名字 ,第二个表结构得到是所有询问得到的询问结果,key也是人的名字
4. 对这2个表结构进行匹配过滤,按照以上原则1,把所有相关人的特征和询问结果做比较,最后把可以排除的人的 possible 属性改成0,最后剩下一个人的 possible 属性为1,就找到了

二个数据结构的示例
#var dt1.trait
{
    {chai piaodan}
    {
      {key} {shoe}
      {value} {靴子}
    }
    {jiang qianxue}
    {
      {key} {sex}
      {value} {女}
    }
    {kong lanjie}
    {
      {key} {body}
      {value} {瘦}
    }
    {qin qian}
    {
      {key} {height}
      {value} {高}
    }
    {zheng yijia}                                                                                                                                                            {
      {key} {cloth_color}
      {value} {浅色衣服}
    }
    {zou bingya}
    {
      {key} {shoe_color}
      {value} {浅色鞋子}
    }
};

#var dt1.lurens
{
    {chai piaodan}
    {
      {age} {五十}
      {body} {胖}
      {cloth} {布衣}
      {cloth_color} {深色衣服}
      {height} {矮}
      {possible} {1}
      {sex} {女}
      {shoe} {凉鞋}
      {shoe_color} {深色鞋子}
    }
    {gu muguan}
    {
      {age} {二十}
      {body} {瘦}
      {cloth} {夹袄}
      {cloth_color} {深色衣服}
      {height} {高}
      {possible} {1}
      {sex} {男}
      {shoe} {靴子}
      {shoe_color} {深色鞋子}
    }
    {jiang qianxue}
    {
      {age} {四十}
      {body} {瘦}
      {cloth} {布衣}
                {cloth_color} {浅色衣服}
      {height} {高}
      {possible} {1}
      {sex} {男}
      {shoe} {靴子}
      {shoe_color} {浅色鞋子}
    }
    {kong lanjie}
    {
      {age} {四十}
      {body} {胖}
      {cloth} {布衣}
      {cloth_color} {深色衣服}
      {height} {矮}
      {possible} {1}
      {sex} {女}
      {shoe} {布鞋}
      {shoe_color} {浅色鞋子}
    }
    {pan qian}
    {
      {age} {四十}
      {body} {胖}
      {cloth} {丝绸}
      {cloth_color} {深色衣服}
      {height} {矮}
      {possible} {1}
      {sex} {女}
      {shoe} {靴子}
      {shoe_color} {浅色鞋子}
                }
    {qin qian}
    {
      {age} {五十}
      {body} {瘦}
      {cloth} {丝绸}
      {cloth_color} {""}
      {height} {高}
      {possible} {0}
      {sex} {女}
      {shoe} {布鞋}
      {shoe_color} {""}
    }
    {wu biaoke}
    {
      {age} {二十}
      {body} {胖}
      {cloth} {夹袄}
      {cloth_color} {浅色衣服}
      {height} {矮}
      {possible} {1}
      {sex} {男}
      {shoe} {凉鞋}
      {shoe_color} {深色鞋子}
    }
    {zheng yijia}
    {
      {age} {三十}
      {body} {瘦}
      {cloth} {丝绸}
                     {cloth_color} {浅色衣服}
      {height} {矮}
      {possible} {0}
      {sex} {女}
      {shoe} {靴子}
      {shoe_color} {深色鞋子}
    }
    {zou bingya}
    {
      {age} {四十}
      {body} {瘦}
      {cloth} {布衣}
      {cloth_color} {浅色衣服}
      {height} {矮}
      {possible} {1}
      {sex} {女}
      {shoe} {靴子}
      {shoe_color} {深色鞋子}
    }
};

可以看到初始所有人的 possible 属性都是1,最终的目的就是排除,把可以排除的人一个个去掉。

几个比较方法参考如下:
#var tempi "";
#alias dt1.match {
    #FOREACH {*{dt1.trait[]}} {i} {
      #var tempi $i;
      dt1.match1 $dt1.trait[$i] $dt1.trait[$i];
    }
    dtp1;
}

#alias {dtp1} {
    #FOREACH {*{dt1.lurens[]}} {i} {
      #local temp_possible $dt1.lurens[$i];
      #if {$temp_possible == 1} {
            okLog $i;
      }
    };
}

#alias dt1.match1 {
    #local key %1;
    #local value %2;
    okLog ...... $key $value $tempi;
    #FOREACH {*{dt1.lurens[]}} {i} {
      #local temp_possible $dt1.lurens[$i];
      #if {$temp_possible == 1} {
            okLog 循环 $i $tempi;
            #if {"$i" == "$tempi"} {
                okLog 需屏蔽提供任务信息的询问者;
                #continue;
            };
            #nop 先假设不匹配,将 possible 设为 0;
            #var dt1.lurens[$i] 0;
            okLog xxx $i $value $dt1.lurens[$i][$key] $dt1.lurens[$i];
            #regexp {$value} {%*$dt1.lurens[$i][$key]%*} {okLog 根据规则1,不可排除;#var dt1.lurens[$i] 1;}
      }
    };
    okLog 循环结束;
};
#alias dt1.match2 {
    #local key %1;
    #local value %2;
    #nop okLog 尝试判断被询问者是否可以排除 $dt.luren $dt.lurens[$dt.luren][$key] $key $value;
    #regexp {$value} {%*$dt.lurens[$dt.luren][$key]%*} {okLog 根据规则2,可排除;#var dt.lurens[$dt.luren] 0; }
};

其中 match1 就是按第一个原则按一个特征属性过滤
match2 就是按第二个原则过滤
match就是最后把2个表结构循环遍历

but 发表于 2025-2-9 08:57:17

其中匹配的方法用函数更合适,但是函数使用多参数的时候,执行能成功,但是总是触发奇怪的指令,后来改成 alias 了,但是 alias 传输参数的时候,参数里不能包含空格,所以还得用全局变量,很是不爽

doumimi 发表于 2025-2-9 09:42:51

非常非常厉害,比我的那个破机器强多了哈。加油

yanguilai 发表于 2025-2-9 09:50:02

先赞后看{:7_277:}

jarlyyn 发表于 2025-2-9 22:49:47

首先,北侠记得不能无限制的贴机器人,这个自己注意分寸。

第二,多跑测试,这任务如果没改过的话年龄这块做法是错的。
页: [1]
查看完整版本: 【Paotin++】爵位任务辅助机器人思路的改进