lanchong 发表于 2024-2-26 09:55:13

请教如何提高男爵任务的指认成功率

先说一下我的处理思路
1、在ask 消息之前所有路人均是嫌疑人
2、单独询问并比对
   比对路人提供的消息和自身的特征
   通过,从嫌疑人库中剔除并纳入白名单,该路人提供的消息纳入真线索库、一般线索库,单独比对剔除年龄,公公没资格比对性别
   未通过,路人纳入嫌疑人库,消息纳入一般线索库
3、询问结束进行最后排查
   略过白名单路人
   对比路人身体特征与线索库得分最高的为罪犯
   如果最终得分最高且相同的路人超过1人,则对比真线索库,与真线索吻合度高的为罪犯


问题:
1、年龄是否可以作为判断真伪的可靠依据,按wiki攻略上的说法是年龄会受内功影响,我的理解是路人观察到的罪犯年纪线索和排查时look到的嫌疑人年龄描述会有出入,所以在单独比对的时候去除年龄这个元素
2、得分最高超过1人时对比真线索库,对比后如果嫌疑人吻合度相同就陷入尴尬局面,只能瞎蒙一个(不打架只指认),不知道有什么好的建议
3、有100%成功指认的可能吗?

jarlyyn 发表于 2024-2-26 10:30:41

翻了下我的代码

首先是因为任务太蛋疼用了伪中文编程
    const 未知 = 0
    const 男性 = 1
    const 女性 = 2
    const 无性 = 3
    const 高 = 1
    const 矮 = 2
    const 胖 = 1
    const 瘦 = 2
    const 青年 = 1
    const 中年 = 2
    const 老年 = 3
    const 中青年 = 4
    const 中老年 = 5
    const 深色 = 1
    const 浅色 = 2
    const 布衣 = 1
    const 夹袄 = 2
    const 丝绸衣服 = 3
    const 靴子 = 1
    const 布鞋 = 2
    const 凉鞋 = 3

    const 性别 = 0
    const 高矮 = 1
    const 胖瘦 = 2
    const 年纪 = 3
    const 衣色 = 4
    const 衣型 = 5
    const 鞋色 = 6
    const 鞋型 = 7

    const 不确定 = 0
    const 匹配 = 1
    const 不匹配 = 2

    const 不排除嫌疑 = 0
    const 排除嫌疑 = 1
    const 罪犯 = 2

然后是关键回复定义,只放几条脱个敏
    let colors = {
      "": 浅色,
      "Green": 浅色,
      "Yellow": 浅色,
      "Cyan": 浅色,
      "White": 浅色,
      "Black": 深色,
      "Red": 深色,
      "Blue": 深色,
      "Magenta": 深色,
    }
    let body = {
      "高大魁梧": [男性, 高, 胖],
      "宛如一根竹竿": [男性, 高, 瘦],
}

    let clues = {
      "你找错人了。": -99,
      "我啥消息也不了解啊。": false,
      "你已经问过了,我这里就了解那么多消息。": false,
      "当时我正路过这个商铺,看见一个男子在附近鬼鬼祟祟地不知道干嘛。": [性别, 男性],
}
匹配和年龄判断
    //用证词来匹配 嫌疑人/嫌疑人证词
    let matchperson = function (view, claim) {
      for (var i = 0; i < claim.length; i++) {
            if (claim != 0 && view != 0) {
                if (i == 年纪) {
                  switch (view) {
                        case 青年:
                            if (claim != 中青年) {
                              return (claim == view) ? 匹配 : 不匹配
                            }
                            break
                        case 中年:
                            if (claim != 中青年 && claim != 中老年) {
                              return (claim == view) ? 匹配 : 不匹配
                            }
                            break
                        case 老年:
                            if (claim != 中老年) {
                              return (claim == view) ? 匹配 : 不匹配
                            }
                            break
                  }
                } else {
                  return (claim == view) ? 匹配 : 不匹配
                }
            }
      }
      return 不确定
    }
设置判定标志位的代码
    let conclusion = function (person, value) {
      if (person.Suspicion == 不排除嫌疑) {
            if (value == 排除嫌疑) {
                person.Suspicion = 排除嫌疑
                Note("排除 " + person.ID + "@" + person.Location + "的嫌疑")
            } else {
                person.Suspicion = 罪犯
                Note("推定 " + person.ID + "@" + person.Location + "是罪犯")
            }
      }
    }
核心逻辑

    let think = function () {
      let result = []
      for (var i = 0; i < App.Quest.Juewei.Data.Persons.length; i++) {
            Note("根据" + App.Quest.Juewei.Data.Persons.ID + "@" + App.Quest.Juewei.Data.Persons.Location + "消息 初步排除")
            if (matchperson(App.Quest.Juewei.Data.Persons.View, App.Quest.Juewei.Data.Persons.Claim) == 匹配) {
                conclusion(App.Quest.Juewei.Data.Persons, 排除嫌疑)
            }
            for (var k = 0; k < App.Quest.Juewei.Data.Persons.length; k++) {
                if (k != i) {
                  if (matchperson(App.Quest.Juewei.Data.Persons.View, App.Quest.Juewei.Data.Persons.Claim) == 不匹配) {
                        conclusion(App.Quest.Juewei.Data.Persons, 排除嫌疑)
                  }
                }
            }
      }

      while (true) {
            let changed = false
            for (var i = 0; i < App.Quest.Juewei.Data.Persons.length; i++) {
                //验证第i个人的证词
                let matched = 0
                if (App.Quest.Juewei.Data.Persons.Suspicion == 罪犯) {
                  changed = false
                  break
                }
                for (var k = 0; k < App.Quest.Juewei.Data.Persons.length; k++) {
                  if (k != i) {
                        if (App.Quest.Juewei.Data.Persons.Suspicion == 排除嫌疑) {
                            //用排除嫌疑的人的证词去验证别人的证词
                            let result = matchperson(App.Quest.Juewei.Data.Persons.Claim, App.Quest.Juewei.Data.Persons.Claim)
                            switch (result) {
                              case 不匹配:
                                    Note("根据" + App.Quest.Juewei.Data.Persons.ID + "@" + App.Quest.Juewei.Data.Persons.Location + " 排除冲突证据")
                                    conclusion(App.Quest.Juewei.Data.Persons, 罪犯)
                                    changed = false
                                    break
                              case 匹配:
                                    if (App.Quest.Juewei.Data.Persons.Suspicion == 不排除嫌疑) {
                                        Note("根据" + App.Quest.Juewei.Data.Persons.ID + "@" + App.Quest.Juewei.Data.Persons.Location + " 推断相似证据")
                                        conclusion(App.Quest.Juewei.Data.Persons, 排除嫌疑)
                                        changed = true
                                    }
                                    break
                            }
                        }
                        if (App.Quest.Juewei.Data.Persons.Suspicion == 不排除嫌疑 && App.Quest.Juewei.Data.Persons.Suspicion == 不排除嫌疑) {
                            //证据需要有嫌疑人匹配
                            let result = matchperson(App.Quest.Juewei.Data.Persons.View, App.Quest.Juewei.Data.Persons.Claim)
                            if (result == 匹配) {
                              matched++
                            }
                        }

                  }
                }
                if (App.Quest.Juewei.Data.Persons.Suspicion == 不排除嫌疑 && App.Quest.Juewei.Data.Persons.Claim.join("") != "00000000" && matched == 0) {
                  //没有一个嫌疑人符合证词
                  Note("根据" + App.Quest.Juewei.Data.Persons.ID + "@" + App.Quest.Juewei.Data.Persons.Location + " 推断伪证")
                  conclusion(App.Quest.Juewei.Data.Persons, 罪犯)
                  changed = false
                  break

                }
            }
            if (changed == false) {
                break
            }
      }
      for (var i = 0; i < App.Quest.Juewei.Data.Persons.length; i++) {
            if (App.Quest.Juewei.Data.Persons.Suspicion == 不排除嫌疑) {
                Note(App.Quest.Juewei.Data.Persons.ID + "@" + App.Quest.Juewei.Data.Persons.Location + "有嫌疑")
                result.push(App.Quest.Juewei.Data.Persons)
            }
            if (App.Quest.Juewei.Data.Persons.Suspicion == 罪犯) {
                Note(App.Quest.Juewei.Data.Persons.ID + "@" + App.Quest.Juewei.Data.Persons.Location + "是罪犯")
                return ]
            }
      }
      if (result.length == 0) {
            result = App.Quest.Juewei.Data.Persons
      }
      let output = []
      while (output.length < 2 && result.length != 0) {
            output.push(result.splice(RandomInt(result.length), 1))
      }
      return output
    }


jarlyyn 发表于 2024-2-26 10:34:35

然后是数据结构,代表每个嫌疑犯    var newperson = function (location, id) {
      return {
            Location: location,
            ID: id,
            View: ,
            Claim: ,
            Suspicion: 不排除嫌疑,
            Picture: -1,
      }
    }
位置,npc id,8个个位数字代表的外貌特征,8个个为数字代表的证词特征,嫌疑标记。

jarlyyn 发表于 2024-2-26 10:36:44

抓到描述后的部分 年龄判断

      if (App.Quest.Juewei.Data.CurrentPerson.Picture >= 0) {
            App.Quest.Juewei.Data.CurrentPerson.Picture++
            if (App.Quest.Juewei.Data.CurrentPerson.Picture == 2) {
                let resultage = line.match(reage)
                if (resultage) {
                  let age = CNumber.Convert(resultage)
                  let agevalue
                  if (age < 3) {
                        agevalue = 青年
                  } else if (age == 3) {
                        agevalue = 中青年
                  } else if (age == 4) {
                        agevalue = 中年
                  } else if (age == 5) {
                        agevalue = 中老年
                  } else {
                        agevalue = 老年
                  }
                  setview(App.Quest.Juewei.Data.CurrentPerson, 年纪, agevalue)
                }
            }
      }


dtp 发表于 2024-2-26 10:39:08

我也晒一下:


    #action {^这是一位身材异常魁梧高大的行人。$}      { tang.行人特征.身材 女 高 胖   };
    #action {^这是一位身材丰满矮小的行人。$}            { tang.行人特征.身材 女 矮 胖   };
    #action {^这是一个丰胸细腰,身材苗条挺拔的行人。$}{ tang.行人特征.身材 女 高 瘦   };
    #action {^这是一位娇小玲珑的行人。$}                { tang.行人特征.身材 女 矮 瘦   };
    #action {^这是一位高大魁梧的行人。$}                { tang.行人特征.身材 男 高 胖   };
    #action {^这是一位矮小粗胖的行人。$}                { tang.行人特征.身材 男 矮 胖   };
    #action {^这是一位矮小灵活的行人。$}                { tang.行人特征.身材 男 矮 瘦   };
    #action {^这是一位宛如一根竹竿的行人。$}            { tang.行人特征.身材 男 高 瘦   };

    #action {^%*{他|她}看起来约%*多岁,身长约%*,体型%*。$}         { tang.行人特征.年龄 {%%2} {%%3}};

    #action {~□%*身穿一件\e[{1;|}3%.m{鹤氅|长袄|棉袄}}             { tang.行人特征.衣服 {%%3} 夹袄 };
    #action {~□%*身穿一件\e[{1;|}3%.m{狼皮袄|短袄|比甲}}         { tang.行人特征.衣服 {%%3} 夹袄 };
    #action {~□%*身穿一件\e[{1;|}3%.m{丝织长衫|丝绸短襦|绸袍}}   { tang.行人特征.衣服 {%%3} 丝绸 };
    #action {~□%*身穿一件\e[{1;|}3%.m{丝织儒衫|轻罗纱|旗袍}}       { tang.行人特征.衣服 {%%3} 丝绸 };
    #action {~□%*身穿一件\e[{1;|}3%.m{坎肩|圆领衫|灰布衫}}         { tang.行人特征.衣服 {%%3} 布衣 };
    #action {~□%*身穿一件\e[{1;|}3%.m{灰马褂|百褶裙|蓝马褂}}       { tang.行人特征.衣服 {%%3} 布衣 };
    #action {~□%*身穿一件\e[{1;|}3%.m{短打劲装|天蓝锦袍}}          { tang.行人特征.衣服 {%%3} 布衣 };

    #action {^□手持一根绣花针(Xiuhua zhen)$}                     { tang.行人特征.性别 {男|女}    };
    #action {^□戴着一串金项链(Golden necklace)$}               { tang.行人特征.性别 {男|女}    };
    #action {^□戴着一个金戒指(Golden ring)$}                     { tang.行人特征.性别 {男|女}    };

    #action {~□%*脚蹬一双\e[{1;|}3%.m{绣花鞋|锦鞋|凤鞋}}         { tang.行人特征.鞋子 {%%3} 布鞋 };
    #action {~□%*脚蹬一双\e[{1;|}3%.m{布鞋|麻鞋|千层底布鞋}}       { tang.行人特征.鞋子 {%%3} 布鞋 };
    #action {~□%*脚蹬一双\e[{1;|}3%.m{木屐|草鞋|破鞋}}             { tang.行人特征.鞋子 {%%3} 凉鞋 };
    #action {~□%*脚蹬一双\e[{1;|}3%.m{牛皮短靴|马靴|女式短靴}}   { tang.行人特征.鞋子 {%%3} 靴子 };
    #action {~□%*脚蹬一双\e[{1;|}3%.m{女式长靴|薄底快靴|七星剑靴}} { tang.行人特征.鞋子 {%%3} 靴子 };



    #action {^%%1说道:「%*{男|女}%*」$}                { tang.证词 {%%1} 性别 {%%3} };
    #action {^%%1说道:「%*流浪汉%*」$}               { tang.证词 {%%1} 性别 {男}};

    #action {^%%1说道:「%*{高|矮}个子%*」$}            { tang.证词 {%%1} 身高 {%%3} };
    #action {^%%1说道:「%*个子不太高%*」$}             { tang.证词 {%%1} 身高 {矮}};

    #action {^%%1说道:「%*{发胖|有点胖|微微发福}%*」$} { tang.证词 {%%1} 胖瘦 {胖}};
    #action {^%%1说道:「%*{竹竿|猴子|偏瘦|偏廋}%*」$}{ tang.证词 {%%1} 胖瘦 {瘦}};

    #action {^%%1说道:「%*{花白|白发苍苍|棺材}%*」$}   { tang.证词 {%%1} 年龄 {老}};
    #action {^%%1说道:「%*{老大不小|中年}%*」$}      { tang.证词 {%%1} 年龄 {中}};
    #action {^%%1说道:「%*{青年|非常年轻|年轻人}%*」$} { tang.证词 {%%1} 年龄 {青}};

    #action {^%%1说道:「%*{布衣|丝绸|夹袄}%*」$}       { tang.证词 {%%1} 衣服 {%%3} };
    #action {^%%1说道:「%*{靴子|凉鞋|布鞋}%*」$}       { tang.证词 {%%1} 鞋子 {%%3} };
    #action {^%%1说道:「%*身穿{深|浅}色衣服%*」$}      { tang.证词 {%%1} 衣色 {%%3} };
    #action {^%%1说道:「%*脚上穿着{深|浅}色鞋子%*」$}{ tang.证词 {%%1} 鞋色 {%%3} };

jarlyyn 发表于 2024-2-26 10:39:32

然后
1.全随机不用考虑100%
2.这个更接近逻辑判断,找逻辑冲突,未必适合积分模式。

jarlyyn 发表于 2024-2-26 10:41:56

然后性别有三,男性,女性,无性。

无性通过装备针判断。

      if (line=="□手持一根绣花针(Xiuhua zhen)")

tacch 发表于 2024-2-26 10:55:48

本帖最后由 tacch 于 2024-2-26 11:20 AM 编辑

做个别名挨个看路人,接完任务先去目的地找齐所有路人,挨个look一遍,游戏记录往上翻从第一个路人看下来看到最后一个,主要通过服饰、身材、性别判断,公公可男可女,年龄也有浮动这两个都是最后参考不做100%判断的标准,然后根据这样判断:
1、看每个人的口述和他自身的情况,找口述和自身描述相同的人,这个是关键,口述和自身情况吻合的一定不是罪犯,他说的一定是真话,和他描述的信息不符的其他路人也一定不是罪犯,说的也一定是真话,找到一个这样的人就可以排除好几个人了;
2、其他被认定不是罪犯的那些人描述的信息也是罪犯的信息,可以扩大排除范围再排除几个路人,通过这些真话信息来确认剩下有嫌疑的路人,谁符合的最多就是谁,通常这样已经可以锁定嫌疑人了,但是也有较小的可能比如剩下2个人同时都满足这些特征,按wiki说法,不提供信息的路人(说他什么都不知道的)比提供信息的路人嫌疑小,这个时候就选提供信息的那个路人(提供假信息想要转移视线),也有极小概率剩下两个路人同时都满足相同数量的罪犯特征然后两个人都有提供假信息互相指认对方,这个时候可以假设其中一个是罪犯,通过两个嫌疑人提供的假信息去判断,因为说假话的只会有1个人,对两个人分别假设一下也能判断出来了,也有极小极小概率最后两个人提供的假信息都指向对方,这个时候两人作案的概率就完全相同,只能靠蒙。3、如果所有路人都没有一个口述和自身描述一样的,那就是把所有路人提供的描述列出来,比如男、高、浅色衣服、深色鞋子、胖(所有路人提供的汇总特征,这里面只有一项是假特征,其他都是真特征)等等这样,然后把这些特征去和所有路人比对一遍,凡是具备2项特征和上面的汇总特征不符的路人一定不是罪犯,比如女的廋的,或者矮的穿深色衣服的,然后这些人提供的那个特征一定是真特征,把这些真特征都确定下来,根据真特征再去比对剩下的路人,谁全部都符合真特征的就是罪犯了。


lanchong 发表于 2024-2-26 11:27:13

jarlyyn 发表于 2024-2-26 10:30 AM
翻了下我的代码

首先是因为任务太蛋疼用了伪中文编程


杰哥年龄分类的依据是什么?

我这样是不是过于简单粗暴?
二 青年
三 青年
四 中年
五 中年
六 老年
七 老年

半只脚埋入棺材 老年
头发花白 老年
白发苍苍 老年
中年人 中年
老大不小 中年
青年人 青年
年轻人 青年
非常年轻 青年

jarlyyn 发表于 2024-2-26 11:30:43

lanchong 发表于 2024-2-26 11:27 AM
杰哥年龄分类的依据是什么?

我这样是不是过于简单粗暴?


4楼,年龄第一位,也就是10位数,中文转数字。
页: [1] 2
查看完整版本: 请教如何提高男爵任务的指认成功率