Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (*Функция по вычислению мощности в точках области*)
- Dotpower[coordinates0_, towers0_] :=
- Module[{coordinates = coordinates0, towers = towers0},
- max = 0;(*задаем переменную для максимального значения мощности в \
- точки*)
- For[k = 1, k <= 5, k++,(*Для вышки первого типа*)
- d = ((coordinates[[1]] - towers[[k, 2]])^2 + (coordinates[[2]] -
- towers[[k, 3]])^2); (*Считаем расстояние между ячейкой (i,
- j) и ячейкой,где расположена вышка*)
- If[d == 0,
- Return[{coordinates[[1]], coordinates[[2]],
- 100}]];(*Если эта точка и есть вышка,
- то возвращаем мощность самой вышки*)
- power = 100/d;(*По формуле из задачи вычисляем мощность*)
- If[power > max,
- max = power;]; (*Находим максимальную мощность в точке*)
- ];
- For[k = 6, k <= 8, k++,
- d = ((coordinates[[1]] - towers[[k, 2]])^2 + (coordinates[[2]] -
- towers[[k, 3]])^2); (*То же самое,
- только с вышкой мощностью 300*)
- If[d == 0, Return[{coordinates[[1]], coordinates[[2]], 300}]];
- power = 300/d;
- If[power > max, max = power;];
- ];
- For[k = 9, k <= 10, k++,
- d = ((coordinates[[1]] - towers[[k, 2]])^2 + (coordinates[[2]] -
- towers[[k, 3]])^2); (*То же самое,
- только с вышкой мощностью 500*)
- If[d == 0, Return[{coordinates[[1]], coordinates[[2]], 500}]];
- power = 500/d;
- If[power > max, max = power;];
- ];
- Return[{coordinates[[1]], coordinates[[2]], max}];
- ]
- (*Вычисляем мощность башен*)
- Towerpower[towers0_] :=
- Module[{towers = towers0},
- pwr = {};(*создаем массив мощностей всей области*)
- For[i = 1, i <= 100, i++,
- For[j = 1, j <= 100, j++,
- pow =
- Dotpower[{i, j},
- towers]; (*Проходим по каждой точке области и считаем можность \
- точки*)
- pwr =
- Append[pwr,
- pow]; (*Добавляем в массив мощностей высчитанную область точки*)
- \
- ];
- ];
- Return[pwr];
- ]
- (*Функция считает суммарное кол-во абонентов,имеющих \
- удовлетворительное качество связи*)
- Abonents[powermap0_, population0_] :=
- Module[{powermap = powermap0, population = population0},
- cnt = 0;
- count = 0;(*Количество довольных абонентов*)
- For[i = 1, i <= 100, i++,
- For[j = 1, j <= 100, j++,
- If[powermap[[i*j]][[3]] >= 1,
- count += population[[i, j]]]; (*Проходим по области, проверяя,
- что мощность сигнала >
- 1 и увеличиваем количество довольных пользователей*)
- If[powermap[[i*j]][[3]] < 1,
- cnt += population[[i, j]]]; (*Проходим по области, проверяя,
- что мощность сигнала <
- 1 и увеличиваем количество довольных пользователей*)
- ];
- ];
- Return[100*count/(count + cnt)];
- ]
- (*Функция генерирования случайных башен*)
- Towersrandom[towers0_] :=
- Module[{towers = towers0},(*задаем функцию*)
- For[i = 1, i <= 5, i++,
- towers[[i, 1]] = 100 (*создаем 5 башен мощностью 100*)
- ];
- For[i = 6, i <= 8, i++,
- towers[[i, 1]] = 300 (*создаем 3 башни мощностью 300*)
- ];
- For[i = 9, i <= 10, i++,
- towers[[i, 1]] = 500 (*создаем 2 башни мощностью 500*)
- ];
- coordinates = {};
- For[i = 1, i <= 10, i++,
- randomcoordinate =
- RandomInteger[{1, 100}]; (*генерируем координату по иксу*)
- (*проверяем на наличие совпадений*)
- While[MemberQ[coordinates, randomcoordinate],(*MemberQ -
- если совпадают, то генерируем случайное число от 1-100 повторно*)
- randomcoordinate = RandomInteger[{1, 100}];
- ];
- towers[[i, 2]] =
- randomcoordinate; (*задаем во втором столбце матрицы координату \
- башни по иксу*)
- ];
- For[i = 1, i <= 10, i++,
- randomcoordinate =
- RandomInteger[{1, 100}]; (*генерируем координату по игрек*)
- While[MemberQ[coordinates, randomcoordinate],(*MemberQ -
- если совпадают, то генерируем случайное число от 1-100 повторно*)
- randomcoordinate = RandomInteger[{1, 100}];
- ];
- towers[[i, 3]] =
- randomcoordinate; (*задаем в третьем столбце матрицы координату \
- башни по игреку*)
- ];
- Return[towers];
- ]
- (*Main code*)
- area = Table[
- 0, {i, 100}, {j,
- 100}]; (*Generate area*) (*задаем квадратную область размером \
- 100х100 точек*)
- (*population=Table[RandomInteger[1000],{i,100},{j,100}];*) (*Задаем \
- количество человек, проживающих в точке ij,области размером 100х100 \
- точек*)
- towers = Table[0, {i, 10}, {j, 3}];(*задаем 10 вышек трех типов*)
- towers = Towersrandom[
- towers]; (*Функция, которая генерирует случайные башни на области*)
- powermap =
- Towerpower[towers];(*Функция, которая считает мощность башен*)
- ListPlot3D[powermap] (*Создаем 3D модель*)
- Print[NumberForm[N[Abonents[powermap, population]],
- 4], "%"] (*Подсчываем суммарное кол-во абонентов,имеющих \
- удовлетворительное качество связи*)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement