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
| def StableWindow(Qy, Qz, fyz, fzy, w, N): wgr = [] h = {} h[0] = {} for q in Qy + Qz: h[0][str(q)] = 0 for i in range(1, N + 1): h[i] = {} for q in Qz: ey = [[element[0], element[2]] for element in fzy if element[1] == q and element[2] in Qy] if len(ey) != 0: ystates = [] for y in ey: if str(y[1]) in h[i - 1].keys(): ystates.append(y) if len(ystates) != 0: h[i][str(q)] = min([w[t[0]] + h[i - 1][str(t[1])] for t in ystates]) if h[i][str(q)] >= 0: wgr.append(q) for q in Qy: ytz = [element[2] for element in fyz if element[1] == q and element[2] in Qz] if len(ytz) != 0: zstates = [] for z in ytz: if str(z) in h[i].keys(): zstates.append(z) if len(zstates) != 0: h[i][str(q)] = max([h[i][str(z)] for z in zstates]) if h[i][str(q)] >= 0: wgr.append(q) wg = [] [wg.append(q) for q in wgr if not q in wg] return wg
def WinLocal(Qy, Qz, fyz, fzy, w, N): wg = StableWindow(Qy, Qz, fyz, fzy, w, N) wp = [] if len(wg) == len(Qy + Qz) or len(wg) == 0: wp = wg else: Qyn = [] for y in Qy: if y in wg: Qyn.append(y) Qzn = [] for z in Qz: if z in wg: Qzn.append(z) wp = WinLocal(Qyn, Qzn, fyz, fzy, w, N) return wp
def attraction(attr, s0, Q, f, wp): if s0 in wp: return True else: res = [] for i in f: if i[1] == s0: res.append(attraction(attr, i[2], Q, f, wp)) for i in res: if i == False: return False attr.append(s0) return True
def winRegion(Qy, Qz, fyz, fzy, w, N, y0, wl): ws = [] n = 1 Qyw = [y for y in Qy] Qzw = [z for z in Qz] while len(ws) != len(Qy + Qz): wp = WinLocal(Qyw, Qzw, fyz, fzy, w, N) wl += wp if len(wp) == 0: break attrr = [] _ = attraction(attrr, y0, Qy + Qz, fzy + fyz, wp) for p in wp + attrr: if p not in ws: ws.append(p) for y in Qyw: if y in ws: Qyw.remove(y) for z in Qzw: if z in ws: Qzw.remove(z) n += 1 return ws
|