-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlocal_search.c
More file actions
146 lines (136 loc) · 5.7 KB
/
Copy pathlocal_search.c
File metadata and controls
146 lines (136 loc) · 5.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
* local_search.c: Virtual Machine Placement Problem - Local Search Stage
* Date: 17-11-2014
* Author: Fabio Lopez Pires (flopezpires@gmail.com)
* Corresponding Conference Paper: A Many-Objective Optimization Framework for Virtualized Datacenters
*/
/* include local search stage header */
#include "local_search.h"
/* local_search: local optimization of the population
* parameter: population matrix
* parameter: utilization matrix of the physical machines of all the individuals
* parameter: physical machines matrix
* parameter: virtual machines matrix
* parameter: number of individuals
* parameter: number of physical machines
* parameter: number of virtual machines
* returns: optimized population matrix
*/
int** local_search(int **population, int ***utilization, int **H, int **V, int number_of_individuals, int h_size, int v_size)
{
/* iterators */
int iterator_individual = 0;
int physical_position = 0;
int physical_position2 = 0;
int iterator_position = 0;
int iterator_virtual = 0;
int iterator_virtual2 = 0;
int iterator_physical = 0;
int option = 0;
/* randon value */
float val_rand;
/* value to executed */
int option_to_execute;
val_rand = drand48() *1.0;
if (val_rand > 0 && val_rand <= 0.5)
option_to_execute = 0;
else
option_to_execute = 3;
while(option < 2)
{
/* if val_rand is equal to or less than 5 is executed 1 and 2, otherwise is executed 2 and 1 */
if (val_rand > 0 && val_rand <= 0.5)
{
option_to_execute++;
option++;
} else if (val_rand > 0.5 && val_rand < 1.0)
{
option_to_execute--;
option++;
}
/* comes of shut down physical machines to the migrate in other virtual machines */
if (option_to_execute == 1)
{
/* iterate on individuals */
for (iterator_individual = 0 ; iterator_individual < number_of_individuals ; iterator_individual++)
{
/* iterate on virtual machines */
for (iterator_virtual = 0 ; iterator_virtual < v_size ; iterator_virtual++)
{
/* get the position of the physical machine */
physical_position = population[iterator_individual][iterator_virtual];
if (physical_position > 0)
{
/* iterate on virtual machines */
for (iterator_virtual2 = 0 ; iterator_virtual2 < v_size ; iterator_virtual2++)
{
/* get the position of the physical machine */
physical_position2 = population[iterator_individual][iterator_virtual2];
if (physical_position2 > 0)
{
if (physical_position != physical_position2)
{
/* If the use of the VM not exceeds the capacity of the physical machine performs the migration */
if (utilization[iterator_individual][physical_position-1][0] + V[iterator_virtual2][0] < H[physical_position-1][0]
&& utilization[iterator_individual][physical_position-1][1] + V[iterator_virtual2][1] < H[physical_position-1][1]
&& utilization[iterator_individual][physical_position-1][2] + V[iterator_virtual2][2] < H[physical_position-1][2])
{
/* refresh the utilization */
utilization[iterator_individual][physical_position2-1][0] -= V[iterator_virtual2][0];
utilization[iterator_individual][physical_position2-1][1] -= V[iterator_virtual2][1];
utilization[iterator_individual][physical_position2-1][2] -= V[iterator_virtual2][2];
utilization[iterator_individual][physical_position-1][0] += V[iterator_virtual2][0];
utilization[iterator_individual][physical_position-1][1] += V[iterator_virtual2][1];
utilization[iterator_individual][physical_position-1][2] += V[iterator_virtual2][2];
/* refresh the population */
population[iterator_individual][iterator_virtual2] = population[iterator_individual][iterator_virtual];
}
}
}
}
}
}
}
}
/* try to place the virtual machines turned off in the physical machines turned on */
if (option_to_execute == 2)
{
/* iterate on individuals */
for (iterator_individual = 0 ; iterator_individual < number_of_individuals ; iterator_individual++)
{
/* iterate on virtual machines */
for (iterator_virtual = 0 ; iterator_virtual < v_size ; iterator_virtual++)
{
/* get the position of the physical machine */
physical_position = population[iterator_individual][iterator_virtual];
if (physical_position == 0)
{
/* iterate on virtual machines */
for (iterator_virtual2 = 0 ; iterator_virtual2 < v_size ; iterator_virtual2++)
{
/* get the position of the physical machine */
physical_position2 = population[iterator_individual][iterator_virtual2];
if (physical_position2 > 0)
{
/* If the use of the VM not exceeds the capacity of the physical machine performs the migration */
if (utilization[iterator_individual][physical_position2-1][0] + V[iterator_virtual][0] < H[physical_position2-1][0]
&& utilization[iterator_individual][physical_position2-1][1] + V[iterator_virtual][1] < H[physical_position2-1][1]
&& utilization[iterator_individual][physical_position2-1][2] + V[iterator_virtual][2] < H[physical_position2-1][2])
{
/* refresh the utilization */
utilization[iterator_individual][physical_position2-1][0] += V[iterator_virtual][0];
utilization[iterator_individual][physical_position2-1][1] += V[iterator_virtual][1];
utilization[iterator_individual][physical_position2-1][2] += V[iterator_virtual][2];
/* refresh the population */
population[iterator_individual][iterator_virtual] = population[iterator_individual][iterator_virtual2];
iterator_virtual2 = v_size;
}
}
}
}
}
}
}
}
return population;
}