Added 'simu-opti' practical work.
This commit is contained in:
parent
9b4011234c
commit
731a0e2389
2 changed files with 131 additions and 0 deletions
107
simu-opti/simu.py
Normal file
107
simu-opti/simu.py
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
import networkx as nx
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
import itertools
|
||||||
|
import math
|
||||||
|
|
||||||
|
MAX = 10
|
||||||
|
print("Launching with ", MAX, " iterations...")
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def write_to_file(P_sequences, filename="P_sequences.txt"):
|
||||||
|
with open(filename, "w") as file:
|
||||||
|
for idx, P_sequence in enumerate(P_sequences):
|
||||||
|
file.write(f"P_sequence {idx + 1}:\n")
|
||||||
|
np.savetxt(file, P_sequence, fmt="%.6f")
|
||||||
|
file.write("\n") # Add a blank line between matrices
|
||||||
|
|
||||||
|
def converge(v,p):
|
||||||
|
i = 0
|
||||||
|
while (np.max(np.abs(v - np.mean(v))) > 1):
|
||||||
|
v = np.matmul(p, v)
|
||||||
|
i += 1
|
||||||
|
return i
|
||||||
|
|
||||||
|
def create_vector(max):
|
||||||
|
np.random.seed(0) # For reproducibility
|
||||||
|
vector = np.random.randint(0, 1000, size=(max, 1)) # Random integers
|
||||||
|
while np.any(np.abs(np.diff(vector.flatten())) < 100): # Ensure the difference is at least 100
|
||||||
|
vector = np.random.randint(0, 1000, size=(max, 1))
|
||||||
|
return vector
|
||||||
|
|
||||||
|
# Creating graph
|
||||||
|
G = nx.Graph()
|
||||||
|
for i in range(MAX-1):
|
||||||
|
G.add_edge(i+1, i+2)
|
||||||
|
|
||||||
|
# Initialize the matrix for each node
|
||||||
|
E_mat = {}
|
||||||
|
for i in G.nodes:
|
||||||
|
# 0 either way for each value of the matrix
|
||||||
|
E = np.zeros((MAX, MAX))
|
||||||
|
|
||||||
|
|
||||||
|
for n in G.nodes:
|
||||||
|
for p in G.nodes:
|
||||||
|
# for each node -> n, then each node -> p
|
||||||
|
# n is not a neightbor [v_n does not belong to N(v_i)]
|
||||||
|
if n not in G.neighbors(i):
|
||||||
|
if p == n:
|
||||||
|
E[n - 1, p - 1] = 1
|
||||||
|
# n is a neightbor [v_n belongs to N(v_i)]
|
||||||
|
elif n in G.neighbors(i):
|
||||||
|
if p == n or p == i:
|
||||||
|
E[n - 1, p - 1] = 0.5
|
||||||
|
|
||||||
|
# Store the matrix for this node
|
||||||
|
E_mat[i] = E
|
||||||
|
|
||||||
|
# Emission sequence
|
||||||
|
# For example sigma = sigma_1, sigma_2, ..., sigma_N we have :
|
||||||
|
|
||||||
|
# Creating multiple possible iterations
|
||||||
|
node_permutations = itertools.permutations(range(1, MAX + 1))
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
P_sequences = []
|
||||||
|
|
||||||
|
# Eighenvalues high -> worst scenario, Eighenvalues low -> best scenario (lowest time)
|
||||||
|
lambda_2_values = []
|
||||||
|
convergence_times = []
|
||||||
|
|
||||||
|
for perm in node_permutations:
|
||||||
|
# calculate sequence
|
||||||
|
P_sequence = E_mat[perm[0]]
|
||||||
|
for j in range(1,MAX):
|
||||||
|
P_sequence = np.matmul(P_sequence, E_mat[perm[j]])
|
||||||
|
|
||||||
|
# calculate eighenvalues and convergence time
|
||||||
|
eigenvalues, _ = np.linalg.eig(P_sequence)
|
||||||
|
# sort them then get best second value
|
||||||
|
sorted_eigenvalues = np.sort(np.abs(eigenvalues))[::-1]
|
||||||
|
lambda_2 = sorted_eigenvalues[1]
|
||||||
|
# storing them by calculating the convergence time (1/1-lambda_2)
|
||||||
|
lambda_2_values.append({'p_seq': P_sequence, 'val': lambda_2})
|
||||||
|
#convergence_times.append(converge(vector_0,P_sequence))
|
||||||
|
|
||||||
|
i = i+1
|
||||||
|
|
||||||
|
print("Theorical: ", math.factorial(MAX))
|
||||||
|
print("Final i: ",i)
|
||||||
|
|
||||||
|
# Create the vector v0
|
||||||
|
vector_0 = create_vector(MAX)
|
||||||
|
|
||||||
|
lambda_2_values.sort(key=lambda x: x['val'])
|
||||||
|
print("\n\nBest case: ", converge(vector_0,lambda_2_values[0]['p_seq']))
|
||||||
|
print("Worst case: ", converge(vector_0,lambda_2_values[len(lambda_2_values)-1]['p_seq']))
|
||||||
|
#write_to_file(P_sequences, filename="seq_"+str(MAX)+".txt")
|
||||||
|
|
||||||
|
# Plot
|
||||||
|
# plt.figure(figsize=(8, 6))
|
||||||
|
# plt.scatter(lambda_2_values, convergence_times, color="blue", alpha=0.7)
|
||||||
|
# plt.xlabel("Second Largest Eigenvalue (λ2)")
|
||||||
|
# plt.ylabel("Convergence Time (Cycles)")
|
||||||
|
# plt.title("Convergence Time vs. λ2")
|
||||||
|
# plt.grid(True)
|
||||||
|
# plt.show()
|
24
simu-opti/transition.py
Normal file
24
simu-opti/transition.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def converge(v,p):
|
||||||
|
i = 0
|
||||||
|
while (np.max(np.abs(v - np.mean(v))) > 1):
|
||||||
|
v = np.matmul(p, v)
|
||||||
|
i += 1
|
||||||
|
return i
|
||||||
|
|
||||||
|
def create_vector(max):
|
||||||
|
np.random.seed(0) # For reproducibility
|
||||||
|
vector = np.random.randint(0, 1000, size=(max, 1)) # Random integers
|
||||||
|
while np.any(np.abs(np.diff(vector.flatten())) < 100): # Ensure the difference is at least 100
|
||||||
|
vector = np.random.randint(0, 1000, size=(max, 1))
|
||||||
|
return vector
|
||||||
|
|
||||||
|
v = create_vector(3)
|
||||||
|
p = np.array([
|
||||||
|
[0.500000, 0.250000, 0.250000],
|
||||||
|
[0.250000, 0.375000, 0.375000],
|
||||||
|
[0.000000, 0.250000, 0.750000]
|
||||||
|
])
|
||||||
|
|
||||||
|
print(converge(v,p))
|
Loading…
Add table
Reference in a new issue