9.1 Ý nghĩa
Sau khi đã tìm được đường đi cho 1 yêu cầu nào đó thì yêu cầu này chiếm 1 phần dung lượng hệ thống do đó chúng ta phải cập nhật lại dung lượng của hệ thống
9.2 Thực hiện
ktra=0
for k in range(len(mtd)):#Duyệt tập hợp đường
if (kiemtra(mtd[k],mtdl,dl,ketnoi[i][j])==1):#Nếu kết nối ko quá tải yc.append(mtd[k])#Thêm yêu cầu vào ds yêu cầu được đáp ứng #Cập nhật dung lượng hệ thống
#Cộng thêm dung lượng hiện thời với dung lượng link đầu vào(vị trí [i][j] của ma trận kết nối)
mtdl[1][mtd[k][2]-1]=mtdl[1][mtd[k][2]-1]+ketnoi[i][j] mtdl[0][mtd[k][3]-1]=mtdl[0][mtd[k][3]-1]+ketnoi[i][j] mtdl[1][mtd[k][4]-1]=mtdl[1][mtd[k][4]-1]+ketnoi[i][j] mtdl[2][mtd[k][5]-1]=mtdl[2][mtd[k][5]-1]+ketnoi[i][j]
ktra=1#Biến kt bằng 1 là đã tìm được đường thỏa mãn cho kết nối break#Chuyển qua yêu cầu tiếp theo
if (ktra==0):#Nếu sau khi duyệt hết các đường mà biến ktra vẫn bằng 0 tức là tất cả các đường đi đã quá tải
yctc=[mtd[0][0],mtd[0][6],ketnoi[i][j]]
tc.append(yctc)#thêm yêu cầu vào danh sách từ chối
10.Khối tạo cây
10.1.Mục đích:
- Biểu diễn các node sever,top-of-rack switch , aggregation, core trên 1 đồ thị. - Tạo ra 1 giao diện trực quan biểu diễn cấu trúc topology gồm 4 tầng tương ứng với 4 chuyển mạch chức năng .
10.2.Các công cụ hỗ trợ:
-Tutorial về: Tkinter 8.4 reference: 1 công cụ để xây dựng giao diện cho Python và đã được tích hợp sẵn trong Python.
Link: http://infohost.nmt.edu/tcc/help/pubs/tkinter/
10.3.Định dạng cây.
- Cây gồm có 4 tầng :tâng core , tầng chuyển mạch tích hợp (aggregation) , tầng top-of-rack , tầng server.
- Mỗi tầng gồm có các node hình chữ nhật để biểu diễn.
- Các node có màu đen ,riêng đối với tầng server nếu không phát dữ liệu thì node sẽ được để màu xanh để phân biệt với các node còn lại.
-Tạo ra liên kết giữa các tầng : các node được nối với nhau bằng 1 đường màu đỏ - Ở cây đã được Optimizer thì những node nào được tối ưu hóa không cần sử dụng sẽ có màu đỏ và những đường liên kết đã được tối ưu sẽ được nối với nhau băng nét đứt.
10.4. Cách thực hiện.
10.4.1.Xây dựng cây (khi chưa tối ưu hóa ).
*Bước 1: Tạo khung hình cần vẽ:
-Dùng lệnh canvas của Python để tạo ra 1 cửa sổ mới cho việc vẽ cây. Width và height là chiều rộng và chiều cao của khung hình cần vẽ bg = màu nền của khung hình (thường lấy màu trắng :white) canvas = Canvas(width=x, height=600, bg='white')
canvas.pack(expand=YES, fill=BOTH)
*Bước 2:Tạo hình chữ nhật cho node
Để vẽ được hình chữ nhật ta cần có các thông số về 4 đỉnh.Do trong Python không có hàm tạo hình chữ nhật nên ta sẽ sử dụng hàm tạo đa giác với thông số là tọa độ 4 đỉnh để vẽ.
-Chọn tham số n và d để xác định chiều dài và rộng hình chữ nhật cần vẽ -Ta lấy tọa độ của I (x,y) rồi tính ra các đỉnh còn lại của hình chữ nhật A(x-n,y+d) , B(x+n,y+d) , C(x+n,y-d) , D(x-n.,y-d)
-Hàm để vẽ hình chữ nhật
def taohcn(c,x,y): #Ham ve hinh chu nhat
n=10 d=5
c.create_polygon(x-n,y-d,x+n,y-d,x+n,y+d,x-n,y+d) #Hàm tạo ra đa giác hcn
D C n A B d Y X I
- Hàm để vẽ hình chữ nhật có màu :
Ta sử dụng thêm tham số m : màu cần làm đầy cho hình chữ nhật Vd. m= blue để vẽ màu hình chữ nhật là màu xanh
def taohcncm(c,x,y,m): #Hàm vẽ hình chữ nhật có màu
n=10 #dài 20
d=5 #rộng 10
c.create_polygon(x-n,y-d,x+n,y-d,x+n,y+d,x-n,y+d,fill=m)
*Bước 3 :Tạo mảng vị trí của từng đối tượng cần vẽ trên cây
def taomangvt(x,s,giua):# Ham tao mang vi tri cua tung doi tuong tren hinh ve cay
a=[] #x:số node trên 1 tầng ,s:khoảng cách giữa các node
i=0 #giua: vị trí trung tâm của khung hình
for i in range(x):
a.append(0)#Tạo ma trận x phần tử
if (x-2*(x/2)==1):#Nếu số chuyển mạch là lẻ for i in range(x):
a[i]=(giua+mu(-1,i)*(i/2+i-2*(i/2))*s)
#Các chuyển mạch sẽ được sắp xếp theo cách: chuyển mạch đầu tiên nằm chính giữa màn hình , các chuyển mạch khác nằm 2 bên màn hình đối xứng qua chuyển mạch thứ nhất
sx=sapxep(a)#Sau khi tạo, vị trí các chuyển mạch lung tung nên phải sắp xếp return a
else:#Nếu số chuyển mạch là chẵn
a[0]=giua-s/2#Hai chuyển mạch đầu tiên nằm đối xứng qua điểm giữa cách điểm giữa s/2 để tổng lại 2 chuyển mạch cách nhau s
a[1]=giua+s/2 for i in range(2,x,1):
a[i]=giua+mu(-1,i+1)*((i+1)/2+(i+1)-2*((i+1)/2)-1)*s+mu(-1,i+1)*s/2 #Các chuyển mach khác nằm 2 bên màn hình đối xứng qua điểm giữa
a=sapxep(a) return a
*Bước 4: Vẽ cây
def vecay(l,n,m,h,a,b,c,e,f,bit): # Ham ve cay #Đầu vào:
#l: số server
#n: số chuyển mạch top of rack #m: số chuyển mạch tích hợp #h: Số chuyển mạch lõi
#f: Số chuyển mạch top of rack nối vào 1 chuyển mạch tích hợp #a: Ma trận thể hiện kết nối tầng core-tích hợp
#b: Ma trận thể hiện kết nối tầng tích hợp-top of rack #c: Ma trận thể hiện kết nối tầng top of rack – server #bit:Ma trận bitrate
i=0 j=0
d=m/h #Tỷ lệ giữa số chuyển mạch tích hợp và chuyển mach lõi sh=60 #khoảng cách giữa các core
sm=50 # khoảng cách giữa các agg
sn=50 # khoảng cách giữa các top of rack sl=40 # khoảng cách giữa các server
yh=30 #chiều cao theo trục y của tầng core ym=180 #tầng agg
yn=330 #tầng switch yl=480 #tầng server from Tkinter import *
canvas = Canvas(width=800, height=800, bg='white') canvas.pack(expand=YES, fill=BOTH)
mh=taomangvt(h,sh,x/2) #tạo mt vị trí h core và khoảng cách giữa các core la sh mm=taomangvt(m,sm,x/2) #tạo mt vị trí m agg và khoảng cách các node là sm mn=taomangvt(n,sn,x/2) # tạo ma trận vị trí top of rack
ml=taomangvt(l,sl,x/2) # tạo ma trận vị trí server for i in range (h):
taohcn(canvas,mh[i],yh) #Vẽ hình chữ nhật thể hiện các core for i in range(m):
taohcn(canvas,mm[i],ym) #Vẽ hình chữ nhật thể hiện các cm tích hợp for i in range(n):
taohcn(canvas,mn[i],yn) # Vẽ hình chữ nhật thể hiện các top of rack for i in range(l):
if (bit[0][i]!=0):
taohcn(canvas,ml[i],yl) #Nếu server phát thể hiện server bằng màu đen else:
taohcncm(canvas,ml[i],yl,'blue')
#Nếu server ko phát thể hiện server bằng màu xanh #tạo đường thẳng nối giữa tầng có màu đỏ
for i in range(h):
canvas.create_line(mm[a[i][j]-1],ym,mh[i],yh,fill='red') for i in range(m): for j in range(1,f+1,1): canvas.create_line(mn[b[i][j]-1],yn,mm[i],ym,fill='red') for i in range(n): for j in range(1,e+1,1): canvas.create_line(ml[c[i][j]-1],yl,mn[i],yn,fill='red') mainloop() *Bước 5: Kết quả
Với hệ thống có 2 chuyển mạch lõi, 4 chuyển mạch tích hợp, 4 chuyển mạch top of rack , 8 server. Tối đa 3 server nối vào 1 chuyển mạch top of rack. Tối đa 3
10.4.2.Xây dựng cây khi đã tối ưu hóa.
-Tương tự như xây dựng cây bình thường
-Sau khi tối ưu hóa thì những node không sử dụng ta để màu đỏ và những đường không sử dụng ta biểu diễn nó dưới dạng đứt nét (bằng lệnh dash =(3,5))
canvas.create_line(mm[a[i][j]-1],ym,mh[i],yh,fill='black',dash=(3,5) )
-Hàm vẽ cây 2 khi đã tối ưu hóa:
def vecay2(l,n,m,h,a,b,c,e,f,bit,duong,dl): # Ham ve cay #Các đầu vào như trên
#Có thêm các biến:
#duong: ma trận đường đi của các yêu cầu được đáp ứng #dl: dung lượng hiện thời của hệ thống
i=0 j=0 x=1200 d=m/h
d=m/h #sổ liên kết giữa core va agg sh=60 #khoảng cách giữa các core sm=50 # khoảng cách giữa các agg sn=50 # khoảng cách giữa các switch sl=40 # khoảng cách giữa các server
yh=30 #chiều cao theo trục y của tầng core ym=180 #tầng agg
yn=330 #tầng switch yl=480 #tầng server from Tkinter import *
canvas = Canvas(width=x, height=600, bg='white') canvas.pack(expand=YES, fill=BOTH)
mh=taomangvt(h,sh,x/2) mm=taomangvt(m,sm,x/2) mn=taomangvt(n,sn,x/2)
ml=taomangvt(l,sl,x/2) for i in range (h): if (dl[0][i]==0):
taohcncm(canvas,mh[i],yh,"red")
#Các chuyển mạch ko được sử dụng được thể hiện bằng màu đỏ else:
taohcn(canvas,mh[i],yh)#Nếu vẫn sử dụng thì thể hiện bằng màu đen for i in range(m): if(dl[1][i]==0): taohcncm(canvas,mm[i],ym,"red") else: taohcn(canvas,mm[i],ym) for i in range(n): if (dl[2][i]==0): taohcncm(canvas,mn[i],yn,"red") else: taohcn(canvas,mn[i],yn) for i in range(l): if (bit[0][i]!=0):
taohcn(canvas,ml[i],yl) else: taohcncm(canvas,ml[i],yl,'blue') for i in range(h): for j in range(1,m+1,1): canvas.create_line(mm[a[i][j]-1],ym,mh[i],yh,fill='black',dash=(3,5) ) for i in range(m): for j in range(1,f+1,1): canvas.create_line(mn[b[i][j]-1],yn,mm[i],ym,fill='black',dash=(3,5) ) for i in range(n): for j in range(1,e+1,1): canvas.create_line(ml[c[i][j]-1],yl,mn[i],yn,fill='black',dash=(3,5) ) #Đến đây ta đã vẽ được cây đầu vào bằng các đường màu đen nét đứt. Tiếp theo ta sẽ vẽ các đường đi của yêu cầu được đáp ứng bằng nét đỏ đậm
for i in range(len(duong)):#Duyệt tập hợp đường
canvas.create_line(ml[duong[i][0]-1],yl,mn[duong[i] [1]-1],yn,fill='red',width=5)
canvas.create_line(mn[duong[i][1]-1],yn,mm[duong[i] [2]-1],ym,fill='red',width=5)
canvas.create_line(mm[duong[i][2]-1],ym,mh[duong[i] [3]-1],yh,fill='red',width=5) canvas.create_line(mh[duong[i][3]-1],yh,mm[duong[i] [4]-1],ym,fill='red',width=5) canvas.create_line(mm[duong[i][4]-1],ym,mn[duong[i] [5]-1],yn,fill='red',width=5) canvas.create_line(mn[duong[i][5]-1],yn,ml[duong[i] [6]-1],yl,fill='red',width=5)
#Vẽ lại các đường đi của liên kết được đáp ứng tạo thành cây mới mainloop()
-Cây ở trên sau khi được tối ưu hóa:
Tiến hành vẽ lại cây với các đường đi được in đậm, những chuyển mạch không dùng được tô đỏ cho người dùng dễ hiểu.
Trên hình ta thấy:
o Các chuyển mạch màu đen là đang được sử dụng o Các chuyển mạch màu đỏ là đã được tắt
o Các đường nét đứt là cây cũ trước khi chưa Optimizer o Các đường màu đỏ đậm là cây mới sau khi Optimizer o Các server màu đen là server phát yêu cầu