循环遍历大型2D阵列的每个组合

时间:2015-02-14 17:55:59

标签: c#

在我的程序中,我有一个2D数组对象:

Component[,] layout = new Component[19,16];

组件可以有三种可能性。

0 - Empty
1 - Cell
2 - Vent

我需要以编程方式为此2D数组生成可能的排列,然后通过方法运行它,然后生成下一个排列。

我需要生成所有可能的排列,而不是两次相同的排列。

我会使用嵌套for循环,但这需要304个循环嵌套在一起,我宁愿不这样做。

目前我正在使用以下内容:

for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                Component comp;
                int rand = rng.Next(0, 3);

                switch (rand)
                {
                    case 1:
                        comp = Component.Cell;
                        break;
                    case 2:
                        comp = Component.Vent;
                        break;
                    default:
                        comp = null;
                        break;
                }

                Components[i, j] = comp;
            }
        }

(rng是RNGCryptoServiceProvider的自定义处理程序)

此代码只是生成随机排列,但无法检查之前是否已生成排列,而且我不会存储以前使用的所有排列的列表。

有没有合理的方法可以做到这一点?

编辑:在查看评论后,根据该计划的预期用途,我已经确定遗传算法实际上是最好的方法。

2 个答案:

答案 0 :(得分:1)

我会考虑遗传算法,因为搜索所有可能选项的整个空间是不可行的。

基本方法是:

  • 随机选择一个起始状态(正如您所做)
  • 生成X子状态,这些状态是起始状态的小扰动。扰动只是父状态的一个小变化。例如,随机更改少量单元格
  • 从这组孩子中选择最好的&#34;
  • 重复

当您发现代代相传的改善低于某个阈值时,您通常会停止。

该算法当然依赖于数值&#34; bestness&#34;比较从孩子到孩子和世代相传。

使用此算法执行搜索通常非常快。但是你必须记住你正在做的就是找到本地最大值,即在你的启动解决方案附近的本地最佳解决方案。因此,您经常使用不同的起始解决方案一次又一次地运行计算。

它就像在丘陵景观中的随机点着陆而只是向上走。你最终到达了一个高峰,通常很快 - 但它可能不是整个山脉中的最高峰。

然而,如果您衡量的是“最佳状态”,那么这项工作将无法发挥作用。不会在所有可能状态的空间中合理顺利地改变。想象一下混沌,锯齿状的景观,悬崖垂直的墙壁,移动一小部分可能不会产生最佳的&#34;最佳状态&#34;。

答案 1 :(得分:0)

您的2D数组19by16也可以表示为长度为19x16 = 304的1D数组 所以,如果我理解正确,你需要生成长度为304的字符串 其中单个字符的所有可能值都是0或1或2 简单的可以生成这个,你可以肯定不会有两次相同的结果。 在完成其简单任务以填充2D数组

之后