三国志14吧 关注:122,785贴子:2,020,198

三国志14出阵兵粮消耗定性计算

取消只看楼主收藏回复

如题,对游戏内的兵粮消耗做了一些计算和推测,自认为发现了几个很神奇的机制,分享一下~


IP属地:北京1楼2023-05-18 08:52回复
    首先是一些基础的,没有争议的结论:
    1.兵粮每旬支出一次,每月三次;收入只在月底一次(所以城市情报中的兵粮收入要达到兵粮支出的3倍才能维持下去)。
    2. 城内士兵兵粮消耗量为兵力*0.1每月
    3.出阵士兵兵粮基础消耗量翻3倍,也就是兵力*0.1每旬(兵力*0.3每月),不过这只是出阵消耗的一部分,剩下的部分就是本帖讨论的重点。


    IP属地:北京2楼2023-05-18 09:01
    回复
      关于出阵兵粮消耗,我之前在网上看到有一些解释涉及到地形、距离等因素,但大多不够具体,而且众说纷纭。所以我自己花了点时间测试,总算是找到了一套比较合理、能够解释我得到数据的机制和算法,目前看来比较合理,希望能帮到你。
      下面正式开始:


      IP属地:北京3楼2023-05-18 09:26
      收起回复
        一、首先要引入一个概念——“粮道”,这是计算兵粮消耗的基础。
        这里的“粮道”其实和断粮断的那个粮道是一回事,但这里要更明晰一些,也就是要知道粮食从供粮城市(即出阵城市)到部队之间的完整路径,这个路径地图上是没有明确显示的,但经我测试确确实实存在,而且能用简单的方法找到,而在找粮道之前还要明确粮道的一个基本特点:
        ·粮道只能经过己方(友方)已涂色的格子,其余无论是未占领的格子还是敌对势力的格子都不会划到粮道里
        先记住这一点,然后开始找粮道,其实很简单,就是移动部队的方法:选中部队,然后把鼠标移动到出征城市周围那一圈里与部队最接近的格子,如果靠近部队的方向上刚好有和街道连接的点,优先移动到那个点,然后就能看到游戏自动生成的最短路径,这个路径基本上就是粮道的路径(开始位置差个一两格也无伤大雅)。

        关于这个最短路径,需要说明一下:这原本是游戏根据每个格子消耗的行动力判断得到的最快到达路径,而不同地形消耗行动力不同,大概是高山>中山>森林~矮山>沙地>平原>街道,因为街道消耗的行动力(1.25每格)明显小于其他地形(涉及到兵粮消耗的时候更是有碾压性优势),所以最短路径会优先往街道上靠,就像图中这样。而粮道经过不同地形增加的兵粮消耗是不同的(后面会具体分析),而且其消耗量大小排序也基本和上述的行动力消耗排序相吻合,所以这条路径作为粮道一般也是消耗较少的,游戏里也理所当然地直接把它当做粮道(但其实这样生成的粮道有时并不是消耗最少的)
        总之,通过这个游戏内自带的最短路径系统,我们可以很容易找到部队的粮道,但有时候这条路径会经过未被己方涂色的格子,而根据之前提到的特点,这时候的粮道显然无法与这条路径重合,就像下图这种情况:

        虽然路径指示器给出了右侧沿着道路的最短路径,但很遗憾那边还没有涂色,所以现在的粮道只能是左边这条跨越了诸多复杂地形的路径,不难想象,此时的兵粮消耗绝不是一笔小数目,除去城里那9000部队300每旬的支出,这支10000人部队的兵粮消耗已经达到了2137每旬...不过这种情况是可以轻易避免的,且往下看。

        另外,如果遇到更复杂的情况需要自行判断粮道时,只要记住两点:1.最短路径(消耗行动力最少)2.尽量往道路上靠(还是消耗行动力最少!)


        IP属地:北京4楼2023-05-18 10:36
        回复
          找到了粮道,就可以正式做计算了,不过在此之前容我先卖个关子。
          根据常识,兵粮的消耗量应该是和粮道的长度、经过的地形有关,我开始也是基于这个假设尝试推导计算公式;最直觉的想法就是不同的地形有不同的耗粮倍率,然后就沿着粮道把这些倍率一路加起来,最后乘以部队人数就行了,然而测试得到的数据不说是完全吻合吧,也可以说是毫不相干了,其中有几个尤其出乎我的意料,也引发了我对算法的重新思考,便在这里分享一下:
          1. 兵粮消耗何故激增?粮道长度如何影响消耗?

          在上图中,这支部队在当前位置(街道)的兵粮消耗为1005每旬,而当它仅仅移动一格到了“1”位置(平地,距城市1街道+1平地),消耗突然增长了115,达到了1120每旬,继续在平地上远离城市,消耗不断增加,但增速迅速放缓,这显然不是简单的线性叠加;更令人意外的是,当部队移动到远处的“2”位置(平地,距城市8街道+1平地)时,同样的地形消耗反而比“1”位置更低,变成了1064每旬。
          2. 穿过崎岖地形就能轻松一些?

          在上图中,部队在当前位置(森林)的消耗为1564每旬,当移动到红色箭头位置(平地)时,粮道增长了一格,消耗反而降低到了1553每旬,这与流传的“所在地形会影响消耗,平原上消耗比森林山上低”相符,但还没这么简单,当部队继续沿着蓝色箭头方向在平地上移动时,粮道继续变长,然而消耗进一步降低到了1537,这又如何解释呢?
          种种迹象表明,兵粮的消耗并没有直观上想的那么简单,而上面这些问题的成因机制,且听我娓娓道来~


          IP属地:北京7楼2023-05-18 11:37
          收起回复
            在开始计算前有几点需要先说明:
            1. 为方便起见,我测试都是用的10000人部队,后续数据都以此为基准,有些倍率比较小会直接乘以10000后以数值形式给出,意会即可。
            2. 测试中没有带影响粮食消耗的个性或政策
            3. 得出的结论是通过假设验证得到的,所以具有实用性,但未必是最底层的游戏逻辑,公式方面目前还是定性分析为主,辅以一些必要的数据,因为拟合比较困难,数据具有参考意义,但不会很精确。
            4. 如果发现漏洞或者不合理的地方,欢迎质疑讨论~


            IP属地:北京8楼2023-05-18 11:52
            回复
              吃个饭,回来再写


              IP属地:北京9楼2023-05-18 11:54
              回复
                OK,正式开始,以下内容均为私货:
                开头提过一嘴,出阵部队兵粮消耗翻3倍,也就是(人数*0.1),这部分我称之为出阵基础消耗,只与人数有关,另外一部分与人数、粮道长度和粮道路径上所有格子的地形有关,可以理解为在通过粮道给部队送粮时损耗的部分,我称之为“粮道损耗”,故:
                ·出阵兵粮消耗=出阵基础消耗+粮道损耗
                ·基础出阵消耗=人数*0.1/旬
                下面重点说明粮道损耗:
                影响粮道损耗的首要因素就是地形,不同地形的损耗率是固定的,且有明显差别,由低到高大致可以排为(粗算数据,可能存在些误差):街道(3,即10000*0.0003,为了方便计算,直接给出了对应10000人部队每旬具体的兵粮损耗数值,下文出现同理)<平地(230)<沙地(400)<湿地、浅滩、大河(800)<山道(1000)<森林、矮山(1200)<中山(1600)<高山(2000),这个排序与机动力消耗量的排序基本吻合,但不难发现【街道】地形比其他地形的损耗足足少了两个数量级!所以【街道】地形自然成为了影响损耗的关键,而且也是导致游戏自动形成的粮道有时候并不是最少损耗路线的原因(粮道是按照机动力消耗生成的最短路径,但【街道】地形与其他地形的机动力差距并没有那么大,所以最短路径生成时并不会刻意在【街道】上绕远路,而实际上这种做法往往可以极大降低兵粮消耗,后面会举例说明)
                因此,“部队靠近街道兵粮消耗少的说法是有据可循的”,而【街道】的便利还不止如此,在计算具体消耗时我最先得到的就是【街道】地形的数据,因为它最为稳定,而且简明:
                ·当粮道全部在街道上时,粮道损耗=粮道总长度(格数)*街道损耗率*部队人数
                以下图为例:

                显然,1、2、3、4这四个格子构成了部队的粮道 ,粮道损耗=4*3=12,出阵基础消耗=10000*0.1=1000,城内部队本旬消耗=(9000*0.1)/3=300,故本月兵粮支出为12+1000+300=1312

                可以看到城市情报里显示的支出为1314,多出的2点也是出征基础消耗的一部分,只与出征部队人数有关,因为倍率太小所以可以直接忽视。
                总之,当粮道全部在【街道】地形上时,计算兵粮支出是最简单的,而且支出也是最少的,多一格也就多3点兵粮消耗,而当粮道不完全在【街道】地形时,情况就会稍微复杂一些,而且会出现反常识的结果,下面会继续讨论这种情况。


                IP属地:北京13楼2023-05-18 14:11
                收起回复
                  我再试着处理下数据,剩下的晚点更


                  IP属地:北京来自Android客户端14楼2023-05-18 14:58
                  回复
                    额,还是先吃个饭,晚上回来再更


                    IP属地:北京24楼2023-05-18 20:05
                    回复
                      继续,下面介绍一般情况下,也就是粮道不完全在【街道】地形上的情况,先上结论:
                      · 粮道损耗的值和粮道上的所有格子都有关系,而非仅仅取决于部队当前所在的格子
                      · 影响粮道损耗的最主要因素(除开部队人数)是不同地形格子在粮道所有格子中所占的比重,粮道总长度也会作为一个独立乘区增加损耗,但并不是线性递增,而是对数型(先快后慢)
                      具体公式为:
                      · 粮道损耗=部队总人数 *(粮道上每一种地形格子所占比重与其损耗率乘积之和*粮道长度修正+【街道】地形总长度*【街道】地形损耗率)
                      解释:
                      部队总人数无需解释;中间一项看上去很啰嗦,其实就是字面意思,举个例子,如果粮道经过地形为:1街道+1平地+1森林,那么这三种地形比重都是1/3,再分别乘以各自的损耗率,最后将乘积相加,参考13楼给出的数据,也就是1/3*万分之3+1/3*万分之230+1/3*万分之1200,而粮道长度修正是由测试数据拟合出的一个对数型函数,具体为粮道长度修正=0.975+0.294*ln(d),其中d为粮道总长度,显然,这个函数单调递增,而且越增越慢。
                      最后一项又出现了【街道】这个特殊的地形,这一项其实就是之前提到过的第一种计算方法,不过是只取了在街道地形上的那一截。
                      这部分公式花了我不少时间去猜想和验证,在大部分测试中都与实际值较为接近,当然误差是不可避免的。不过这些计算其实不是最重要的,最重要的是通过它我们就能大致判断损耗,而且可以适当调整部队的位置或者行进路线,最终达到节省兵粮消耗的目的。
                      上面的公式可能有点乱,不用担心,有个印象就行,下面我会举几个例子来验证这个计算方法,最后提供一些节省兵粮的思路,这个过程中大家会看到一些细微的差别如何让兵粮消耗产生巨大的变化,并且会理解我在7楼列出的那些反常现象的成因。


                      IP属地:北京27楼2023-05-18 23:33
                      回复
                        这里单独给出大部分地形的粮道损耗倍率用以计算,方便起见同样是以10000人部队为基准,比如街道地形的倍率为万分之3,我会直接写成3,代表每10000人每旬的损耗量(如果是1000人的部队那就是0.3,以此类推),可以理解为把公式外面的部队总人数固定成10000事先乘进去。
                        以下是损耗倍率排序,部分数据稍微归整了一下(比如790写成800)可能会增加部分误差,不过大部分推出来直接就是整的,这也挺让我惊喜的:
                        街道(3)<平地(200)<沙地,大河(400)<浅滩(500)<湿地,山路(600)<河流(700)<矮山,森林(800)<中山,密林,毒沼(1000)<高山(1200)
                        这个排序在13楼发过一遍,不过后来我更正了一下公式,稍微认真地重测了一遍,得到了更为准确的数值如上。


                        IP属地:北京28楼2023-05-19 01:17
                        回复
                          以下是举例环节,其中涉及所有数据都是手操得到的真实值,并不存在修改或者乱编的成分,可以放心代入,想自己复刻也是完全没问题的:
                          1. 首先是关于粮道路径选择的重要性,如下图:

                          之前提到过粮道只能在己方(友方)涂色区域才能生成,这里右边这条路径断了一格,所以此时粮道是蓝色绕了一大圈的那一条,这时的这支部队自身的兵粮消耗为1614;而只要移动一格把绿色的粮道接通,这条完全覆盖在【街道】上的粮道瞬间将部队兵粮消耗降低到了1020,考虑到其中有1002是固定的出征基础消耗,所以实际改变的粮道损耗是612->18,仅仅一格之差。
                          下面是一个很有意思的反例,如图:

                          可以看到,通过系统最短路径找到的粮道(左边黄色)并不在涂色范围内,所以实际发挥作用的粮道应该是我用绿线划出的那一条(遵循最短路径和街道优先的原则),此时该部队的兵粮消耗为1472(1002+470),那么假如沿着系统给出的路径涂上色,让这条黄色粮道生效,然后回到现在的位置,会发生什么呢?答案是,部队的兵粮消耗上涨到了1871(1002+869),原因有二:其一,这条粮道穿过了拥有最高损耗倍率的山地,所以粮道损耗激增;其二,右边那条绿色的粮道覆盖的【街道】地形更多,所以根据公式,【街道】地形在计算损耗时的权重(比例)会更大,又因为【街道】拥有远低于其他地形的损耗倍率,所以会拉低最终的损耗数值,这一点后续还会提及。


                          IP属地:北京29楼2023-05-19 01:53
                          回复
                            2. 具体耗粮计算:
                            还记得我在7楼给出的一些反常识数据么,下面我们利用公式具体分析这些数值的成因:

                            之前我提到,在当前位置时部队的兵粮消耗只有1005,现在我们知道这是由两部分组成的:10000*0.1得到的1000点出征基础消耗,2点额外出征基础消耗(和部队人数有关,影响微乎其微,不用管),以及在【街道】上的一格粮道产生的3点损耗,所以1005=1002+3;而当部队移动到1位置时,1002点基础消耗不变,然后用公式计算粮道损耗=(1/2*3+1/2*200)*(0.975+0.294*ln 2)+3*1=122,所以总消耗计算值为1002+122=1124,游戏内实际数值为1120。
                            而在2位置时,粮道是从上面出口沿着街道连过去的,途径8街道+1平地共九格,计算粮道损耗应为:(8/9*3+1/9*200)*(0.975+0.294*ln 9)+3*8=64,总消耗计算值为1002+64=1066,游戏内实际数值为1064。
                            下面试试更复杂的情况:

                            如图,当前部队位于府上,相当于【街道】地形,粮道很好找,可以看到是由2街道(包括府所在的那一格)+5平地+3森林共10格构成的,粮道损耗应为:(2/10*3+5/10*200+3/10*800)*(0.975+0.294*ln 10)+2*3=568,总消耗计算值为1002+568=1570,游戏内的实际数值为1564。
                            另外,之前提到当部队沿着123路径移动时,粮道变长但是消耗却变少了(感兴趣可以自己套公式算算或者到游戏中模拟一下),原因也和上上个例子一样:低损耗倍率格子的增多挤占了高损耗格子的权重(占比),从而稀释了倍率和。当然,你可能会考虑到在这个过程中粮道长度修正(含ln的那一串式子)是在增长的,确实如此,但在数值上,这一部分在长度大于5时就增长的很缓慢了,而且还会越来越慢,在这个例子中还不足以抵消被稀释降低的倍率,所以我说影响粮道损耗的最主要因素还是地形权重与倍率和,长度增加带来的损耗上升只在十格以下时比较明显。
                            因此,如果你的粮道已经拉的很长了,那么再拉长一些也无伤大雅;而想办法让粮道途径更多低倍率地形(尤其是神中神--【街道】)同时避开高倍率地形是最有效降低消耗的方法。


                            IP属地:北京30楼2023-05-19 03:01
                            收起回复
                              还有个测试时无意中遇到的很奇葩的例子,白天再发~


                              IP属地:北京31楼2023-05-19 03:02
                              回复