JohnsonMethod.cs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. namespace MathModTasks
  8. {
  9. class JohnsonMethod
  10. {
  11. string readPath;
  12. string savePath;
  13. List<Item> items = new List<Item>(); //Список предметов, загруженный из файла
  14. List<Item> optimalItems = new List<Item>(); //Список предметов после оптимального распределения
  15. List<int> prostoi = new List<int>(); //Список простоев станков
  16. List<int> optimalProstoi = new List<int>(); //Список простоев станков после оптимального распределения
  17. public JohnsonMethod(string readPath, string savePath)
  18. {
  19. this.readPath = readPath;
  20. this.savePath = savePath;
  21. }
  22. void SortElements() //Метод сортировки элементов по массиву
  23. {
  24. List<Item> aList = new List<Item>(); //Первый временный список, для дальнейшего распределения
  25. List<Item> bList = new List<Item>(); //Второй временный список, для дальнейшего распределения
  26. foreach (Item item in items)
  27. {
  28. if (item.aTime <= item.bTime) //Если время на первом станке <=, чем на втором, то идет добавление в первый временный список
  29. {
  30. aList.Add(item);
  31. }
  32. else bList.Add(item); //В ином случае записывается во второй временный список
  33. }
  34. aList.Sort(); //Данный список сортируется в порядке возрастания времени на первом станке (см. структуру)
  35. bList.Sort(); //Данный список сортируется в порядке возрастания времени на втором станке (см. структуру)
  36. bList.Reverse(); //Далее данный список переворачивается для дальнейшего объединения
  37. foreach (Item item in aList) optimalItems.Add(item); //Все данные из первого списка записываются в новый список
  38. foreach (Item item in bList) optimalItems.Add(item); //Все данные из второго списка записываются в новый список
  39. }
  40. void FindOptimal(List<Item> items, List<int> prostoi)
  41. {
  42. int count = 0; //Временная переменная для подсчета простоев
  43. for (int i = 0; i < items.Count; i++)
  44. {
  45. if (i != 0) //Если это не первый элемент в первом списке
  46. count += (items[i].aTime - items[i - 1].bTime); //То вычисляется по этой формуле
  47. else //Если первый, то просто записывается
  48. count += items[i].aTime;
  49. prostoi.Add(count); //И это записывается в лист простоев
  50. }
  51. }
  52. public void Calculate()
  53. {
  54. ReadSaveData.ReadData(readPath, ref items);
  55. SortElements();
  56. FindOptimal(items, prostoi);
  57. FindOptimal(optimalItems, optimalProstoi);
  58. ReadSaveData.WriteToFile(savePath, items, prostoi, optimalItems, optimalProstoi);
  59. }
  60. }
  61. }