FixBrokenNode / app.py
Abaridos's picture
Update app.py
c7e858b verified
Raw
History Blame Contribute Delete
11.4 kB
#!/usr/bin/python
import gradio as gr
import csv
import random
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
import geopy.distance
#import osmnx as ox
#from shapely import geometry
import sys
#import os
IsEdge=[0,1,0,0,0]
#Capasity=[1,4,16,64,258]
Capasity=[1,2,3,4,5,6,7,8,9.,8,7,7,5,5,5,4,4,4,4,3,3,3,3,3,2,2,2,1,1,1]
def Geodist ( i,j ):
return ( int(geopy.distance.geodesic( (v_lat[i],v_lon[i]), (v_lat[j],v_lon[j]),ellipsoid='GRS-80').km ))
def PathCheck(path):
try:
start = path[0]
except:
print("No any path!")
sys.exit(1)
return
def PathDistanceLink(path):
PathCheck(path)
distance = 0
numlink = 0
start = path[0]
pathlegend = '(#'+str(v_id[start])+')'+str(v_nodename[start])
for i in range(1, len(path)):
end = path[i]
distance += Geodist ( start,end )
elabel=str(int(distance))+'км'
edge_labels[(start,end)] = elabel
pathlegend += '—'+elabel+'—(#'+str(v_id[end])+')'+str(v_nodename[end])
numlink += 1
start = end
pathlegend = f'Расстоние: {round(distance,0)}км, Ребер:{numlink} \n{pathlegend}'
#print (pathlegend)
return distance,numlink,pathlegend
def PathCapacity(orderedcapacity, path):
PathCheck(path)
numweaknodes = 0
totalcapacity = 0
capacitylegend = ''
for i in range(len(path)):
start = path[i]
addcapacity = OrderedCapacity - v_capasity[start]
if addcapacity > 0:
numweaknodes += 1
totalcapacity += addcapacity
capacitylegend += '(#'+str(start) +')='+ str(round(addcapacity,0)) + 'Гб/с '
capacitylegend = f'Всего добавить:{totalcapacity}Гб/с \nСлабыхУзлов:{numweaknodes} Добавить: {capacitylegend} '
#print (capacitylegend)
return numweaknodes,totalcapacity,capacitylegend
def drawpath(curpath,curcolor,nodesize,nodshape,edgewidth,edgestyle,label):
curpath_edges = list(zip(curpath,curpath[1:]))
nx.draw_networkx_nodes(graph,pos,nodelist=curpath,node_color=curcolor, node_size=nodesize, label=label,node_shape=nodshape)
nx.draw_networkx_edges(graph,pos,edgelist=curpath_edges,edge_color=curcolor,width=edgewidth,style=edgestyle)
#nx.draw_networkx_edge_labels(graph, pos,edge_labels)
return
#________________________________________________________________________________________________
# ЧТЕНИЕ ФАЙЛОВ
def read_init_file(FileVertex,FileEdges):
# ЧТЕНИЕ ФАЙЛА МОЩНОСТЕЙ (ВЕРШИН)
numstr = 0
with open('file_nodes.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
v_id.append( numstr)
v_nodename.append( row['Город'])
v_lat.append( round( float (row['Широта']),2))
v_lon.append( round( float(row['Долгота']),2))
v_capasity.append(round( float(row['Мощность']),2))
numstr += 1
# ЧТЕНИЕ ФАЙЛА СОЕДИНЕНИЙ (РЕБЕР)
vgraph = np.loadtxt('file_connectivity.csv', delimiter=",")
vGeodist=np.zeros((numstr, numstr))
vweight=np.zeros((numstr, numstr))
for i in range (numstr):
for j in range (numstr):
vGeodist[i][j] = Geodist(i,j)
if ( i >= j ):
vgraph[i][j] = 0
vGeodist[i][j] = 0
vGeodist[i][j] = Geodist(i,j)
vweight[i][j] = np.minimum( v_capasity[i],v_capasity[j] ) * vgraph[i][j]
return numstr, v_id ,v_nodename, v_lat, v_lon, v_capasity, vweight
def CalcFixBrokenNode(BreakedNode,Cutoff):
FileVertex='mapmos-cap.csv'
FileEdges='mapmos-matrix.csv'
numstr, v_id ,v_nodename, v_lat, v_lon, v_capasity, vweight = read_init_file(FileVertex,FileEdges)
#Source, Target, = 8,19
OrderedCapacity =4
#customer_path= [8,58,10,22,20,1,48,60,44,67,54]
fig = plt.Figure()
labels = {}
for i in range(numstr):
labels[i] = str(v_id[i])+'/'+str( v_nodename[i] )
for i in range(numstr):
for j in range(numstr):
if vweight[i][j] !=0:
graph.add_edge(i,j , weight= vweight[i][j] )
av = 3* ( vweight.min()+ vweight .max() )/4
elarge = [(u, v) for (u, v, d) in graph.edges(data=True) if d["weight"] > av]
esmall = [(u, v) for (u, v, d) in graph.edges(data=True) if d["weight"] <= av]
for i in range(numstr):
pos[i] = (float(v_lon[i]), float(v_lat[i]))
fig = plt.figure(figsize=(20,10))
fig.set_facecolor("Honeydew")
nx.draw_networkx_nodes(graph, pos, node_color="lightgrey",node_size=400, alpha=0.5,node_shape='o')
nx.draw_networkx_labels(graph,pos,labels)
nx.draw_networkx_edges(graph, pos, edgelist=elarge, alpha=0.5, width=3,edge_color='g',style="dashed",label='мощность >75%')
nx.draw_networkx_edges(graph, pos, edgelist=esmall, alpha=0.5, width=1,edge_color='g',style="dotted",label='мощность < 75%')
pathmin_distance = []
pathmin_numlink = []
pathmin_numweaknodes = []
pathmin_sumaddedcapacity = []
pathmin_integral = []
max_int = sys.maxsize
min_int = -sys.maxsize - 1
Distance,Numlink,Numweaknodes,Sumaddedcapacity = max_int, max_int, max_int,max_int
#print ( PathOptions(customer_path) )
pathlegend1 = PathDistanceLink(customer_path)[2]
pathlegend2 = 'Не существует'
#print ( pathlegend1 )
#numweaknodes,totalcapacity,capacitylegend1 = PathCapacity(16, customer_path)
#print( capacitylegend1)
drawpath(customer_path,'Crimson',200,'o',5,':','Исходный маршрут')
nx.draw_networkx_nodes(graph,pos,nodelist=[customer_path[BreakedNode],customer_path[BreakedNode]],node_color='Black', node_size=400,node_shape='X')
Source = customer_path[BreakedNode-1]
Target = customer_path[BreakedNode+1]
path_min_distance = []
max_int = sys.maxsize
min_int = -sys.maxsize - 1
Distance = max_int
#print(customer_path)
for path in nx.all_simple_paths(graph , source=Source, target=Target,cutoff=Cutoff ):
midpath = path[1 : len(path)-1]
#print(path,' / ',midpath)
#print ( len( list(set(midpath) & set(customer_path ) ) ) )
if len( list(set(midpath) & set(customer_path ) ) )==0 :
drawpath(path,'Blue',100,'o',1,':','')
PDistance = PathDistanceLink(path)[0]
if Distance > PDistance:
path_min_distance = path
Distance = PDistance
pathlegend2 = PathDistanceLink(path)[2]
newpath = customer_path[ :BreakedNode ]+path_min_distance+customer_path[ BreakedNode+1 : ]
pathlegend3 = PathDistanceLink(newpath)[2]
#print ( pathlegend3 )
#numweaknodes,totalcapacity,capacitylegend2 = PathCapacity(16, newpath)
#print( capacitylegend2 )
drawpath(path_min_distance,'Blue',200,'o',5,'-','Новый маршрут')
ax = plt.gca()
ax.set_title(GTitle,weight='bold',fontsize=24)
plt.legend(loc='upper right', shadow=True, fontsize=20)
plt.grid(True)
plt.box(True)
plt.xlabel('Долгота')
plt.ylabel('Широта')
plt.tight_layout()
#plt.savefig("mapmos-gradio.pdf")
plt.show()
#Legends= "Исходный маршрут. "+pathlegend1+'\nИзменение маршрута. '+pathlegend2+"\nНовый маршрут. "+pathlegend3
return pathlegend1,pathlegend2,pathlegend3, fig
graph = nx.Graph()
pos={}
v_id = []
v_nodename = []
v_lat = []
v_lon = []
v_capasity = []
edge_labels = {}
FileVertex='mapmos-cap.csv'
FileEdges='mapmos-matrix.csv'
numstr, v_id ,v_nodename, v_lat, v_lon, v_capasity, vweight = read_init_file(FileVertex,FileEdges)
#Source, Target= 8,19
OrderedCapacity =4
customer_path= [8,58,10,22,20,1,41,66,57,49,51,60,44, 25,7,17,67,54]
Source, Target = customer_path[0], customer_path[-1]
GTitle=f'Маршрут: [#{v_id[Source] }]{v_nodename[Source]} ({ v_lat[Source] } , {v_lon[ Source ]})—[#{v_id[Target] }]{v_nodename[Target] }({ v_lat[Target] } , { v_lon[ Target ]}) '
#CalcFixBrokenNode(4,3)
'''
demo = gr.Interface(
CalcFixBrokenNode,
[
gr.Slider(1, len(customer_path)-2, value=5, step=1, label="Поврежденный узел"),
gr.Radio([1,2,3,4], info="Переключений"),
],
[
"text",
"text",
"text",
"plot"
]
)
demo.launch()
'''
# Gradio interface
theme=gr.themes.Default( primary_hue=gr.themes.colors.red, secondary_hue=gr.themes.colors.pink )
with gr.Blocks(theme=theme) as demo:
#FileVertex = gr.Textbox(label="FileVertex", value='mapmos-cap.csv')
#FileEdges = gr.Textbox(label="FileEdges", value='mapmos-matrix.csv')
#Source = gr.Number(label="Source", value=19)
#Target = gr.Number(label="Target", value=18)
#Cutoff = gr.Number(label="Cutoff", value=3)
#OrderedCapacity = gr.Number(label="OrderedCapacity", value=4)
#customer_path = gr.Textbox(label="customer_path", value=[6,8,22,1,48,60,44,67,54] )
#BreakedNode = gr.Number(label='BreakedNode', value = 4).
#m1 = [0,0,0,0]
with gr.Row():
with gr.Column(scale=10):
plot = gr.Plot()
text1=gr.Textbox(label="Исходный маршрут", info="", lines=1, value="")
text3=gr.Textbox(label="Новый маршрут", info="", lines=1, value='')
with gr.Column(scale=1):
with gr.Row():
text2=gr.Textbox(label="Изменение маршрута", info="Расстояния (км), Пропускные способности (гб/с)", lines=1, value="")
BreakedNode = gr.Slider(
minimum=1, maximum=len(customer_path)-2, value=5, step=1, label="# Узла", info='Номер поврежденного узла с начала маршрута'
)
Cutoff = gr.Radio([1,2,3,4], value=2,label="Переключений", info='Количество переключение в обходном маршруте')
#Method = gr.Radio([1,2,3,4], value=1,label="Меньше", info='1- расстояние 2-переключений 3-слабых узлов 4-добавить мощности')
#Method=gr.CheckboxGroup([1, 2, 3,4], label="Меньше", info="1- расстояние 2-переключений 3-слабых узлов 4-добавить мощности")
#gr.Checkbox(label=m1, info="Меньше расстояние")
#mm2=gr.Checkbox(info="Меньше переключений"),
#mm3=gr.Checkbox(info="Меньше слабых узлов"),
#mm4=gr.Checkbox(info="Меньше добавить мощности"),
#Cutoff = gr.Slider(
# minimum=1, maximum=4, value=2, step=1, label="Переключений"
# )
#Cut = gr.Radio([1, 2, 3,4], value=1, label="Переключений", info=""),
btn = gr.Button("Рассчитать")
btn.click(CalcFixBrokenNode, inputs=[BreakedNode, Cutoff], outputs=[text1,text2, text3, plot])
demo.launch()