-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimulation.py
More file actions
43 lines (38 loc) · 1.55 KB
/
Copy pathsimulation.py
File metadata and controls
43 lines (38 loc) · 1.55 KB
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
import numpy as np
from scipy.optimize import minimize
def run_stress_test(noise_ratio, num_vars=100, num_clauses=400):
# Αυστηρή αρχικοποίηση για στατιστική ορθότητα
np.random.seed(42)
hidden_truth = np.random.randint(0, 2, num_vars)
clauses = []
for _ in range(num_clauses):
vars_c = np.random.choice(range(1, num_vars + 1), 3, replace=False)
if np.random.rand() < noise_ratio:
clause = [v if np.random.rand() > 0.5 else -v for v in vars_c]
else:
clause = [v if hidden_truth[v-1] == 1 else -v for v in vars_c]
clauses.append(clause)
def objective(x):
# Soft-constraint penalty function
x = np.clip(x, 1e-12, 1 - 1e-12)
loss = 0.0
for clause in clauses:
p_false = 1.0
for l in clause:
val = x[abs(l)-1]
p_false *= (1 - val) if l > 0 else val
loss += p_false
return loss
# Ανώτατη ακρίβεια σύγκλισης
res = minimize(objective, np.full(num_vars, 0.5), method='L-BFGS-B',
bounds=[(0, 1)]*num_vars,
options={'ftol': 1e-25, 'gtol': 1e-25, 'maxiter': 50000})
match = np.mean((res.x > 0.5).astype(int) == hidden_truth)
return match
# Σάρωση 0.0 έως 1.0 με βήμα 0.05
noise_levels = np.linspace(0, 1, 21)
print(f"{'Noise':>8} | {'Accuracy':>10}")
print("-" * 22)
for n in noise_levels:
acc = run_stress_test(n)
print(f"{n*100:6.0f}% | {acc*100:9.2f}%")