【问题标题】:Complex Decision Tree Generator复杂决策树生成器
【发布时间】:2015-10-08 13:34:16
【问题描述】:

我正在尝试编写一种二叉树,但它非常大,我不想将每个元素都保存在内存中。我更愿意在需要时使用生成器函数来构造每个节点。

树模拟游戏中的决策。游戏从一帧 n 选项开始。玩家选择两个选项(不能相同),并使用不同的操作组合它们。因此,一个框架有 (n * (n-1)) * t 个可能的步骤,其中 t 是操作数。

一旦做出决定,就会产生一个新的 n - 1 个选项框架,其中上次选择的两个选项已被删除,但这些选项的结果已被包含在内。现在可能的不同选择的数量是 ((n - 1) * (n - 2)) * t。这个过程一直持续到当前帧中的选项数

我想以特定方式遍历决策树中的所有可能路线 - 完全遍历每条路线一直到最后一帧(其中 n = 1),然后再继续下一条可能的路线,从最大的帧(size = n)开始,但在每个帧中采用下一系列选择。除了我在这里描述的内容之外,这些决定的结果对于这些目的来说并不重要。所有路线都必须一直到最后一帧(n = 1)——我不需要包括部分遍历的路线。

我有以下代码,我想生成要做出的决策的地图。 :

public class PathStep
{
    public int FrameSize;
    public int Index1;
    public int Index2;
    public int Operation;

    public override string ToString()
    {
        return String.Format("F:{0} I1:{1} I2:{2} O{3}", this.FrameSize, this.Index1, this.Index2, this.Operation);
    }
}

public class Frame
{
    public int Size { get; private set; }

    public Frame(int size)
    {
        this.Size = size;
    }

    public IEnumerable<PathStep> AllPossibleSteps()
    {
        return this.step_helper(this.Size, 0);
    }

    private IEnumerable<PathStep> step_helper(int frame_size, int depth)
    {
        throw new NotImplementedException(); //TODO
    }


    private static IEnumerable<Frame> frames_in_game(int initial_frame_size)
    {
        for (var i = initial_frame_size; i > 0; i--)
            yield return new Frame(i);
    }

    private static IEnumerable<PathStep> steps_in_frame(int frame_size)
    {
        int op_count = Operation.Operations().Count();

        for (var first = 0; first < frame_size; first++)
        {
            for (var second = 0; second < frame_size - 1; second++)
            {
                for (var i = 0; i < op_count; i++)
                {
                    yield return new PathStep() { FrameSize = frame_size, Index1 = first, Index2 = second, Operation = i };
                }
            }
        }
    }



}

我将如何填写我的 step_helper 方法来映射树中每个可能的决策变化,并按照连续游戏的顺序产生它们?我需要涵盖所有可能的路线,yield return 在给定路线中按顺序执行的每个步骤,但我采取完整路线的顺序无关紧要,只要我涵盖所有路线即可。

【问题讨论】:

    标签: c# algorithm data-structures tree generator


    【解决方案1】:

    我重新思考了我的问题,并意识到以下几点:

    如果 n * (n -1) * t = options_per_frame

    然后我可以将每条路径表示为一个选项网格,它(如果索引为 1)开始于:

       let t = 4
    
       n |n-1|t | n = ?
       1 |1  |1 | 6
       1 |1  |1 | 5
       1 |1  |1 | 4
       1 |1  |1 | 3
       1 |1  |1 | 2
    

    接着是:

       n |n-1|t | n = ?
       1 |1  |1 | 6
       1 |1  |1 | 5
       1 |1  |1 | 4
       1 |1  |1 | 3
       1 |1  |2 | 2
    

    结尾
       n |n-1|t | n = ?
       6 |5  |4 | 6
       5 |4  |4 | 5
       4 |3  |4 | 4
       3 |2  |4 | 3
       2 |1  |4 | 2
    

    单元格中的每个值表示所选选项的索引/ID,标题指定可以放入单元格中的最大值。所以,你可以把它想象成一个时钟——不同大小的“齿轮”被用来相互旋转,这样变化就会随着幅度的减小而递减。随着时间的推移,1000 毫秒每秒“旋转”,60 秒“旋转”一小时,24 小时“旋转”一天等等。所以我创建了一个 PathGrid 类,它返回网格的下一次迭代,这让我可以跟随每个一路通过,无需建模树或使用递归。我已经上传了我的解决方案here

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 2013-02-08
      • 2012-06-29
      • 2010-10-22
      • 2020-01-22
      • 2019-09-04
      • 2011-06-23
      • 2017-05-14
      • 2015-06-17
      相关资源
      最近更新 更多