Modifiez la synchronisation du signal pour réduire l'attente du signal.
Il y a un réseau comme indiqué ci-dessous et des signaux à quatre emplacements, D, E, H et I.
Chacun des quatre utilisateurs se déplacera comme suit:
--Au temps 0, laissez A pour L
Il existe 4 modèles de synchronisation du signal et il peut être déplacé comme indiqué dans le tableau ci-dessous.
modèle | T1 | T2 | T3 | T4 |
---|---|---|---|---|
0 | Haut et bas | Gauche et droite | Gauche et droite | Haut et bas |
1 | Haut et bas | Haut et bas | Gauche et droite | Gauche et droite |
2 | Gauche et droite | Haut et bas | Haut et bas | Gauche et droite |
3 | Gauche et droite | Gauche et droite | Haut et bas | Haut et bas |
À ce stade, trouvez le modèle de synchronisation des signaux D, E, H et I qui s'écoule le plus facilement.
python3
%matplotlib inline
import networkx as nx, matplotlib.pyplot as plt
from more_itertools import chunked
plt.rcParams['figure.figsize'] = 4, 4
g = nx.DiGraph()
for i, ar in enumerate(['ADBECDEFGHIJHKIL', '', 'DEDHEIHI']):
for fr, to in chunked(ar, 2):
g.add_edge(fr, to, weight=i+1)
if i == 2:
g.add_edge(to, fr, weight=i+1)
pos = {chr(i+65):(int(x),int(y)) for i, (x,y)
in enumerate(chunked('154504144454011141511040', 2))}
nx.draw(g, pos, node_color='white')
nx.draw_networkx_labels(g, pos);
Séparez les couches pour chaque utilisateur. Ce sera 3 dimensions utilisateur x temps x ciel.
python3
import numpy as np, pandas as pd
from pulp import *
from ortoolpy import addvars, addbinvars
def make(g, T):
stnd, ednd, sttm = 'ABCG', 'LKJF', [0,2,1,2] #Le début, la fin et l'heure de l'utilisateur générateur
for la in range(4):
for t1 in range(T):
for nd in g.nodes():
yield la, nd, t1, nd, t1+1
for fr, dc in g.edge.items():
for to, atr in dc.items():
t2 = t1 + atr['weight']
if t2 <= T:
yield la, fr, t1, to, t2
for l, c in enumerate(stnd):
yield l, '_', 0, c, sttm[l]
for l, c in enumerate(ednd):
for t in range(8,T):
t2 = t+sttm[l]
if t2 < T:
yield l, c, t2, '_', 0
T = 13
a = pd.DataFrame(make(g, T), columns=['Layer', 'FrNd', 'FrTm', 'ToNd', 'ToTm'])
a['From'] = a.FrNd+a.FrTm.astype(str)
a['To'] = a.ToNd+a.ToTm.astype(str)
a['Weight'] = a.ToTm - a.FrTm
a.loc[a.FrNd == a.ToNd, 'Weight'] = 0.001
a.loc[(a.FrNd == '_') | (a.ToNd == '_'), 'Weight'] = 0
a[:3]
Layer | FrNd | FrTm | ToNd | ToTm | From | To | Weight | |
---|---|---|---|---|---|---|---|---|
0 | 0 | J | 0 | J | 1 | J0 | J1 | 0.001 |
1 | 0 | A | 0 | A | 1 | A0 | A1 | 0.001 |
2 | 0 | B | 0 | B | 1 | B0 | B1 | 0.001 |
python3
m = LpProblem()
vs = addbinvars(4, 4) #Décalage DEHI
a['Var'] = addvars(len(a), upBound=1) #couler
m += lpDot(a.Weight, a.Var) #Fonction objective
for i in range(4):
m += lpSum(vs[i]) == 1 #Un seul décalage
for v in a[a.FrNd=='_'].Var:
m += v == 1 #Se produit pour chaque couche
for l in range(4):
b = a[a.Layer == l]
for nd in set(b.From.unique()) | set(b.To.unique()):
#On et out sont égaux dans chaque couche
m += lpSum(b[b.From == nd].Var) == lpSum(b[b.To == nd].Var)
for t in range(T):
b = a[a.FrTm == t]
for i, s in enumerate(['DH', 'EI', 'HK', 'IL']):
c = b[b.FrNd==s[0]]
#Contrôle du signal
m += lpSum(c[c.ToNd==s[1]].Var) <= vs[i][(t+0)%4]+vs[i][(t+1)%4]
m += lpSum(c[c.ToNd!=s[1]].Var) <= vs[i][(t+2)%4]+vs[i][(t+3)%4]
%time m.solve()
print(LpStatus[m.status], value(m.objective))
print('Horaire', np.vectorize(value)(vs)@np.arange(4))
>>>
Wall time: 79.5 ms
Optimal 32.001000000000005
Horaire[ 1. 3. 2. 0.]
c'est tout