在我的程序中,我有一个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的自定义处理程序)
此代码只是生成随机排列,但无法检查之前是否已生成排列,而且我不会存储以前使用的所有排列的列表。
有没有合理的方法可以做到这一点?
编辑:在查看评论后,根据该计划的预期用途,我已经确定遗传算法实际上是最好的方法。
答案 0 :(得分:1)
我会考虑遗传算法,因为搜索所有可能选项的整个空间是不可行的。
基本方法是:
当您发现代代相传的改善低于某个阈值时,您通常会停止。
该算法当然依赖于数值&#34; bestness&#34;比较从孩子到孩子和世代相传。
使用此算法执行搜索通常非常快。但是你必须记住你正在做的就是找到本地最大值,即在你的启动解决方案附近的本地最佳解决方案。因此,您经常使用不同的起始解决方案一次又一次地运行计算。
它就像在丘陵景观中的随机点着陆而只是向上走。你最终到达了一个高峰,通常很快 - 但它可能不是整个山脉中的最高峰。
然而,如果您衡量的是“最佳状态”,那么这项工作将无法发挥作用。不会在所有可能状态的空间中合理顺利地改变。想象一下混沌,锯齿状的景观,悬崖垂直的墙壁,移动一小部分可能不会产生最佳的&#34;最佳状态&#34;。
答案 1 :(得分:0)
您的2D数组19by16也可以表示为长度为19x16 = 304的1D数组 所以,如果我理解正确,你需要生成长度为304的字符串 其中单个字符的所有可能值都是0或1或2 简单的可以生成这个,你可以肯定不会有两次相同的结果。 在完成其简单任务以填充2D数组
之后