太吾绘卷吧 关注:254,485贴子:4,688,184

【抛砖引玉】太吾疗伤/解毒算法刍议

只看楼主收藏回复

灌顶镇楼放抽
不要停下来啊(指迫害掌门鸭)


IP属地:四川1楼2019-04-16 18:34回复


    IP属地:上海来自Android客户端2楼2019-04-16 18:35
    收起回复
      一、绪论
      在太吾绘卷中,药品是非常重要的一环。伤口不会主动愈合,而治疗的方式主要可以分为三类:
      1. 每月一次的治疗机会;
      2. 拖动药品,在非战斗情形下疗伤;
      3. 战斗中疗伤(含有普通疗伤和特殊技能疗伤);
      其中只有前两种方式可以治疗旧伤。很多攻略也强调了这一点,提醒新人及时购买低阶的药品并且及时疗伤,以免在进入战斗时即陷入劣势(更短的血条,破绽或点穴)。本帖的目的不在于此,而是试图从【个人观感】的角度指出目前药品系统算法上的不合理之处。
      首先,我们假设太吾已经中赤毒。太吾手中有两瓶丹药,分别是耐久为1的一品赤毒解药玉佛僻(疑似错别字)邪散和耐久为1的三品赤毒解药净血伏邪膏,两者的解毒效果分别是:
      玉佛僻邪散:赤毒-1000,中毒效果高于3000时回复效果减少80%;
      净血伏邪膏:赤毒-700,中毒效果高于2100时回复效果减少80%;
      那么,可以根据这些特效进行分析,作图如下:


      此时可以发现,在毒素量为3000~3150这个区间内,使用“先三品后一品的策略”可以有效地解毒,反之则浪费了稀有的一品神药,没有达到它最优的效用。显然此时可以分为四种情况讨论:
      (a) 两种解毒剂都在三倍效力范围内,因而先服用哪一个都无所谓;
      (b) 毒素积累量超过了两种解毒剂的三倍效力范围,并且无论先服用哪一个都无法使得毒素降到剩下一种解毒剂的三倍效力范围内,因此先服用哪一个都无所谓;
      (c) 毒素超过品阶较高的解毒药效力的三倍,但再服用另一种解毒剂之后可以降到三倍效力范围内,因此应当先服低品后服高品;
      (d) 毒素在品阶较高解毒药效力三倍范围内,但是超出了较低的三倍解毒效力范围,应当先服高品后服低品;
      这在一定程度上是反直觉的,其根源在于“解毒”这个操作是离散的,存在历史依赖性,或者说它们对应的算子不是可交换的。武侠小说里我们总是能看到这样的桥段:某某重伤,需要用神奇的药物吊命。显然人们更倾向于认为高品阶的药材有远远超出低品药材的效力,面对极重的伤势最优先的策略是先服用最高品阶的药物。
      基于此,下面我想讨论几个问题:
      1. 在目前的算法下,如果有三瓶或以上的不同等级解毒药,服药的最优策略是什么?
      2. 能否设计一种符合直觉的,疗伤解毒算法?
      3. 在2的基础上,能否设计一种严格满足历史无关性的疗伤解毒算法?


      IP属地:四川3楼2019-04-16 18:36
      回复
        二、“三瓶药”问题
        以一、二、三品的赤毒解药为例,可以作图如下。可见在一定的区间内132,312,213和321都可能是最优的解毒方案。实际上一共有2^3=8种情况;进一步地每引入一种新的药都会使得问题复杂一倍。特别是在中毒3000~3140这个区间上,最优和最差的解毒方案解毒效果相差达到1480,这正好就是一品和二品药被“浪费”的数值:(1000+850)×80%=1480。类似地我们可以推知在多种不同药品解毒时,效率最低的情形就是除开最低品药之外,其他药在解毒过程中都面对其三倍效力之外的毒素。


        更多瓶药的问题可以如法讨论,如“1234”问题,但是这个问题一共包含24条曲线和16个分类讨论区间情形,无论是在讨论意义上还是在实践意义上都过于琐屑了(实际上是我太菜了)。


        IP属地:四川4楼2019-04-16 18:37
        收起回复
          三、能否得到一种“符合直觉”的疗伤解毒算法?
          所谓“符合直觉”,如前所述,即高品药品效力强劲可以立起沉疴,能够应对重大的伤势;而低品药品只能治疗小伤小痛,效果不强。另外,还需要在任何情况下,都应当先用高品药再用低品药。假设依然采用茄式算法,但是修改“效果减少80%”的限制:一品药在超过其三倍效力范围时,其解毒值只衰减40%,而三品药依然衰减80%。可以作图如下:


          可见那个反直觉的区间和原来一样存在,但是在这个区间上最优和最差方案的差值下降了,先用一品药物再用三品药物变得“不那么亏”了。这表明一条可行的思路:让更高阶的药品在超过三倍效力范围时的疗效比例更高,以区别于低级药品。
          另一种思路是将毒素分为两部分:超出三倍效力的部分为A,在三倍效力范围内的为B。当服药时,首先解除A部分,此时药物部分起效;然后解除B部分,如果药物效力还有富余那么全额起效。沿用游戏中的数据,同样可以讨论服药顺序的影响,如下图所示:


          对比目前的算法,“不合理”区间反而还拓宽了,这种方法可能对原问题有一些改善,但是还是不能够完全解决它。


          IP属地:四川5楼2019-04-16 18:39
          回复
            从以上讨论也可以看出,只要继续采用这种“低于一定范围时直接相减,高于此范围衰减后相减”的计算方法,由于药品本身使用先后顺序导致的疗效损失问题就无法根本解决。那么有没有一种算法,可以在任何时刻都以“先使用高品药物”为最优策略?可以构造一种线性的简单算法,设解毒前的毒素值为x,等级为i的药物解读后的毒素值为fi(x)=aix-bi,其中ai和bi都是正数,特别地ai是0~1范围内的数。这种算法需要满足的条件是在i<j时,始终有fj(fi(x))≤fi(fj(x)),即(1-aj)/bj≤(1-ai)/bi(不考虑解毒后小于0的平凡情形)。显然,这样的系数ai和bi是可以构造的。假设这里取等号,那么一组可能的值是:

            如此,我们也顺便解决了问题三,构造了一种先后顺序不影响解毒效果的解毒算法。和之前的一品、三品药疗效曲线比较,如下图所示:


            根据以上的不等式进行数值和符号上的调整,可以得到以下三种效果之一:
            1. 在任何条件下,都应当先服用高品阶的药物;
            2. 在任何条件下,都应当先服用低品阶的药物;
            3. 在任何条件下,服用药物的顺序与最后的疗伤效果都无关;
            应当存在更优秀的算法,并且本问题还可以从群论的角度对算子的交换性进行更深刻的讨论。笔者水平有限,本帖仅为抛砖引玉,吧友于此有专长者,还望不吝赐教。


            IP属地:四川6楼2019-04-16 18:42
            回复
              群友来🌶


              IP属地:山西来自Android客户端7楼2019-04-16 18:46
              回复
                ***要是加精了,本掌门颜面何存


                IP属地:浙江来自Android客户端8楼2019-04-16 18:47
                收起回复


                  IP属地:云南来自Android客户端9楼2019-04-16 18:48
                  回复


                    IP属地:江苏来自Android客户端10楼2019-04-16 18:49
                    回复


                      IP属地:广东来自Android客户端11楼2019-04-16 18:50
                      回复
                        思思思……咦我怎在此处……


                        IP属地:山东来自Android客户端12楼2019-04-16 18:50
                        回复
                          这才是太吾绘卷呀!!!!!


                          IP属地:广东来自Android客户端13楼2019-04-16 18:52
                          回复
                            这是解毒,其实大伤口疗伤同理,所谓“符合直觉”的做法就是用“刚好”不降低效果的药压住伤势,然后再用低级药;如果最高等级的药都不足以治疗伤势的话,就先用医疗,或者用最低等级的药慢慢磨掉伤势,直至进入到好药的作用范围内


                            IP属地:北京来自Android客户端14楼2019-04-16 19:06
                            回复
                              不要再迫害小吧啊(指加大力度)


                              来自Android客户端16楼2019-04-16 19:09
                              回复