Sistemas de Telecomunicações I

Transcrição

Sistemas de Telecomunicações I
Sistemas de Telecomunicações I
Simulação de uma rede telefónica
Ricardo V. Oliveira
Carlos Firmino
Rui Salgado
Maio, 2001
FEUP
ST1 - Simulação de uma rede com três centrais de comutação
1
• Rede a simular
A topologia da rede que nos foi fornecida é a seguinte :
Figura 1 – tráfego oferecido aos nós (A) e capacidade das rotas de tráfego (N)
Destinos
Central B
13
28.9%
Origens
Central A
A
B
15
42.9%
C
28
59.6%
Central C
32
71.1%
20
19
57.1%
40.4%
Entrada e Saída
Entre A e B
Entrada em A ou B/Saída por C
Entrada em C/Saída em A ou B
Receita (UC por minuto)
1
3
5
Tabela 2 - Caracterização das chamadas
Duração média das chamadas dm = 2.5 minutos.
Central
A
B
C
Taxa de chegada λ = At/dm (erlang)
18
14
18.8
Tabela 3 - Taxas de chegada
Sistemas de Telecomunicações 1
45
35
47
Tabela 1- Caracterização do tráfego entre nós
Tipo de chamada
Local
Regional
25%
Nacional
75%
Totais
ST1 - Simulação de uma rede com três centrais de comutação
2
• Cálculo da probabilidade de bloqueio
O cálculo da probabilidade de bloqueio fez-se aproximando o sistema por um sistema de Erlang. Para cada rota
de tráfego λ i ≈ N × λ onde i é o número de chamadas em curso na rota , N é a capacidade da rota e λ é a taxa
de chegada de cada fonte livre à rota. Nesta situação λi é aproximadamente constante assim como o tráfego
oferecido ao sistema em cada nó A ≈ N × λ× dm (onde dm é a duração média das chamadas) .
Nesta situação , tanto A com λ i são independentes do número i de chamadas em curso.
Para calcular o tráfego oferecido a cada rota teve de se ter em conta a caracterização do tráfego entre os nós
terminais dessa rota . Para a rota A-B, temos a contribuição do nó A (45*0.289) mais a contribuição do nó B
(35*0.429) (ver tabela 1). Sendo assim , o tráfego na rota A-B é de 28.02 Erlang.
Consultando a tabela de tráfego conclui-se que, para esta rota , com NAB=30 e AAB=28.02 ,
a probabilidade de bloqueio é de 10%. Para os outros casos :
Rota AB :
Rota BC :
Rota AC :
NAB=30
NBC=40
NAC=60
AAB=28.02
ABC=38.97
AAC=60.01
B ≈ 10 %
B ≈ 10%
B ≈ 10%
• Resultados da simulação :
O programa de simulação executa um número pré-determinado de vezes uma rotina que processa 100 mil
chamadas com sementes sequenciais de geração de números aleatórios.
No nosso caso, usaram -se 100 sementes , processando-se no total 100×100×103 =10 milhões de chamadas, para
se obterem intervalos de confiança mais apertados.
Os resultados obtidos foram escritos em ficheiros de texto para posterior análise.
o Resultados com encaminhamento estático :
Exemplo da execução n.º 100 :
****************** 100 *****************
Receita total
:
Receita média/chamada
:
Duração da simulação
:
Duração média das chamadas :
Chamadas bloqueadas entre AB:
Chamadas bloqueadas entre AC:
Chamadas bloqueadas entre BC:
Total chamadas atendidas
:
Total chamadas bloqueadas
:
Total chamad reencaminhadas :
Total chamadas directas
:
Total de chamadas locais
:
Total de chamadas regionais :
Total de chamadas nacionais :
664877.688 U.C.
7.378 U.C.
1959.735 minutos
2.493 minutos
1960
4644
3283
90113
9887 - 9.887%
0
90113
22.2%
58.4%
19.4%
//chamadas
//chamadas
//chamadas
//chamadas
não bloqueadas
bloqueadas
encaminhadas dinamicamente
encaminhadas estaticamente
Resultados finais das 100 execuções :
************ Resultados finais *****************
Receita media
: 666276.50 U.C.
Chamadas bloqueadas : 9885 - 9.885%
Intervalo de confiança das receitas a 90% : +/- 343.3 U.C.
Intervalo de confiança dos bloqueios a 90% : +/- 0.043 %
Sistemas de Telecomunicações 1
ST1 - Simulação de uma rede com três centrais de comutação
3
Verifica-se que a duração média das chamadas é aproximadamente 2.5 minutos. O intervalo de confiança dos
bloqueios a +/– 90% é pequeno, permitindo percentagens de chamadas bloqueadas entre 9.842% e 9.928%.
Gráfico 1 – Ocupação das rotas ao longo do tempo com encaminhamento estático
Ocupação média dos circuitos
N.º de circuitos ocupados
Rota AB
25.08
Rota BC
34.86
Rota AC
54.08
Tabela 4 – Ocupação média das rotas com encaminhamento estático
o Resultados com encaminhamento dinâmico :
Para melhorar os resultados obtidos com o encaminhamento estático, optou-se por associar a cada rota uma
folga. Para as chamadas locais, a folga é o número mínimo de circuitos livres que devem existir na rota AB para
a chamada ser aceite. Isto só acontece para as chamadas locais porque são pouco frequentes e são as mais
baratas, não sendo proveitoso fazer o seu encaminhamento pelos outros circuitos. Para as outras rotas, a
chamada é aceite se existirem circuitos livres. Caso contrário, só são encaminhadas dinamicamente se as rotas
alternativas tiverem um número de circuitos livres que é igual à folga nessa rota.
Usou-se o mesmo algoritmo tanto no caso da optimização do bloqueio como no caso da receita. Esta
optimização foi feita percorrendo todos as combinações possíveis das folgas.
Sistemas de Telecomunicações 1
ST1 - Simulação de uma rede com três centrais de comutação
o Optimização da percentagem de bloqueio :
Os valores óptimos encontrados para as folgas foram de :
Rota
Folga óptima
AB
0
BC
9
AC
9
Tabela 5 – Folgas óptimas para o bloqueio
Os resultados obtidos foram os seguintes :
****************** 100 *****************
Receita total
:
Receita média/chamada
:
Duração da simulação
:
Duração média das chamadas :
Chamadas bloqueadas entre AB:
Chamadas bloqueadas entre AC:
Chamadas bloqueadas entre BC:
Total chamadas atendidas
:
Total chamadas bloqueadas
:
Total chamad reencaminhadas :
Total chamadas directas
:
Total de chamadas locais
:
Total de chamadas regionais :
Total de chamadas nacionais :
668244.375 U.C.
7.408 U.C.
1961.796 minutos
2.496
2407
4296
3093
90204
9796 - 9.796%
642
89562
21.7%
59.0%
19.4%
************ Resultados finais *****************
Receita media
: 669304.88 U.C.
Chamadas bloqueadas : 9760 - 9.760%
Intervalo de confiança das receitas a 90% : +/- 329.8 U.C.
Intervalo de confiança dos bloqueios a 90% : +/- 0.041 %
Como se pode constatar, o encaminhamento dinâmico levou a que a probabilidade de bloqueio diminuísse para
9.76%. O intervalo de confiança manteve-se aproximadamente igual. Além de melhorar o bloqueio, a receita
média por execução também aumentou .
Gráfico 2 – Ocupação das rotas ao longo do tempo com encaminhamento dinâmico e optimização do bloqueio
Sistemas de Telecomunicações 1
4
ST1 - Simulação de uma rede com três centrais de comutação
Ocupação média dos circuitos
Rota AB
Rota BC
Rota AC
5
N.º de circuitos ocupados
25.47
34.91
54.79
Tabela 6 – Ocupação média das rotas com encaminhamento dinâmico optimizando o bloqueio
Verifica-se que a ocupação média dos circuitos não variou significativamente.
Para ver como variam os resultados na vizinhança dos valores óptimos das folgas, testaram-se todas as
combinações das folgas com duas delas fixas e variando a outra em torno do seu valor óptimo.
Bloqueio
9760.08
10247.79
10738.14
11262.22
11774.22
12296.78
Sistemas de Telecomunicações 1
Receita Folga AB Folga BC
669304.9
0
9
667918.3
1
9
666463.1
2
9
665408.9
3
9
664043.4
4
9
662351.3
5
9
Tabela 7 – Folga AB variável
Folga AC
9
9
9
9
9
9
ST1 - Simulação de uma rede com três centrais de comutação
Bloqueio
9973.05
9902.94
9814.20
9806.91
9811.429
9760.08
9859.66
9864.32
9902.30
9831.38
9885.11
Sistemas de Telecomunicações 1
Receita
Folga AB Folga BC Folga AC
671388.3125
0
4
9
671117.6875
0
5
9
670289.9375
0
6
9
670038
0
7
9
669650.75
0
8
9
669304.875
0
9
9
668951
0
10
9
668513.75
0
11
9
668530.1875
0
12
9
668223.375
0
13
9
667943.8125
0
14
9
Tabela 8 – Folga BC variável
6
ST1 - Simulação de uma rede com três centrais de comutação
Bloqueio
9918.54
9909.3
9905.16
9881.65
9849.57
9760.08
9779.03
9805.77
9817.01
9893.97
9809.01
Sistemas de Telecomunicações 1
Receita Folga AB Folga BC
670600.6
0
9
670118.8
0
9
670029.9
0
9
669641.1
0
9
669690.8
0
9
669304.9
0
9
668933.5
0
9
668648.2
0
9
668585.3
0
9
668411.8
0
9
668399.2
0
9
Tabela 9 – Folga AC variável
7
Folga AC
4
5
6
7
8
9
10
11
12
13
14
ST1 - Simulação de uma rede com três centrais de comutação
8
Os gráficos anteriores provam que as folgas anteriormente calculadas são óptimas. Também se observa que os
resultados para a receita não são os melhores para as folgas óptimas do bloqueio, que demonstra que uma
melhoria na probabilidade de bloqueio não significa uma melhoria na receita. Do gráfico da variação da folga
AB vê-se que claramente que tanto para o bloqueio como para a receita, os melhores resultados ocorrem quando
a folga é nula. Isto significa que a consideração inicial de reservar um determinado número de circuitos na rota
AB para encaminhamento dinâmico não é vantajosa.
o Optimização da receita :
Os valores óptimos encontrados para as folgas foram de :
Rota
Folga óptima
AB
0
BC
2
AC
2
Tabela 10 – Folgas óptimas para a receita
Os resultados obtidos foram os seguintes :
****************** 100 *****************
Receita total
:
Receita média/chamada
:
Duração da simulação
:
Duração média das chamadas :
Chamadas bloqueadas entre AB:
Chamadas bloqueadas entre AC:
Chamadas bloqueadas entre BC:
Total chamadas atendidas
:
Total chamadas bloqueadas
:
Total chamad reencaminhadas :
Total chamadas directas
:
Total de chamadas locais
:
Total de chamadas regionais :
Total de chamadas nacionais :
677725.312 U.C.
7.525 U.C.
1975.760 minutos
2.493
4005
3551
2381
90063
9937 - 9.937%
3269
86794
20.1%
59.9%
20.0%
Resultados finais das 100 execuções :
************ Resultados finais *****************
Receita media
: 673877.81 U.C.
Chamadas bloqueadas : 10483 - 10.483%
Intervalo de confiança das receitas a 90% : +/- 268.7 U.C.
Intervalo de confiança dos bloqueios a 90% : +/- 0.048 %
Verifica-se que a receita média obtida é de 674 mil UC. Na situação com encaminhamento estático, a receita
média era de 666 mil UC, enquanto que na situação de optimização do bloqueio a receita média foi de 669 mil
UC. Constitui de facto uma melhoria da receita.
Sistemas de Telecomunicações 1
ST1 - Simulação de uma rede com três centrais de comutação
9
Gráfico 3 – Ocupação das rotas ao longo do tempo com encaminhamento dinâmico e optimização da receita
Ocupação média dos circuitos
N.º de circuitos ocupados
Rota AB
27.02
Rota BC
36.37
Rota AC
55.06
Tabela 11 – Ocupação média das rotas com encaminhamento dinâmico optimizando a receita
Verifica-se que a ocupação média dos circuitos aumentou em relação ao encaminhamento dinâmico com
optimização do bloqueio.
Mantendo duas das folgas fixas e variando a outra em torno do seu valor óptimo, chegaram-se aos seguintes
resultados :
Bloqueio
10482.87
11009.5
11503.08
12061.5
12561.59
13152.59
Sistemas de Telecomunicações 1
Receita Folga AB Folga BC
673877.8
0
2
672309.8
1
2
670888.6
2
2
669095.1
3
2
667613.9
4
2
665894.9
5
2
Tabela 12 – Folga A B variável
Folga AC
2
2
2
2
2
2
ST1 - Simulação de uma rede com três centrais de comutação
Bloqueio
10997.16
10803.12
10482.87
10364.55
10243.96
10198.62
10152.26
10139.24
10997.16
10803.12
10482.87
Sistemas de Telecomunicações 1
Receita
Folga AB Folga BC Folga AC
673262.4
0
0
2
673481.5
0
1
2
673877.8
0
2
2
673396.8
0
3
2
673256.1
0
4
2
672539.1
0
5
2
672299.6
0
6
2
671653.4
0
7
2
673262.4
0
0
2
673481.5
0
1
2
673877.8
0
2
2
Tabela 13 – Folga BC variável
10
ST1 - Simulação de uma rede com três centrais de comutação
Bloqueio
10942.43
10703.73
10482.88
10328.02
10280.61
10207.35
10180.2
10121.41
10942.43
10703.73
10482.88
Receita
672854.3
673422
673877.8
673767.1
673337.4
673635.1
673015.7
672402.9
672854.3
673422
673877.8
Folga AB
0
0
0
0
0
0
0
0
0
0
0
Folga BC
2
2
2
2
2
2
2
2
2
2
2
Tabela 14 – Folga AC variável
Sistemas de Telecomunicações 1
11
Folga AC
0
1
2
3
4
5
6
7
0
1
2
ST1 - Simulação de uma rede com três centrais de comutação
A observação dos gráficos anteriores comprova que as folgas calculadas são óptimas. Também se verifica que o
valor das folgas em que a receita é máxima é diferente das folgas para a melhor probabilidade de bloqueio .
Mais uma vez os gráficos provam que a optimização da receita é independente da optimização da percentagem
de bloqueio .
Sistemas de Telecomunicações 1
12
ST1 - Simulação de uma rede com três centrais de comutação
•
//
//
//
//
//
//
Código do programa
Simulacao de uma rede telefonica
By
Carlos Firmino
Ricardo Veloso
Rui Salgado
16 de Maio de 2000
#include
#include
#include
#include
#include
<stdlib.h>
<stdio.h>
<math.h>
<string.h>
<time.h>
// tempo médio entre chamadas consecutivas para cada central
#define ilambda_A 1/18.0
#define ilambda_B 1/14.0
#define ilambda_C 1/18.8
#define dm 2.5
// Tráfego inicial entre nós
#define A_B 13
#define A_C 32
#define B_A 15
#define B_C 20
#define C_A 28
#define C_B 19
// probabilidade de uma chamada ter origem em A e destino B
#define pA_B 0.289
#define pB_A 0.429
#define pC_A 0.596
// probabilidade de uma chamada ser nacional ou regional
#define pnacional 0.25
#define pregional 0.75
// custo de cada tipo de chamada por minuto
#define clocal 1.0
#define cregional 3.0
#define cnacional 5.0
// número aleatório entre 0 e 1
#define RAND rand()/(float)RAND_MAX
// número de chamadas totais da simulação por execução
#define chamadastotais 100000
//número máximo de execuções
#define NEXEC 100
//tipo de evento
typedef enum {fim, inicio_A, inicio_B, inicio_C} tevento;
//tipo de circuito
typedef enum {nulo, AB, BC, AC} tcircuito;
//tipo de chamada
typedef enum {loc,reg,nac} tcham;
//capacidade das rotas de tráfego
const int NMAX [4] = {30, 30, 40, 60};
//apontador para um evento
typedef struct evento *pevento;
//estrutura de um evento
Sistemas de Telecomunicações 1
13
ST1 - Simulação de uma rede com três centrais de comutação
struct evento
{
tevento tipoev;
float tempo;
tcircuito circuito;
pevento next;
};
//tipo de evento
//tempo de ocorrência
//tipo de circuito
//apontador para próximo evento
//estrutura de retorno para a função 'executa'
struct retorno
{
float rec,bloq;
};
//estrutura de retorna para a função 'calcula_receita'
struct ret_receita
{
float rec;
tcham cham;
};
//tempo da simulação
float t = 0.0;
//array com o nº de circuitos ocupados em cada ligação
int circuitos[3];
//nº de chamadas bloqueadas e tentadas
int nbloq = 0, ntentadas = 0;
//apontador para o primeiro evento
pevento first = NULL;
//array com a duração e a receita de cada chamada
float duracoes[chamadastotais], receita[chamadastotais];
//array com a receita e o nº de chamadas bloqueadas de cada execução
float receitas[NEXEC], chamadas_bloq[NEXEC];
//média de receitas,média de chamadas bloqueadas, desvios padrões das receitas e chamadas bloqueadas
float M_receita = 0, M_bloq = 0, S_rec=0, S_bloq=0;
//nº de chamadas bloqueadas em cada circuito, indices diversos, nº de chamadas reencaminhadas e directas
int
nbloqAB = 0, nbloqAC = 0, nbloqBC = 0, pos_dur = 0, pos_rec = 0, nreenc=0, ndir=0;
//array com as folgas de cada circuito
int folga[4];
//array com o nº de chamadas de cada tipo (local,regional ou nacional)
int ncham[3];
//tipo de simulaçao
int breenc = 1;
int bmfolg = 1;
int bestbloq =0;
int savecirc =0;
int comb = 0;
//
//
//
//
//
permite o reencaminhamento de chamadas
calcula as melhores folgas inicias
optimiza o bloqueio(1) ou a receita(0)
guarda a ocupação dos circuitos num ficheiro
escreve ficheiro com todas as combinações das folgas
//ficheiro de estatísticas
FILE *stat;
//ficheiro com a ocupação dos circuitos
FILE *circtxt;
//retorna um aleatório com a distribuição de Poisson com média 1/p
float randomt(float p);
//insere evento na lista de eventos
void inserir(tevento ev, tcircuito circ, float t);
//elimina o primeiro evento da lista
void
eliminar();
//inicializa o sistema
void
inicializacao(void);
//corre a simulação
void
simulacao(void);
//calcula a receita e o tipo de chamada
struct ret_receita calcula_receita(tcircuito circ, float durac);
int processa_chamada(tcircuito circ, float durac);
//executa a simulação 'n' vezes
struct retorno executa(int n);
//algoritmo de optimização das folgas
void melhores_folgas(void);
void combinacoes(void);
//*************************************************************************************************
int main(void)
{
Sistemas de Telecomunicações 1
14
ST1 - Simulação de uma rede com três centrais de comutação
15
stat=fopen("stats.txt","w");
if (bmfolg==1)
{
melhores_folgas();
}
if ((bmfolg==0) && (breenc==1))
{
printf("Inicializando as folgas\n");
folga[AB] = 0;
folga[BC] = 5;
folga[AC] = 1;
//as folgas para o melhor bloqueio são 0-9-9 respectivamente
//as folgas para a melhor receita são 0-2-2 respectivamente
}
fprintf(stat,"*********** Descrição da simulação **************\n\n");
if (breenc==1)
{
fprintf(stat,"-> Executa o encaminhamento dinâmico\n");
fprintf(stat,"-> Folgas utilizadas :\n
no circuito AB=%d\n
no circuito BC=%d\n
AC=%d\n", folga[AB], folga[BC], folga[AC]);
if (bestbloq==1)
{
fprintf(stat,"-> Optimiza o nº de chamadas bloqueadas\n");
}
else
{
fprintf(stat,"-> Optimiza a receita $$\n");
}
}
else
{
fprintf(stat,"-> Executa o encaminhamento estático\n");
}
no circuito
if (savecirc==1)
{
circtxt=fopen("circs.csv","w");
fprintf(circtxt,"Tempo;Circuitos AB;Circuitos BC;Circuitos AC\n");
}
if (comb==1)
{
combinacoes();
}
executa(1);
fclose(stat);
if (savecirc==1) fclose(circtxt);
return 1;
}
//*************************************************************************************************
struct ret_receita calcula_receita(tcircuito c, float d)
{
struct ret_receita r;
if (c == AB)
{
r.rec = (ceil(d*60)/60*clocal); //facturação ao segundo
r.cham=loc; //a chamada é local
}
else
{
if ((c == AC) || (c == BC))
{
if (RAND <= pnacional)
{
r.rec = (ceil(d*60)/60*cnacional);
r.cham=nac; //a chamada é nacional
}
Sistemas de Telecomunicações 1
ST1 - Simulação de uma rede com três centrais de comutação
else
{
r.rec = (ceil(d*60)/60*cregional);
r.cham=reg; //a chamada é regional
}
}
}
return r;
}
//*************************************************************************************************
void inserir(tevento ev, tcircuito circ, float tempo_ate_ocorrencia)
{
pevento ant = NULL, aux = first, nev;
// Enquanto nao chegar ao evento imediatamente anterior passa para o seguinte
while (aux != NULL)
{
if (aux->tempo > t + tempo_ate_ocorrencia)
break;
if ((aux->tempo == t + tempo_ate_ocorrencia) && (ev == fim)) break;
ant = aux;
aux = aux->next;
}
//Encontrou o local na lista para inserir o evento novo
nev = (pevento) malloc (sizeof(struct evento));
nev -> tempo = t + tempo_ate_ocorrencia;
nev -> tipoev = ev;
nev -> circuito = circ;
nev -> next = aux;
if (ant == NULL)
first = nev;
else
ant -> next = nev;
if (ev == fim) //se for um evento de fim de chamada
{
duracoes[pos_dur++] = tempo_ate_ocorrencia;
if (circ != nulo)
circuitos[circ]++;
}
return;
}
//*************************************************************************************************
void eliminar()
{
pevento aux;
aux = first;
first = first->next;
free(aux);
return;
}
//*************************************************************************************************
float randomt(float p)
{
return -p*log(RAND);
}
//*************************************************************************************************
void inicializacao(void)
{
int i;
struct ret_receita r;
float durac;
ntentadas = A_B + B_A + A_C + C_A + B_C + C_B;
//Chamadas entre A e B em ambos os sentidos
for(i = 0; i < A_B+B_A; i++)
Sistemas de Telecomunicações 1
16
ST1 - Simulação de uma rede com três centrais de comutação
{
durac=randomt(dm);
r=calcula_receita(AB, durac);
inserir(fim, AB, durac);
//receita+=r.rec;
receita[pos_rec++]=r.rec;
ndir++;
ncham[r.cham]++;
}
//Chamadas entre A e C em ambos os sentidos
for(i = 0; i < A_C+C_A; i++)
{
durac=randomt(dm);
r=calcula_receita(AC, durac);
inserir(fim, AC, durac);
//receita+=r.rec;
receita[pos_rec++]=r.rec;
ndir++;
ncham[r.cham]++;
}
//Chamadas entre B e C em ambos os sentidos
for(i = 0; i < B_C+C_B; i++)
{
durac=randomt(dm);
r=calcula_receita(BC, durac);
inserir(fim, BC, durac);
//receita+=r.rec;
receita[pos_rec++]=r.rec;
ndir++;
ncham[r.cham]++;
}
inserir(inicio_A, nulo, randomt(ilambda_A));
inserir(inicio_B, nulo, randomt(ilambda_B));
inserir(inicio_C, nulo, randomt(ilambda_C));
// Primeiro evento de chegada de chamada em A
// Primeiro evento de chegada de chamada em B
// Primeiro evento de chegada de chamada em C
if (savecirc==1) fprintf(circtxt,"%f;%d;%d;%d\n",t,circuitos[AB],circuitos[BC],circuitos[AC]);
return;
}
//*************************************************************************************************
void simulacao(void)
{
float duracao;
tcircuito circ;
t = first->tempo;
duracao = randomt(dm);
switch (first->tipoev)
{
case fim: //se for um evento de fim
circuitos[first->circuito]--; //liberta o circuito ocupado
break;
case inicio_A:
if (RAND <= pA_B)
circ = AB;
else
circ = AC;
processa_chamada(circ, duracao);
inserir(inicio_A, nulo, randomt(ilambda_A));
ntentadas++;
break;
case inicio_B:
if (RAND <= pB_A)
circ = AB;
else
circ = BC;
processa_chamada(circ, duracao);
inserir(inicio_B, nulo, randomt(ilambda_B));
Sistemas de Telecomunicações 1
17
ST1 - Simulação de uma rede com três centrais de comutação
ntentadas++;
break;
case inicio_C:
if (RAND <= pC_A)
circ=AC;
else
circ=BC;
processa_chamada(circ, duracao);
inserir(inicio_C, nulo, randomt(ilambda_C));
ntentadas++;
break;
}
eliminar();
if (savecirc==1) fprintf(circtxt,"%f;%d;%d;%d\n",t,circuitos[AB],circuitos[BC],circuitos[AC]);
return;
}
//*************************************************************************************************
int processa_chamada(tcircuito circ, float durac)
{
struct ret_receita r;
r=calcula_receita(circ, durac);
if (circ==AB) //é uma chamada local
{
//têm de ficar pelo menos 'folga[AB]' circuitos livres na ligação AB para a chamada ser aceite
if (circuitos[AB] < (NMAX[AB]-folga[AB]))
{
inserir(fim, circ, durac);
receita[pos_rec++]=r.rec;
ndir++;
ncham[r.cham]++;
}
else //se não é bloqueada
{
nbloqAB++;
nbloq++;
}
}
else //é uma chamada regional ou nacional
{
if (circuitos[circ] < NMAX[circ]) //se houver circuitos livres aceita a chamada com encaminhamento
directo
{
inserir(fim, circ, durac);
receita[pos_rec++]=r.rec;
ndir++;
ncham[r.cham]++;
}
else //se não tenta reencaminhar
{
if (circ==BC)
{
if ( (circuitos[AB] < (NMAX[AB]-folga[AB]) ) && (circuitos[AC] < (NMAX[AC]-folga[AC])) &&
(breenc==1))
{
inserir(fim, AB, durac);
inserir(fim, AC, durac);
receita[pos_rec++]=r.rec;
nreenc++;
ncham[r.cham]++;
}
else
{
nbloqBC++;
nbloq++;
}
}
if (circ==AC)
{
Sistemas de Telecomunicações 1
18
ST1 - Simulação de uma rede com três centrais de comutação
if ( (circuitos[AB] < (NMAX[AB]-folga[AB]) ) && (circuitos[BC] < (NMAX[BC]-folga[BC])) &&
(breenc==1))
{
inserir(fim, AB, durac);
inserir(fim, BC, durac);
receita[pos_rec++]=r.rec;
nreenc++;
ncham[r.cham]++;
}
else
{
nbloqAC++;
nbloq++;
}
}
}
}
}
//*************************************************************************************************
struct retorno executa(int n)
{
int execs = 0, i;
struct retorno ret;
float receita_total, duracao_total, M_duracao, M_receita;
while (execs < n)
{
t = 0;
nbloq = 0;
ntentadas = 0;
nbloqAB = 0;
nbloqAC = 0;
nbloqBC = 0;
pos_rec = 0;
pos_dur = 0;
M_duracao=0;
M_receita=0;
receita_total=0;
duracao_total=0;
nreenc=0;
ndir=0;
ncham[loc]=0;
ncham[reg]=0;
ncham[nac]=0;
srand(execs+1);
//srand(time(NULL));
inicializacao();
while (ntentadas < chamadastotais)
{
simulacao();
}
//elimina a lista de eventos da memória
while (first != NULL)
{
circuitos[first->circuito]--;
eliminar();
}
// Calculo da Media das durações e da receita de cada chamada
for(i = 0; i <ntentadas-nbloq; i++)
{
duracao_total += duracoes[i];
receita_total += receita[i];
}
M_duracao = duracao_total/(ntentadas-nbloq);
M_receita = receita_total/(ntentadas-nbloq);
if ((bmfolg!=1) && (comb==0))
{
printf("Execução nº %d em %d - NBloq=%d - Preco=%f\n",execs+1,n,nbloq,receita_total);
fprintf(stat,"\n****************** %d *****************\n\n",execs+1);
Sistemas de Telecomunicações 1
19
ST1 - Simulação de uma rede com três centrais de comutação
fprintf(stat,"Receita total
:
fprintf(stat,"Receita média/chamada
:
fprintf(stat,"Duração da simulação
:
fprintf(stat,"Duracão média das chamadas :
fprintf(stat,"Chamadas bloqueadas entre AB:
fprintf(stat,"Chamadas bloqueadas entre AC:
fprintf(stat,"Chamadas bloqueadas entre BC:
fprintf(stat,"Total chamadas atendidas
:
fprintf(stat,"Total chamadas bloqueadas
:
fprintf(stat,"Total chamad reencaminhadas :
fprintf(stat,"Total chamadas directas
:
fprintf(stat,"Total de chamadas locais
:
fprintf(stat,"Total de chamadas regionais :
fprintf(stat,"Total de chamadas nacionais :
%.3f U.C.\n", receita_total);
%.3f U.C.\n", M_receita);
%.3f minutos\n",t);
%.3f\n", M_duracao);
%d\n", nbloqAB);
%d\n", nbloqAC);
%d\n", nbloqBC);
%d\n",ntentadas-nbloq);
%d - %.3f%%\n",nbloq,(float)nbloq/chamadastotais*100);
%d\n",nreenc);
%d\n",ndir);
%.1f%%\n",(float)ncham[loc]/(ntentadas-nbloq)*100);
%.1f%%\n",(float)ncham[reg]/(ntentadas-nbloq)*100);
%.1f%%\n",(float)ncham[nac]/(ntentadas-nbloq)*100);
}
receitas[execs]=receita_total;
chamadas_bloq[execs]=nbloq;
execs++;
}
//Cálculo dos intervalos de confiança
M_receita=0;
M_bloq=0;
for (i=0; i<n; i++)
{
M_receita+=receitas[i];
M_bloq+=chamadas_bloq[i];
}
M_receita/=(float)n;
M_bloq/=(float)n;
for(i=0; i<n; i++)
{
S_rec += (receitas[i] - M_receita) * (receitas[i] - M_receita);
S_bloq += (chamadas_bloq[i] - M_bloq) * (chamadas_bloq[i] - M_bloq);
}
S_bloq /= (n - 1);
S_rec /= (n - 1);
if ((bmfolg==0) && (comb==0))
{
fprintf(stat,"\n************ Resultados finais *****************\n\n");
fprintf(stat,"Receita media
: %.2f U.C.\n", M_receita);
fprintf(stat,"Chamadas bloqueadas : %.0f - %.3f%%\n", M_bloq, M_bloq/chamadastotais*100);
fprintf(stat,"Intervalo de confianca das receitas a 90%% : +/- %.1f U.C.\n", 1.65*sqrt(S_rec/n));
fprintf(stat,"Intervalo de confianca dos bloqueios a 90%% : +/- %.3f %%\n\n",
1.65*sqrt(S_bloq/n)/chamadastotais*100);
printf("\n************ Resultados finais *****************\n\n");
printf("Receita media
: %.2f U.C.\n", M_receita);
printf("Chamadas bloqueadas : %.0f - %.3f%%\n", M_bloq, M_bloq/chamadastotais*100);
printf("Intervalo de confianca das receitas a 90%% : +/- %.1f U.C.\n", 1.65*sqrt(S_rec/n));
printf("Intervalo de confianca dos bloqueios a 90%% : +/- %.3f %%\n\n",
1.65*sqrt(S_bloq/n)/chamadastotais*100);
}
ret.rec=M_receita;
ret.bloq=M_bloq;
return ret;
}
//*************************************************************************************************
void melhores_folgas(void)
{
float nbloq_melhor = 0.0 , receita_melhor= 0.0 ;
int folg[4], i = 0, j = 0, k = 0;
FILE *texto;
struct retorno ret;
printf("Calculando as melhores folgas\n");
if (bestbloq) texto=fopen("BestBloq.txt","w");
else texto=fopen("BestPreco.txt","w");
Sistemas de Telecomunicações 1
20
ST1 - Simulação de uma rede com três centrais de comutação
//Optimização das folgas
folga[AB] = 0;
folga[BC] = 0;
folga[AC] = 0;
folg[AB] = 0;
folg[BC] = 0;
folg[AC] = 0;
ret=executa(1);
nbloq_melhor=ret.bloq;
receita_melhor=ret.rec;
for(k=0; k<NMAX[AC]/4; k++)
{
for(j=0; j<NMAX[BC]/4; j++)
{
for(i=0; i<1; i++)
{
folga[AB]=i;
folga[BC]=j;
folga[AC]=k;
ret = executa(20);
if (bestbloq==1)
{
if ( ret.bloq <= nbloq_melhor)
{
folg[AB] = folga[AB];
folg[BC] = folga[BC];
folg[AC] = folga[AC];
receita_melhor = ret.rec;
nbloq_melhor = ret.bloq;
printf("-> ");
fprintf(texto,"-> ");
}
}
else
{
if ( ret.rec >= receita_melhor)
{
folg[AB] = folga[AB];
folg[BC] = folga[BC];
folg[AC] = folga[AC];
receita_melhor = ret.rec;
nbloq_melhor = ret.bloq;
printf("-> ");
fprintf(texto,"-> ");
}
}
printf("Bloq=%f - Rec=%f - %d - %d - %d\n",ret.bloq,ret.rec,i,j,k);
fprintf(texto,"Bloq=%f - Rec=%f - %d - %d - %d\n",ret.bloq,ret.rec,i,j,k);
}
}
}
fclose(texto);
fprintf(stat,"Melhores folgas iniciais
:\nfolga[AB]=%d\nfolga[BC]=%d\nfolga[AC]=%d\n",folg[AB],folg[BC],folg[AC]);
fprintf(stat,"Melhor receita
: %f\n",receita_melhor);
fprintf(stat,"Melhor nº chamadas bloqueadas : %d\n",nbloq_melhor);
printf("Melhores folgas iniciais
:\nfolga[AB]=%d\nfolga[BC]=%d\nfolga[AC]=%d\n",folg[AB],folg[BC],folg[AC]);
printf("Melhor receita
: %f\n",receita_melhor);
printf("Melhor nº chamadas bloqueadas : %f\n",nbloq_melhor);
folga[AB] = folg[AB];
folga[BC] = folg[BC];
folga[AC] = folg[AC];
}
//*************************************************************************************************
void combinacoes(void)
Sistemas de Telecomunicações 1
21
ST1 - Simulação de uma rede com três centrais de comutação
{
int folg[4], i = 0, dev=5;
int limInf,limSup;
FILE *texto;
struct retorno ret;
folg[AB] = folga[AB];
folg[BC] = folga[BC];
folg[AC] = folga[AC];
printf("Calculando as melhores combinações das folgas\n");
//Optimização das folgas
//folga[AB] móvel
texto=fopen("AB.csv","w");
fprintf(texto,"Bloqueio;Receita;Folga AB;Folga BC;Folga AC\n");
folga[AB]=folg[AB];
folga[BC]=folg[BC];
folga[AC]=folg[AC];
limInf=(folg[AB]-dev);
limSup=(folg[AB]+dev);
if (limInf<0)
limInf=0;
if (limSup>NMAX[AB]) limSup=NMAX[AB];
for(i=limInf; i<=limSup; i++)
{
folga[AB]=i;
ret = executa(100);
printf("Bloq=%f - Rec=%f - %d - %d - %d\n",ret.bloq,ret.rec,folga[AB],folga[BC],folga[AC]);
fprintf(texto,"%f;%f;%d;%d;%d\n",ret.bloq,ret.rec,folga[AB],folga[BC],folga[AC]);
}
fclose(texto);
//folga[BC] móvel
texto=fopen("BC.csv","w");
fprintf(texto,"Bloqueio;Receita;Folga AB;Folga BC;Folga AC\n");
folga[AB]=folg[AB];
folga[BC]=folg[BC];
folga[AC]=folg[AC];
limInf=(folg[BC]-dev);
limSup=(folg[BC]+dev);
if (limInf<0)
limInf=0;
if (limSup>NMAX[BC]) limSup=NMAX[BC];
for(i=limInf; i<=limSup; i++)
{
folga[BC]=i;
ret = executa(100);
printf("Bloq=%f - Rec=%f - %d - %d - %d\n",ret.bloq,ret.rec,folga[AB],folga[BC],folga[AC]);
fprintf(texto,"%f;%f;%d;%d;%d\n",ret.bloq,ret.rec,folga[AB],folga[BC],folga[AC]);
}
fclose(texto);
//folga[AC] móvel
texto=fopen("AC.csv","w");
fprintf(texto,"Bloqueio;Receita;Folga AB;Folga BC;Folga AC\n");
folga[AB]=folg[AB];
folga[BC]=folg[BC];
folga[AC]=folg[AC];
limInf=(folg[AC]-dev);
limSup=(folg[AC]+dev);
if (limInf<0)
limInf=0;
if (limSup>NMAX[AC]) limSup=NMAX[AC];
for(i=limInf; i<=limSup; i++)
{
folga[AC]=i;
ret = executa(100);
printf("Bloq=%f - Rec=%f - %d - %d - %d\n",ret.bloq,ret.rec,folga[AB],folga[BC],folga[AC]);
fprintf(texto,"%f;%f;%d;%d;%d\n",ret.bloq,ret.rec,folga[AB],folga[BC],folga[AC]);
}
fclose(texto);
folga[AB] = folg[AB];
folga[BC] = folg[BC];
folga[AC] = folg[AC];
}
//*************************************************************************************************
Sistemas de Telecomunicações 1
22

Documentos relacionados