diff --git a/Assets/Scripts/DataImporter.cs b/Assets/Scripts/DataImporter.cs index 27b78f6..41394a6 100644 --- a/Assets/Scripts/DataImporter.cs +++ b/Assets/Scripts/DataImporter.cs @@ -2,9 +2,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Runtime.Serialization; -using Unity.VisualScripting; -using UnityEngine; namespace Parking { @@ -14,29 +11,26 @@ namespace Parking public static void ReadFile(string path) { - var fileData = File.ReadAllText(path); - var lines = fileData.Split("\n"[0]); - var counter = 0; - foreach (var line in lines) - { - if(line == "") + string fileData = File.ReadAllText(path); + string[] lines = fileData.Split("\n"[0]); + int counter = 0; + foreach (string line in lines) { + if (line == "") continue; - - if (counter == 0) - { + + if (counter == 0) { counter++; continue; } - var lineData = line.Trim().Split(','); - var preference = lineData[0] == "" + string[] lineData = line.Trim().Split(','); + ParkingPreference preference = lineData[0] == "" ? ParkingPreference.Any : lineData[1] == "P" ? ParkingPreference.Front : ParkingPreference.Back; Size size; - switch (lineData[2]) - { + switch (lineData[2]) { case "Mały": size = Size.A; break; @@ -54,18 +48,23 @@ namespace Parking break; } - DateTime realArrival = DateTime.Parse(lineData[5].Contains(':') ? lineData[5] : lineData[5] + ":00", CultureInfo.InvariantCulture); - DateTime realDeparture = DateTime.Parse(lineData[6].Contains(':') ? lineData[6] : lineData[6] + ":00", CultureInfo.InvariantCulture); - DateTime plannedArrival = DateTime.Parse(lineData[3].Contains(':') ? lineData[3] : lineData[3] + ":00", CultureInfo.InvariantCulture); - DateTime plannedDeparture = DateTime.Parse(lineData[4].Contains(':') ? lineData[4] : lineData[4] + ":00", CultureInfo.InvariantCulture); + DateTime realArrival = DateTime.Parse(lineData[5].Contains(':') ? lineData[5] : lineData[5] + ":00", + CultureInfo.InvariantCulture); + DateTime realDeparture = DateTime.Parse(lineData[6].Contains(':') ? lineData[6] : lineData[6] + ":00", + CultureInfo.InvariantCulture); + DateTime plannedArrival = DateTime.Parse(lineData[3].Contains(':') ? lineData[3] : lineData[3] + ":00", + CultureInfo.InvariantCulture); + DateTime plannedDeparture = + DateTime.Parse(lineData[4].Contains(':') ? lineData[4] : lineData[4] + ":00", + CultureInfo.InvariantCulture); - if (!Int32.TryParse(lineData[0], out var priority)) + if (!int.TryParse(lineData[0], out int priority)) priority = 3; - if (!Int32.TryParse(lineData[7], out var updateInterval)) + if (!int.TryParse(lineData[7], out int updateInterval)) updateInterval = 3; - - Driver driver = new Driver(size, counter, preference, priority, updateInterval); + + Driver driver = new(size, counter, preference, priority, updateInterval); driver.Times = new[] {plannedArrival, plannedDeparture, realArrival, realDeparture}; Drivers.Add(driver); diff --git a/Assets/Scripts/Driver.cs b/Assets/Scripts/Driver.cs index 9a79dc5..c25ccc7 100644 --- a/Assets/Scripts/Driver.cs +++ b/Assets/Scripts/Driver.cs @@ -1,20 +1,20 @@ using System; -using Unity.VisualScripting; using UnityEngine; +using Object = UnityEngine.Object; namespace Parking { public class Driver { - public readonly ParkingPreference ParkingPreference; public readonly int Number; + public readonly ParkingPreference ParkingPreference; public readonly Size Size; - public DateTime[] Times; - public Spot Spot; - public bool Parked = false; public GameObject GameObject; - public bool Rejected = false; + public bool Parked; public int Priority; + public bool Rejected; + public Spot Spot; + public DateTime[] Times; public int UpdateInterval; public Driver(Size size, int number, ParkingPreference parkingPreference, int priority, int updateInterval) @@ -25,31 +25,31 @@ namespace Parking Priority = priority; UpdateInterval = updateInterval; } - + public void Reset() { Parked = false; Rejected = false; - if(Spot != null) + if (Spot != null) Spot.Free = true; Spot = null; - if(GameObject != null) - GameObject.Destroy(GameObject); + if (GameObject != null) + Object.Destroy(GameObject); } } public class Spot : IComparable { - public Size Size; + public bool AlignToTop = true; public bool Flipped; - public GameObject GameObject; public bool Free = true; + public GameObject GameObject; + public int Lane = 0; + public ParkingPreference ParkingDirection = ParkingPreference.Any; + public bool Perpendicular = true; public bool Reserved = false; public int ReservedPriority = 0; - public ParkingPreference ParkingDirection = ParkingPreference.Any; - public int Lane = 0; - public bool Perpendicular = true; - public bool AlignToTop = true; + public Size Size; public Spot(Size size, bool flipped) { @@ -59,14 +59,15 @@ namespace Parking public Spot() { - + } + public int CompareTo(Spot obj) { return Size.CompareTo(obj.Size); } } - + public enum Size { A = 0, diff --git a/Assets/Scripts/InitialConfigurationGenerator.cs b/Assets/Scripts/InitialConfigurationGenerator.cs index ca5a2f0..1896dc1 100644 --- a/Assets/Scripts/InitialConfigurationGenerator.cs +++ b/Assets/Scripts/InitialConfigurationGenerator.cs @@ -13,27 +13,25 @@ namespace Parking public int[,] FindSolution() { - PreProcessCombinations(out var spotCountsPerpendicular, out var spotCountsParallel); + PreProcessCombinations(out int[] spotCountsPerpendicular, out int[,] spotCountsParallel); - var spotsCreated = new int[4, 4]; - - var maxCount = TestCombinations(spotCountsPerpendicular, spotCountsParallel, spotsCreated); + int[,] spotsCreated = new int[4, 4]; + + int maxCount = TestCombinations(spotCountsPerpendicular, spotCountsParallel, spotsCreated); Debug.Log($"Best solution count {maxCount}"); - int[] counts = new int[] {0, 0, 0, 0}; - for (int i = 0; i < spotsCreated.GetLength(0); i++) { - for (int j = 0; j < spotsCreated.GetLength(1); j++) { - counts[j] += spotsCreated[i, j]; - } - } - - var countsString = $"Małe: {counts[0]} Średnie: {counts[1]} Duże: {counts[2]} " + - $"Suma: {counts.Sum() + 1}"; + int[] counts = {0, 0, 0, 0}; + for (int i = 0; i < spotsCreated.GetLength(0); i++) + for (int j = 0; j < spotsCreated.GetLength(1); j++) + counts[j] += spotsCreated[i, j]; + + string countsString = $"Małe: {counts[0]} Średnie: {counts[1]} Duże: {counts[2]} " + + $"Suma: {counts.Sum() + 1}"; ParkingManager.Instance.UpdateText(countsString); Debug.Log(countsString); - + return spotsCreated; } @@ -42,20 +40,19 @@ namespace Parking int[] counts = {0, 0, 0}; counts[(int) Size.A] += 2; counts[(int) Size.B] += 2; - var fixedCarSpots = 0; - foreach (var c in counts) fixedCarSpots += c; + int fixedCarSpots = 0; + foreach (int c in counts) fixedCarSpots += c; - var countsString = $"Małe: {counts[0]} Średnie: {counts[1]} Duże: {counts[2]} " + - $"Suma: {counts.Sum() + 1}"; + string countsString = $"Małe: {counts[0]} Średnie: {counts[1]} Duże: {counts[2]} " + + $"Suma: {counts.Sum() + 1}"; ParkingManager.Instance.UpdateText(countsString); Debug.Log(countsString); int maxCount = 0; - int[] maxComb = new []{1, 1, 1, 1}; + int[] maxComb = {1, 1, 1, 1}; // Debug.Log("Printing top 5 combinations..."); - foreach (var comb in Combinations) - { + foreach (int[] comb in Combinations) { int res = TryFillCombination(comb.ToArray(), spotCountsPerpendicular, spotCountsParallel, counts, spotsCreated); if (res > maxCount) { @@ -70,35 +67,36 @@ namespace Parking return maxCount; } - private int TryFillCombination(int[] sizeIds, int[] spotCountsPerpendicularRef, int[,] spotCountsParallelRef, int[] counts, int[,] spotsCreated, bool copyToArray = false) + private int TryFillCombination(int[] sizeIds, int[] spotCountsPerpendicularRef, int[,] spotCountsParallelRef, + int[] counts, int[,] spotsCreated, bool copyToArray = false) { - var spotsCreatedTemp = new int[4, 4]; - - for (var i = 0; i < spotsCreatedTemp.GetLength(0); i++) - for (var j = 0; j < spotsCreatedTemp.GetLength(1); j++) + int[,] spotsCreatedTemp = new int[4, 4]; + + for (int i = 0; i < spotsCreatedTemp.GetLength(0); i++) + for (int j = 0; j < spotsCreatedTemp.GetLength(1); j++) spotsCreatedTemp[i, j] = 0; - - var spotCountsPerpendicular = new int[spotCountsPerpendicularRef.Length]; + + int[] spotCountsPerpendicular = new int[spotCountsPerpendicularRef.Length]; spotCountsPerpendicularRef.CopyTo((Span) spotCountsPerpendicular); - var spotCountsParallel = new int[spotCountsParallelRef.GetLength(0), spotCountsParallelRef.GetLength(1)]; - for (var i = 0; i < spotCountsParallelRef.GetLength(0); i++) - for (var j = 0; j < spotCountsParallelRef.GetLength(1); j++) + int[,] spotCountsParallel = new int[spotCountsParallelRef.GetLength(0), spotCountsParallelRef.GetLength(1)]; + for (int i = 0; i < spotCountsParallelRef.GetLength(0); i++) + for (int j = 0; j < spotCountsParallelRef.GetLength(1); j++) spotCountsParallel[i, j] = spotCountsParallelRef[i, j]; float[] spotSizes = {4, 4.5f, 5}; foreach (Driver driver in DataImporter.Drivers) { - List laneIds = new List(){0, 1, 2, 3}; + var laneIds = new List {0, 1, 2, 3}; if (driver.Size == Size.C) laneIds.Reverse(); - + for (int i = 0; i < 4; i++) { int laneId = laneIds[i]; bool freeSpotsAvailable = spotCountsPerpendicular[laneId] != 0; - bool carFits = AvailableSizesCombinations[sizeIds[laneId]] >= spotSizes[(int)driver.Size]; + bool carFits = AvailableSizesCombinations[sizeIds[laneId]] >= spotSizes[(int) driver.Size]; if (carFits && freeSpotsAvailable) { spotCountsPerpendicular[laneId]--; - spotsCreatedTemp[laneId, (int)driver.Size]++; + spotsCreatedTemp[laneId, (int) driver.Size]++; break; } } @@ -106,16 +104,16 @@ namespace Parking int count = 0; - - for (var i = 0; i < spotsCreatedTemp.GetLength(0); i++) - for (var j = 0; j < spotsCreatedTemp.GetLength(1); j++) + + for (int i = 0; i < spotsCreatedTemp.GetLength(0); i++) + for (int j = 0; j < spotsCreatedTemp.GetLength(1); j++) count += spotsCreatedTemp[i, j]; if (!copyToArray) return count; - - for (var laneId = 3; laneId >= 0; laneId--) { + + for (int laneId = 3; laneId >= 0; laneId--) if (spotCountsPerpendicular[laneId] != 0) { if (sizeIds[laneId] == 0) { // empty @@ -129,13 +127,12 @@ namespace Parking spotCountsPerpendicular[laneId] = 0; } } - } - - for (var i = 0; i < spotsCreatedTemp.GetLength(0); i++) - for (var j = 0; j < spotsCreatedTemp.GetLength(1); j++) + + for (int i = 0; i < spotsCreatedTemp.GetLength(0); i++) + for (int j = 0; j < spotsCreatedTemp.GetLength(1); j++) spotsCreated[i, j] = spotsCreatedTemp[i, j]; - + return count; } @@ -151,10 +148,10 @@ namespace Parking spotCountsPerpendicular[3] = Mathf.FloorToInt((ParkingManager.Width - 5.5f - 3.6f * 2 - 2.5f * 4) / _spotWidth); spotCountsParallel = new int[4, 4]; - for (var i = 0; i < 3; i++) - for (var j = 0; j < spotLengthsParallel.Length; j++) + for (int i = 0; i < 3; i++) + for (int j = 0; j < spotLengthsParallel.Length; j++) spotCountsParallel[i, j] = Mathf.FloorToInt((ParkingManager.Width - 5.5f) / spotLengthsParallel[j]); - for (var j = 0; j < spotLengthsParallel.Length; j++) + for (int j = 0; j < spotLengthsParallel.Length; j++) spotCountsParallel[3, j] = Mathf.FloorToInt((ParkingManager.Width - 5.5f - 3.6f * 2 - 2.5f * 4) / spotLengthsParallel[j]); // Debug.Log("" + @@ -164,15 +161,15 @@ namespace Parking // Debug.Log("Generating combinations..."); int[] arr = {0, 1, 2, 3, 4}; - var n = arr.Length; - var r = 4; + int n = arr.Length; + int r = 4; CombinationRepetition(arr, n, r); // Debug.Log($"Found {Combinations.Count} available combinations"); // Debug.Log("Sorting available combinations..."); Combinations.Sort(UsesMoreSpaceComparator); } - + private int UsesMoreSpaceComparator(int[] a1, int[] a2) { float sum1 = 0; @@ -183,7 +180,7 @@ namespace Parking return -1 * sum1.CompareTo(sum2); } - + private int BiggerSizeComparator(Driver d1, Driver d2) { int sizeComp = d1.Size.CompareTo(d2.Size); @@ -195,14 +192,13 @@ namespace Parking private void CombinationRepetitionUtil(int[] chosen, int[] arr, int index, int r, int start, int end) { - if (index == r) - { + if (index == r) { // combinations.Add(new[] {arr[chosen[0]]}); var tempArr = new List(r); - for (var i = 0; i < r; i++) tempArr.Add(arr[chosen[i]]); - var hasEnoughSpace = tempArr.Select(x => AvailableSizesCombinations[x]).Sum() <= - ParkingManager.Height - 11; - var contains5 = tempArr.Contains(4); + for (int i = 0; i < r; i++) tempArr.Add(arr[chosen[i]]); + bool hasEnoughSpace = tempArr.Select(x => AvailableSizesCombinations[x]).Sum() <= + ParkingManager.Height - 11; + bool contains5 = tempArr.Contains(4); tempArr.Sort(); if (hasEnoughSpace && contains5) Combinations.Add(tempArr.ToArray()); @@ -210,8 +206,7 @@ namespace Parking return; } - for (var i = start; i <= end; i++) - { + for (int i = start; i <= end; i++) { chosen[index] = i; CombinationRepetitionUtil(chosen, arr, index + 1, r, i, end); @@ -220,7 +215,7 @@ namespace Parking private void CombinationRepetition(int[] arr, int n, int r) { - var chosen = new int[r + 1]; + int[] chosen = new int[r + 1]; CombinationRepetitionUtil(chosen, arr, 0, r, 0, n - 1); } } diff --git a/Assets/Scripts/ParkingManager.cs b/Assets/Scripts/ParkingManager.cs index 1454913..a1b706b 100644 --- a/Assets/Scripts/ParkingManager.cs +++ b/Assets/Scripts/ParkingManager.cs @@ -50,7 +50,7 @@ namespace Parking rejectedText.text = $"Małe: {_rejectedDrivers[0]} Średnie: {_rejectedDrivers[1]} " + $"Duże: {_rejectedDrivers[2]}"; GenerateEmergencyPlan(); - + DataImporter.ReadFile("Assets/Data/Tablica4.csv"); InitialConfigurationGenerator generator = new(); ArrangeSpots(generator.FindSolution()); @@ -109,6 +109,7 @@ namespace Parking ReserveInitialSpots(); ResetDrivers(); } + return; } @@ -243,8 +244,7 @@ namespace Parking private void ReconfigureSpots() { - List prefabs = new List() - {spotPrefabA, spotPrefabB, spotPrefabC}; + var prefabs = new List {spotPrefabA, spotPrefabB, spotPrefabC}; int[] freeSpots = GetFreeSpotCount(); var nextCars = GetNextCars(10); int[] plannedSpots = {0, 0, 0, 0}; @@ -263,35 +263,34 @@ namespace Parking bool foundReplacement = true; while (foundReplacement && neededSpots[size] != 0) { foundReplacement = false; - foreach (var t in _spotMap) { - foreach (Spot spot in t) { - if ((int) spot.Size > size && spot.Free && spot.Lane != 3 && spot.Size != Size.D) { - foundReplacement = true; - - float diff = (_spotHeights[(int)spot.Size] - _spotHeights[size]) / 2.0f; - if (!spot.AlignToTop) - diff *= -1; - - spot.Size = (Size) size; - Vector3 position = Vector3.zero; - Quaternion rotation = Quaternion.identity; - if (spot.GameObject != null) { - position = spot.GameObject.transform.position; - rotation = spot.GameObject.transform.rotation; - Destroy(spot.GameObject); - } + foreach (var t in _spotMap) + foreach (Spot spot in t) + if ((int) spot.Size > size && spot.Free && spot.Lane != 3 && spot.Size != Size.D) { + foundReplacement = true; + float diff = (_spotHeights[(int) spot.Size] - _spotHeights[size]) / 2.0f; + if (!spot.AlignToTop) + diff *= -1; - spot.GameObject = Instantiate(prefabs[size], - position + new Vector3(0, diff, 0), rotation, mainPlanContainer); - - goto whileEnd; + spot.Size = (Size) size; + Vector3 position = Vector3.zero; + Quaternion rotation = Quaternion.identity; + if (spot.GameObject != null) { + position = spot.GameObject.transform.position; + rotation = spot.GameObject.transform.rotation; + Destroy(spot.GameObject); } + + + spot.GameObject = Instantiate(prefabs[size], + position + new Vector3(0, diff, 0), rotation, mainPlanContainer); + + goto whileEnd; } - } - whileEnd:; + + whileEnd: ; } - } + } } } @@ -398,7 +397,7 @@ namespace Parking spotMap[i][j].ParkingDirection = frontalParking ? ParkingPreference.Front : ParkingPreference.Back; spotMap[i][j].Lane = i; - + currentX += 2.25f; flipped = !flipped; @@ -437,19 +436,19 @@ namespace Parking GameObject spawnedSpot; - int[] emergencyMap = new[] {12, 27, 27, 20}; - - for (int j = 0; j < emergencyMap[i]; j++) { + int[] emergencyMap = {12, 27, 27, 20}; + for (int j = 0; j < emergencyMap[i]; j++) if (i == 0) { - Vector3 position = new Vector3(currentX, currentY + 2.25f/2.0f, 0); + Vector3 position = new(currentX, currentY + 2.25f / 2.0f, 0); spawnedSpot = Instantiate(Instance.spotPrefabC, position, Quaternion.Euler(new Vector3(0, 0, 90)), emergencyPlanContainer); - + currentX -= 5; - }else { + } + else { bool alignTop = i % 2 != 0; - Vector3 position = new Vector3(currentX, currentY, 0); + Vector3 position = new(currentX, currentY, 0); spawnedSpot = Instantiate(Instance.spotPrefabC, position, Quaternion.Euler(new Vector3(0, 0, 0)), emergencyPlanContainer); @@ -460,7 +459,6 @@ namespace Parking currentX += 2.25f; } - } } }