Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.06 KB | None | 0 0
  1. (*Функция по вычислению мощности в точках области*)
  2. Dotpower[coordinates0_, towers0_] :=
  3. Module[{coordinates = coordinates0, towers = towers0},
  4. max = 0;(*задаем переменную для максимального значения мощности в \
  5. точки*)
  6.  
  7. For[k = 1, k <= 5, k++,(*Для вышки первого типа*)
  8. d = ((coordinates[[1]] - towers[[k, 2]])^2 + (coordinates[[2]] -
  9. towers[[k, 3]])^2); (*Считаем расстояние между ячейкой (i,
  10. j) и ячейкой,где расположена вышка*)
  11. If[d == 0,
  12. Return[{coordinates[[1]], coordinates[[2]],
  13. 100}]];(*Если эта точка и есть вышка,
  14. то возвращаем мощность самой вышки*)
  15. power = 100/d;(*По формуле из задачи вычисляем мощность*)
  16. If[power > max,
  17. max = power;]; (*Находим максимальную мощность в точке*)
  18. ];
  19. For[k = 6, k <= 8, k++,
  20. d = ((coordinates[[1]] - towers[[k, 2]])^2 + (coordinates[[2]] -
  21. towers[[k, 3]])^2); (*То же самое,
  22. только с вышкой мощностью 300*)
  23. If[d == 0, Return[{coordinates[[1]], coordinates[[2]], 300}]];
  24. power = 300/d;
  25. If[power > max, max = power;];
  26. ];
  27. For[k = 9, k <= 10, k++,
  28. d = ((coordinates[[1]] - towers[[k, 2]])^2 + (coordinates[[2]] -
  29. towers[[k, 3]])^2); (*То же самое,
  30. только с вышкой мощностью 500*)
  31. If[d == 0, Return[{coordinates[[1]], coordinates[[2]], 500}]];
  32. power = 500/d;
  33. If[power > max, max = power;];
  34. ];
  35. Return[{coordinates[[1]], coordinates[[2]], max}];
  36. ]
  37.  
  38. (*Вычисляем мощность башен*)
  39. Towerpower[towers0_] :=
  40. Module[{towers = towers0},
  41. pwr = {};(*создаем массив мощностей всей области*)
  42. For[i = 1, i <= 100, i++,
  43. For[j = 1, j <= 100, j++,
  44. pow =
  45. Dotpower[{i, j},
  46. towers]; (*Проходим по каждой точке области и считаем можность \
  47. точки*)
  48. pwr =
  49. Append[pwr,
  50. pow]; (*Добавляем в массив мощностей высчитанную область точки*)
  51. \
  52.  
  53. ];
  54. ];
  55. Return[pwr];
  56. ]
  57.  
  58. (*Функция считает суммарное кол-во абонентов,имеющих \
  59. удовлетворительное качество связи*)
  60. Abonents[powermap0_, population0_] :=
  61. Module[{powermap = powermap0, population = population0},
  62. cnt = 0;
  63. count = 0;(*Количество довольных абонентов*)
  64. For[i = 1, i <= 100, i++,
  65. For[j = 1, j <= 100, j++,
  66. If[powermap[[i*j]][[3]] >= 1,
  67. count += population[[i, j]]]; (*Проходим по области, проверяя,
  68. что мощность сигнала >
  69. 1 и увеличиваем количество довольных пользователей*)
  70. If[powermap[[i*j]][[3]] < 1,
  71. cnt += population[[i, j]]]; (*Проходим по области, проверяя,
  72. что мощность сигнала <
  73. 1 и увеличиваем количество довольных пользователей*)
  74. ];
  75. ];
  76. Return[100*count/(count + cnt)];
  77. ]
  78.  
  79. (*Функция генерирования случайных башен*)
  80. Towersrandom[towers0_] :=
  81. Module[{towers = towers0},(*задаем функцию*)
  82. For[i = 1, i <= 5, i++,
  83. towers[[i, 1]] = 100 (*создаем 5 башен мощностью 100*)
  84. ];
  85. For[i = 6, i <= 8, i++,
  86. towers[[i, 1]] = 300 (*создаем 3 башни мощностью 300*)
  87. ];
  88. For[i = 9, i <= 10, i++,
  89. towers[[i, 1]] = 500 (*создаем 2 башни мощностью 500*)
  90. ];
  91. coordinates = {};
  92. For[i = 1, i <= 10, i++,
  93. randomcoordinate =
  94. RandomInteger[{1, 100}]; (*генерируем координату по иксу*)
  95. (*проверяем на наличие совпадений*)
  96. While[MemberQ[coordinates, randomcoordinate],(*MemberQ -
  97. если совпадают, то генерируем случайное число от 1-100 повторно*)
  98.  
  99.  
  100. randomcoordinate = RandomInteger[{1, 100}];
  101. ];
  102. towers[[i, 2]] =
  103. randomcoordinate; (*задаем во втором столбце матрицы координату \
  104. башни по иксу*)
  105. ];
  106. For[i = 1, i <= 10, i++,
  107. randomcoordinate =
  108. RandomInteger[{1, 100}]; (*генерируем координату по игрек*)
  109. While[MemberQ[coordinates, randomcoordinate],(*MemberQ -
  110. если совпадают, то генерируем случайное число от 1-100 повторно*)
  111.  
  112.  
  113. randomcoordinate = RandomInteger[{1, 100}];
  114. ];
  115. towers[[i, 3]] =
  116. randomcoordinate; (*задаем в третьем столбце матрицы координату \
  117. башни по игреку*)
  118. ];
  119. Return[towers];
  120. ]
  121.  
  122. (*Main code*)
  123. area = Table[
  124. 0, {i, 100}, {j,
  125. 100}]; (*Generate area*) (*задаем квадратную область размером \
  126. 100х100 точек*)
  127. (*population=Table[RandomInteger[1000],{i,100},{j,100}];*) (*Задаем \
  128. количество человек, проживающих в точке ij,области размером 100х100 \
  129. точек*)
  130. towers = Table[0, {i, 10}, {j, 3}];(*задаем 10 вышек трех типов*)
  131. towers = Towersrandom[
  132. towers]; (*Функция, которая генерирует случайные башни на области*)
  133.  
  134. powermap =
  135. Towerpower[towers];(*Функция, которая считает мощность башен*)
  136.  
  137. ListPlot3D[powermap] (*Создаем 3D модель*)
  138.  
  139. Print[NumberForm[N[Abonents[powermap, population]],
  140. 4], "%"] (*Подсчываем суммарное кол-во абонентов,имеющих \
  141. удовлетворительное качество связи*)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement