我目前正在研究一个应该解决3D拼图的算法。 但是我遇到了一个问题,我使用的算法是第一个搜索深度,它似乎运行良好,直到我“获得STORAGE_ERROR:EXCEPTION_STACK_OVERFLOW”。我不太确定它为什么不起作用。任何猜测为什么这不起作用?存储错误 - 第一个深度搜索算法
我想要这个算法: 它需要一个List,一个图形和一个目标。对于这个例子,列表是7部分长。它试图在第一个坐标中输入该部分。如果它不适合,它会旋转直到它合适,然后与其余的(6部分)一起自我调用。如果零件以24种方式旋转(所有可能的方式旋转一个3D零件),然后它移动到另一个坐标,然后重新开始尝试拟合。当所有部分都没有了或没有任何工作时,它应该退出,并且我有另一个算法在同一个列表中发送另一个订单到这个算法中。
我还希望算法看看最后的坐标是否与目标不匹配,那么它应该只是回溯并尝试找到另一个解决方案。
下面是一些代码:
procedure Pseudo(Parts : in out List_Type; Figure : in out Figure_Type; Goal : in out Figure_Type; LastCoord : in out Integer) is
Unchanged : Part_Type := Parts.Data;
Next : boolean := False;
UnchangedFigure : Figure_Type;
begin
UnchangedFigure := Figure;
if Empty(Parts) then
raise Finished;
else
for I in 1..24 loop
RotNumber(Parts.Data,I); -- rotera
if Check(Parts.Data,Figure) then -- test om den platsar
Maincheck(Parts.Data,Figure,Goal,Next);
if Next then
Unchanged := Parts.Data;
Append_Part(Parts.Data,Figure);
Remove_First(Parts);
Next := False;
Pseudo(Parts,Figure,Goal,LastCoord);
Next := False;
Figure := UnchangedFigure;
Insert_First(Unchanged,Parts);
Figure.CoordX := 0;
Figure.CoordY := 0;
Figure.CoordZ := 0;
end if;
end if;
Parts.Data := Unchanged;
end loop;
end if;
-- if LastCoord /= 7 then --(Original
-- if To_String(Figure.Data)(LastCoord) /= To_String(Goal.Data)(LastCoord) then
-- Put("over");
-- return;
-- end if;
-- end if;
LastCoord := Figure.CoordZ*Figure.X*Figure.Y + (Figure.Y-Figure.CoordY-1)*(Figure.X) + Figure.CoordX +1;
if Figure.CoordY < Figure.Y-1 then
Figure.CoordY := Figure.CoordY +1;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordY = Figure.Y-1 then
if Figure.CoordX < Figure.X-1 then
Figure.CoordX := Figure.CoordX +1;
Figure.CoordY := 0;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordX = Figure.X-1 then
if Figure.CoordZ < Figure.Z-1 then
Figure.CoordZ := Figure.CoordZ +1;
Figure.CoordX := 0;
Figure.CoordY := 0;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordZ = Figure.Z-1 then
return;
end if;
end if;
end if;
end Pseudo;
就在我头顶,我建议你确认你的递归正常结束。失控递归是一种简单易行的方法,可以打击堆栈并引发Storage_Error。 – 2013-03-25 15:32:54
你好,我认为你是对的,它可能是一个无限递归的地方。但是,由于可能的“分支”数量过多,我仍然不确定它是否按预期工作。 – user2207734 2013-03-25 16:17:21
@ user2207734,你需要检查你分支的方式,然后 – Alexander 2013-03-25 16:26:10