
Лабораторная работа № 8
Задание:
Исследовать модели подсети вычислительной сети и вычислить:
Интенсивность потоков сообщений, проходящих по каналам.
Среднюю длину пути
Пропускные способности каналов, минимизирующие среднюю задержку сообщений.
Среднюю задержку сообщений для оптимальных пропускных способностях каналов и при неоптимальных.
А так же изобразить сеть в виде графа.
Вариант 17:
C = 70
N = 5
Код программы:
package ru;
import java.text.DecimalFormat;
import java.util.*;
public class Main {
static int N = 5;
static int C = 70;
static double mu = 1.0;
static Map<Integer, Integer> channels = null;
static double[][] Y = {
{0, 1, 2, 1, 2},
{2, 0, 1, 1, 1},
{2, 3, 0, 1, 2},
{3, 1, 1, 0, 1},
{3, 1, 1, 2, 0},
};
static int[][] r = {
{9, 1, 1, 3, 3},
{4, 9, 4, 2, 3},
{4, 1, 9, 3, 3},
{4, 1, 4, 9, 3},
{4, 1, 4, 5, 9},
};
public static void main(String[] args) {
DecimalFormat formatter = new DecimalFormat("###.########");
double lam0 = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
lam0 += Y[i][j];
}
}
System.out.println("lam0 = " + lam0);
List<Integer> lam = getLam();
System.out.println("lam = " + lam.toString());
int A = 0;
for (Integer x : lam) {
A += x;
}
System.out.println("A = " + A);
double n = ((double)A)/ ((double)lam0);
System.out.println("n = " + n);
List<Double> Ci = getC(lam0, n);
System.out.println("Ci = " + Ci.toString());
double sum = 0;
for (Double x : Ci) {
sum += x;
}
System.out.println("sum Ci = " + sum);
double t = getT(lam0, n, Ci);
System.out.println("t = " + t);
List<Double> C2 = getAlternativeC();
System.out.println("C2 = " + C2.toString());
double t2 = getT(lam0, n, C2);
System.out.println("t2 = " + t2);
}
private static List<Double> getAlternativeC() {
List<Double> C2 = new ArrayList<Double>();
List<Integer> lam = getLam();
double tempC = C;
for(int i = 0; i < lam.size() - 1; i++) {
C2.add(lam.get(i) + 0.5);
tempC -= C2.get(i);
}
C2.add(tempC);
return C2;
}
private static double getT(double lam0, double n, List<Double> Ci) {
List<Integer> lam = getLam();
double t = 0;
for(int i = 0; i < lam.size(); i++) {
t+= lam.get(i)/ lam0 * (1.0 / (mu * Ci.get(i) - lam.get(i)));
}
return t;
}
private static List<Double> getC(double lam0, double n) {
List<Double> res = new ArrayList<Double>();
double psi = lam0 / (C * mu);
List<Integer> lam = getLam();
for(int i = 0; i < lam.size(); i++) {
double c = lam.get(i) / mu;
double temp = 0;
for (Integer x : lam) {
temp += Math.sqrt(x);
}
temp = Math.sqrt(lam.get(i)) / temp;
temp *= C * (1.0 - n * psi);
c += temp;
res.add(c);
}
return res;
}
private static List<Integer> getLam() {
Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
for (int i = 0; i < r.length; i++) {
for (int j = 0; j < r.length; j++) {
if (i != j) {
int k = j;
int cost = (int) Y[i][j];
while (k != i) {
int num = getChannelNumber(k, r[i][k] - 1);
if (!map.containsKey(num)) {
map.put(num, 0);
}
map.put(num, map.get(num) + cost);
k = r[i][k] - 1;
}
}
}
}
return new ArrayList<Integer>(map.values());
}
private static void createMap() {
channels = new HashMap<Integer, Integer>();
int count = 0;
for (int i = 0; i < r.length; i++) {
for (int j = 0; j < r.length; j++) {
if (i != j) {
int v2 = r[i][j] - 1;
if (!channels.containsKey(j * 10 + v2)) {
channels.put(j * 10 + v2, count);
count++;
}
}
}
}
}
private static int getChannelNumber(int v1, int v2) {
if (channels == null) {
createMap();
}
Integer res = channels.get(v1 * 10 + v2);
if (res == null) {
throw new IllegalArgumentException("Invalid v1 =" + v1 + ", v2 = " + v2 + ".");
}
return res;
}
}
Результат работы программы:
Интенсивности потоков сообщений в каналах: [6, 5, 7, 6, 15, 5, 5, 7].
Средняя длина пути - 1,75.
Оптимальные пропускные способности каналов, минимизирующие задержку сообщений:
[7.65, 6.507, 8.783, 7.65, 17.61, 6.507, 6.507, 8.783]
Средняя задержка сообщения при оптимальных пропускных способностях - 0.963.
Оптимальные пропускные способности каналов: [6.5, 5.5, 7.5, 6.5, 15.5, 5.5, 5.5, 17.5]
Средняя задержка сообщения при неоптимальных пропускных способностях - 3.083.
Выводы:
Из полученных результатов можно увидеть, что оптимальные пропускные способности каналов зависят от интенсивности потоков сообщений в каналах. Средняя задержка сообщения при неоптимальных пропускных способностях каналов заметно больше (в 3 раза), чем при оптимальных. Даже не смотря на то, что разница между оптимальными и не оптимальными пропускными способностями не столь велика. Вследствие этого, при выборе пропускных способностей необходимо выбирать именно оптимальные значения, так как даже малейшее отклонение от них увеличивает время задержки сообщения.