mirror of
https://github.com/dancojocaru2000/ai-project-idastar.git
synced 2025-02-23 00:49:34 +02:00
Added IDA* control step
Added flow control to find start+destination points, and increase the threshold if a search doesn't reach the destination. Next step: implement search.
This commit is contained in:
parent
d4ec7b36d5
commit
1e70b4c1f1
1 changed files with 75 additions and 6 deletions
77
IDAstar.cs
77
IDAstar.cs
|
@ -1,7 +1,7 @@
|
|||
using System.Collections.ObjectModel;
|
||||
using System.Threading.Channels;
|
||||
|
||||
namespace IdaStar {
|
||||
namespace IdaStar
|
||||
{
|
||||
|
||||
public enum CellState {
|
||||
EMPTY,
|
||||
|
@ -41,6 +41,12 @@ namespace IdaStar {
|
|||
}
|
||||
}
|
||||
|
||||
public record struct Point(int Row, int Column) {
|
||||
public int ManhattanDistance(Point otherPoint) {
|
||||
return Math.Abs(Row - otherPoint.Row) + Math.Abs(Column - otherPoint.Column);
|
||||
}
|
||||
}
|
||||
|
||||
public class WorkingBoard {
|
||||
readonly List<List<CellState>> _board;
|
||||
|
||||
|
@ -65,11 +71,74 @@ namespace IdaStar {
|
|||
|
||||
public event Action<WorkingBoard>? AlgorithmStep;
|
||||
|
||||
public void RunIdaStar() {
|
||||
throw new NotImplementedException();
|
||||
/// <summary>
|
||||
/// Clean board, making it ready for a new run.
|
||||
///
|
||||
/// This is achieved by setting all PATH states to EMPTY states.
|
||||
/// </summary>
|
||||
public void Reset() {
|
||||
foreach (var row in _board) {
|
||||
for (var i = 0; i < row.Count; i++) {
|
||||
if (row[i] == CellState.PATH) {
|
||||
row[i] = CellState.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RunIdaStar() => RunIdaStar(0, 1, (p1, p2) => p1.ManhattanDistance(p2));
|
||||
public void RunIdaStar<Comp>(Comp zero, Comp increment, Func<Point, Point, Comp> heuristic) where Comp: IComparable<Comp> {
|
||||
// Don't run algorithm on a "dirty" board
|
||||
// "dirty" = the algorithm was already ran before
|
||||
if (_board.Select((row) => row.Where((state) => state == CellState.PATH).Count()).Any((cnt) => cnt > 0)) {
|
||||
throw new DirtyBoardException();
|
||||
}
|
||||
|
||||
Point findPoint(CellState neededState) {
|
||||
for (var i = 0; i < _board.Count; i++) {
|
||||
for (var j = 0; j < _board[i].Count; j++) {
|
||||
if (_board[i][j] == CellState.START) {
|
||||
return new(i, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new NoPoint(neededState);
|
||||
}
|
||||
|
||||
Point startPoint = findPoint(CellState.START);
|
||||
|
||||
Point destinationPoint = findPoint(CellState.DESTINATION);
|
||||
|
||||
Comp search(Point current, Comp cost, Comp threshold) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
var threshold = heuristic(startPoint, destinationPoint);
|
||||
while (threshold.CompareTo(zero) == 0) {
|
||||
threshold = search(startPoint, zero, threshold);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class DirtyBoardException : System.Exception
|
||||
{
|
||||
public DirtyBoardException() : base("The board is dirty (contains path cells)") { }
|
||||
public DirtyBoardException(System.Exception inner) : base("The board is dirty (contains path cells)", inner) { }
|
||||
protected DirtyBoardException(
|
||||
System.Runtime.Serialization.SerializationInfo info,
|
||||
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class NoPoint : System.Exception
|
||||
{
|
||||
public NoPoint(CellState neededState) : base($"The board doesn't contain any {neededState} point") { }
|
||||
public NoPoint(CellState neededState, System.Exception inner) : base($"The board doesn't contain any {neededState} point", inner) { }
|
||||
protected NoPoint(
|
||||
System.Runtime.Serialization.SerializationInfo info,
|
||||
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue