对于异星工厂的生产的数学建模与优化 (未完成)

辅助工具

科技树/合成树生成器: https://github.com/NoobSir-Michael/factorio-trees

设计目标

  1. 需要解决的问题: 通过某种算法得到升级出第一个科技的最优建造和生产策略.

  2. 先解决最简单的科技: 自动化, 需要生产10个红瓶

    1. 需要有研究中心进行研究, 石炉进行熔炼, 热能采矿机进行开采

       

       

    2. 为了简单起见假设无限能源 – 所有需要煤炭或者电力驱动的设备认为无限能源

  3. 将玩家抽象为一个无限能源的采矿机加上一个合成台, 其可并行, 初始情况下玩家的背包中拥有一个采矿机和一个石炉. 因为剩下的木头不在使用的范围内, 所以可对其进行忽略

  4. 代码优化目标: 完成升级第一个科技自动化的时间.

    1. 自动化科技研究消耗: 每个红瓶需要10s进行消耗, 每个红瓶被使用后增加10%研究进度

    2. 可以将其抽象为以下概念: 自动化科技被分为10个自动化科技碎片, 消耗一个红瓶花费10s合成一个碎片 当总碎片达到10个时完成合成.

  5. 将离散的合成步骤合并(因为只有一个合成台,可以直接相加):

    1. 红瓶: 2 铁板 + 1 铜板 + 5s

    2. 研究中心: 36 铁板 + 15 铜板 + 22s

    3. 石炉: 5 石矿 + 0.5s

    4. 热能采矿机: 5 石矿 + 9 铁板 + 4s (这里忽略了直接使用石炉合成采矿机的选项)

    5. 科技碎片: 1 红瓶 + 10s

       

       

基本模型结构

 

 

1. 对于基本模型结构的数学证明

题: 假设基础原料的总量为 A . 生产工具的实时数量为 x. 开始时生产工具的数量为1. 每单位基础原料可以花费 T1 时间生产出 K1 个生产工具 或者花费 T2/x 时间生产 K2 个产出. 从开始到所有基础原料消耗完的时间中, 产出的平均生产效率的最大值是多少.

解: 工具: https://blog.csdn.net/shuangguo121/article/details/86611948

  1. 假设生产工具与生产产物可以并行进行. 很明显产物生产效率的最大值符合贪心算法的要求, 即 使用所有的工具生产产物同时生产生产工具. 其平均效率为:

     

     

  2. 假设生产工具和生产产物不可同时进行.

    1. 证明先生产工具后生产产物的平均效率大于工具和产物交替生产: 因为在交替生产中生产相同数量的工具所需要的时间不变, 但是在两组生产工具的任务中间的生产产物的任务的效率较低, 所以在相同时间交替生产的产量低于先生产工具后生产产物的产量. 所以效率较低

    2. 假设 0~Tc时间段生产工具, 余下的时间生产产物:

    3. 列出方程组

      x = Tc / T1 * K1 + 1

      y = (T - Tc) * K2 / T2 * x

      A = (x - 1) / K1 + y / K2

      其生产效率为: W = (T - Tc) * K2 / (T * T2) * (TcK1 / T1 + 1)

    4. 对生产效率函数进行带入化简:

       

       

       是关于Tc的函数

      求导:

       

       

      将其取0展开: 

       

       

      由于一般而言A的数值远大于T1T2等常量所以

       

       

       小于零, 所以其生产效率函数有全局最大值.

      全局最大值 W 也是 

       

       

2. 对于数学模型的代码模拟

为了简化计算, 这里设置T1,K1,T2,K2均为1以研究平均生产效率与A之间的关系

  1. 可并行情况:

     

     

    1. 上面的橙色图形是上一部分中数学计算得到的W的表达式, 由于将离散的生产处理为了连续的, 导致有一定量的误差. 下面的绿色图形是W = A^0.5*0.5 的曲线, 由此可以看出, Θ\left(\sqrt{A}\right)的结论是正确的

  2. 不可并行情况:

     

     

    1. 由此图可以看出平均生产效率随工具生产的占比先上升后下降, 并且在小于20的地方取到最大值

     

     

    1. 对于每个A获取其最大的平均生产效率, 可以看出其是Θ\left(\sqrt{A}\right)并且和0.5*\left(\sqrt{A}\right)几乎一致

     

    1. 这张图表示的是在不同A的取值情况下生产多少比例的工具可以最大限度提升生产效率. 对y轴进行处理之后可以发现 1/(max_W_percentage)^2 正比于 A, 所以: maxWPercentage = Θ( 1/\sqrt A)

  3. 对于只有在先生产工具后生产产品的情况下平均生产率可以达到最大值这一判断的补充验证:

    1. 这里的模拟取A = 1000

    1. 上图所示的蓝色横线是在先生产工具后生产产品时取工具消耗资源的比例为4%的平均生产效率

    2. random percentage是在生产工具的同时生产的产品的原材料占原始原材料的比例.

    3. 由此可见, 随着在生产工具的同时生产的产品的数量增多, 总体的效率发生了下降

对于目标的建模

由于Factorial中进行熔炼, 采矿与合成都是需要占用工具的, 所以实际上是一个串行的生产过程

结合上面进行简单模型的经验, 将所有的对象的成本计算为工具工作时间的总和:

物品名称采矿时间熔炼时间合成时间研究时间
研究中心 204 163.2 22 0
采矿机 56 28.8 4 0
石炉 20 0 0.5 0
科技碎片 12 9.6 5 10

 

 

红色虚线表示促进作用

后续思路: 使用代码建构对这整个生产过程的正向模拟, 由于机器的数量为整数, 对于不同机器数量进行遍历, 寻找其一般规律然后继续进行分析. 对于代码建模而言, 对于 采矿, 熔炼, 研究, 合成 分别创建一个任务队列, 认为每时刻只能处理一个任务, 但是由于生产工具数量的增加导致生产效率的增加. 将并行问题转化为串行问题. 这两种处理方式在时间较长的情况下应该是等效的. 我对此还没有进行仔细地分析

 

posted @ 2021-12-03 11:17  NoobSir  阅读(703)  评论(2编辑  收藏  举报