流水线合成材料依赖表的生成算法

前不久玩了一个烧脑的游戏"异星工厂",就是开局一农民,然后通过建造自动化的流水线,最后合成宇宙飞船飞回故乡的故事.其中自动化的流水线需要玩家自己规划,比如这样的:

 

下面的这个是游戏中的一个物品"电力机械臂"的合成配方:

可以看到,这里合成一个"电力机械臂",需要"齿轮","铁板","电路板"这三种材料,而铁板又是由铁矿直接加工而成的,但是电路板的合成就很复杂了.

纵使有一本手册大全,也是无法对游戏提供帮助的,看下游戏开局地图:

矿产的位置很固定,因此无法对生产线的规划起到作用.

但是,如果能从原材料出发,逐渐合成愈加复杂的物品,直至最后的宇宙飞船,这样就对流水线的规划有了一定的参考作用,而这个算法也是解决这个问题的.

输入:

产品,原料1,原料2....

(输入数据为无限可列个,如果没有原料,则表示产品为可以直接获得的,无需合成)

输出:

从原材料出发,直至合成所有的物品的依赖图

下面是我做的一个例子:

输入:

iron_ore, #这里iron_ore为铁矿,是可以从游戏地图上直接获得的,无需材料合成
copper_ore,
copper_cable,copper_plate #这里铜线copper_cable,需要铜板copper_plate合成,而铜板是由下面的那个公式合成来的
copper_plate,copper_ore
iron_plate,iron_ore
electronic_circuit,iron_plate,copper_plate
iron_gear_wheel,iron_plate
inserter,electronic_circuit,iron_gear_wheel,iron_plate
science_pack_1,copper_plate,iron_gear_wheel
transport_belt,iron_plate,iron_gear_wheel

输出:

类似这样的图:

从左下角的iron_ore(铁矿)与copper_ore(铜矿),逐渐向右上方依次合成,直至合成全部产品.

代码:

import matplotlib.pyplot as plt

file = open("connections.txt", 'r')#这里的connections.txt就是一个文本,文本内容为上面输入的数据
# 原材料,用于记录原料与遍历结束后的绘图,不同层级用"##"分割
raw_material = []
# 待筛选的产品
products = []
# 绘图中的直线记录列表
line_plot = []
# 记录每一层的个数
each_level_num = []

num_in_this_level = 0
for line in file:
    line = str(line).strip("\n").split(",")
    line = [i for i in line if i]
    print(line)
    if len(line) == 1:
        raw_material.append(",".join(line))
        num_in_this_level += 1
    else:
        products.append(line)
file.close()
raw_material.append("###")
each_level_num.append(num_in_this_level)
while len(products):
    num_in_this_level = 0
    # pro:每一个待筛选产品,list
    for pro in products:
        # module:待筛选产品的组件,str
        module_in_num = 0
        for module in pro[1:]:
            module = module.replace(" ", '')
            if module in raw_material:
                module_in_num += 1
            else:
                break
            if module_in_num == len(pro) - 1:
                raw_material.append(pro[0])
                num_in_this_level += 1
                products.remove(pro)
                # 开始记录绘图的直线指向坐标
                line = []
                for module in pro[1:]:
                    target = raw_material.index(module)
                    line.append(target)
                line_plot.append(line)
    raw_material.append("###")
    each_level_num.append(int(num_in_this_level))

# raw_material生成结束,开始绘图
# 当前层数
level = 0
# 当前层中的位置
num_in_this_level = 0
# line_plot中应该绘制的下标
plt_num = 0
for material in raw_material:
    if material == "###":
        level += 1
        num_in_this_level = 0
        continue
    plt.text(level * 10, 10 * num_in_this_level + (level + 1) * 7, material)
    # print("描点" + material, level * 10, 10 * num_in_this_level + (level + 1) * 7)
    if level > 0:
        # 开始绘图
        targets = line_plot[plt_num]
        plt_num += 1
        # target为每一个需要相连的下标
        for target in targets:
            # target_level为目标层级
            target_level = 0
            for level_num in each_level_num:
                if target > level_num:
                    target -= level_num
                    target -= 1
                    target_level += 1
                else:
                    plt.plot([target_level * 10, level * 10],
                             [target * 10 + (target_level + 1) * 7, 10 * num_in_this_level + 7 * (level + 1)])
                    # print("划线")
                    # print([target_level * 5, target * 10 + (target_level + 1) * 7],
                    #       [level * 10, 10 * num_in_this_level + 7 * (level + 1)])
                    break
    num_in_this_level += 1
plt.show()

这里通过matplotlib.pyplot来绘图.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 算法硬件流水线优化方法可以分为以下几类: 1. 时序优化:通过调整时钟周期、寄存器等方式来优化流水线的时序,提高运行速度。 2. 资源利用率优化:通过合理分配资源、减少资源的浪费,提高硬件利用率,从而提高性能。 3. 数据流分析和重组优化:通过分析算法数据流,将相关数据放在相邻的硬件单元中,减少数据传输延迟,提高性能。 4. 指令调度优化:通过调整指令执行的顺序,优化指令之间的依赖关系,减少指令之间的等待时间,提高性能。 5. 内存层次优化:通过合理利用缓存,减少内存访问延迟,提高性能。 6. 算法转换优化:通过对算法的转换和重构,使其更加适合硬件实现,提高性能。 以上优化方法可以综合使用,以达到最佳的性能优化效果。 ### 回答2: 算法硬件流水线优化方法可分为以下几类: 1. 静态流水线优化:通过对算法进行静态分析,优化算法的指令执行顺序,从而减少流水线中的数据相关冲突,提高流水线的效率。例如,可以通过重新排序算法的循环迭代次序,改变指令的排列方式,减少数据相关性,以减少流水线的停顿。 2. 动态流水线优化:基于实时监控和反馈,对算法的执行过程进行动态调整和优化。这种方法可以根据实际运行时的数据特性和性能指标,动态地改变流水线的分支预测策略、指令调度策略等,以提高流水线的效率。 3. 部分流水线优化:将算法中的某些部分或阶段进行流水线化,而其他部分保持串行执行。这种方法可以将算法中耗时较长、执行时间相对稳定的部分进行流水线优化,从而提高整体算法的执行速度。 4. 多级流水线优化:将整个算法流程划分为多个流水线级别,每个级别负责不同的操作,从而实现不同阶段的并行计算。这种方法可以有效利用硬件资源,提高算法的并行度和整体执行效率。 5. 数据流水线优化:针对需要大量数据处理的算法,通过对数据进行分块处理和流水线化,实现并行计算和数据复用,提高算法的整体吞吐量和执行效率。 总之,算法硬件流水线优化方法涵盖了静态优化、动态优化、部分优化、多级优化和数据流水线优化等多种策略,可以根据具体算法、硬件平台和性能需求选择最合适的优化方法。 ### 回答3: 算法硬件流水线优化方法可以根据流水线级数和优化目标的不同进行分类。 1. 流水线级别分类: (1) 单级流水线:指只有一个阶段的流水线,每个时钟周期只能执行一条指令,无法充分利用硬件资源。 (2) 多级流水线:指有多个阶段的流水线,每个时钟周期可以同时执行多条指令,提高了指令的并行度和处理效率。 2. 优化目标分类: (1) 提高流水线吞吐率:通过增加并行性和减少冲突,尽可能使流水线每个时钟周期都能有指令在执行。 (2) 减少流水线延迟:通过减少流水线中的插入时钟周期数和提高各个阶段的工作速度来缩短整个指令执行的时间。 (3) 降低功耗和能耗:通过优化硬件电路结构、降低电压和频率等手段,减少功耗和能耗。 在优化流水线硬件的过程中,可以使用以下方法: (1) 数据冒险处理:利用数据前推和数据旁路等技术,解决由于数据依赖导致的流水线停顿和冒险。 (2) 分支预测:采用分支预测技术,通过预测分支指令的执行路径,避免由于分支导致的流水线清空以及冲刷。 (3) 指令调度:通过对指令执行顺序的优化,如乱序执行和超标量处理等,提高指令级并行度。 (4) 缓存和预取:采用高速缓存和指令预取技术,减少指令访存延迟,提高指令的访问效率。 (5) 硬件软件协同设计:通过硬件和软件的结合,进行指令和数据的优化,提高流水线的执行效率和吞吐率。 总的来说,算法硬件流水线的优化方法可以从流水线级别和优化目标两个方面进行分类,并通过数据冒险处理、分支预测、指令调度、缓存和预取以及硬件软件协同设计等方法来实现优化。这些方法的选择取决于具体的应用场景和优化目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值