Untitled
unknown
julia
9 months ago
14 kB
9
Indexable
using IterTools
using Distributions
using SpecialFunctions
using QuadGK
# تعریف مقادیر ثابت
const q = 2
const Y = 500
const D0 = 50
const Z0 = 0.25
const Z1 = 0.25
const Ci = 0.5
const C0_RSS = 20
const Cq = 4.22
const Cr = 2.11
const p0 = 0.95
# تعریف مقادیر متغیر برای i های مختلف
const p = [0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 0.99]
const D1 = [2734.77, 3113.924, 3544.304, 4000, 4531.646, 5113.924, 5620.253]
const D2 = [1077.7, 1051.086, 1025.39, 1000, 975.222, 951.055, 932.395]
const Z2 = [2.155, 2.102, 2.051, 2.0, 1.95, 1.902, 1.865]
const lambda_i = [0.3523 / 1000, 0.3436 / 1000, 0.3352 / 1000, 0.3269 / 1000, 0.3188 / 1000, 0.3109 / 1000, 0.3048 / 1000]
# تابع betainc برای محاسبه تابع بتای ناقص
function betainc(a, b, x)
f(t) = t^(a - 1) * (1 - t)^(b - 1)
return quadgk(f, 0, x)[1] / beta(a, b)
end
# تابع برای محاسبه آلفا (α)
function calculate_alpha(r, k, L)
I = collect(product([0:r for _ in 1:k]...)) # تولید تمام ترکیبات ممکن
R = [sum(r) for r in I] # محاسبه مجموع هر ترکیب
ucl = Int(floor((k * r / 2 + (L * sqrt(k * r * delta0(k) / 4)) + k * r) / 2))
if ucl > k * r
return 100000 # مقدار بازگشتی در صورت عدم رعایت شرط
end
alpha = 0.0
for c in 0:ucl
r_vec = I[R.==c] # انتخاب ترکیباتی که مجموع آنها برابر c است
for i in 1:length(r_vec)
prod_term = 1.0
for j in 1:k
Ji = r_vec[i][j] # مقدار j_i برای ترکیب فعلی
binom_val = binomial(r, Ji) # ضریب دوجملهای
p_val = betainc(j + 1, k - j, 0.5) # محاسبه I_{1/2}(j + 1, k - j + 1)
prod_term *= binom_val * (p_val^(r - Ji)) * ((1 - p_val)^Ji)
end
alpha += prod_term
end
end
return 1 - alpha
end
# تابع برای محاسبه بتا (β_i)
function calculate_beta_i(r, k, L, i)
I = collect(product([0:r for _ in 1:k]...)) # تولید تمام ترکیبات ممکن
R = [sum(r) for r in I] # محاسبه مجموع هر ترکیب
ucl = Int(floor((k * r / 2 + (L * sqrt(k * r * delta0(k) / 4)) + k * r) / 2))
if ucl > k * r
return 100000 # مقدار بازگشتی در صورت عدم رعایت شرط
end
beta_i = 0.0
for c in 0:ucl
r_vec = I[R.==c] # انتخاب ترکیباتی که مجموع آنها برابر c است
for j in 1:length(r_vec)
prod_term = 1.0
for l in 1:k
Ji = r_vec[j][l] # مقدار j_i برای ترکیب فعلی
binom_val = binomial(r, Ji) # ضریب دوجملهای
p_val = betainc(l + 1, k - l, p[i]) # محاسبه I_p(l + 1, k - l + 1)
prod_term *= binom_val * (p_val^(r - Ji)) * ((1 - p_val)^Ji)
end
beta_i += prod_term
end
end
return beta_i
end
# تابع برای محاسبه P(I)
function calculate_PI(h, r, q, k, L)
lambda = sum(lambda_i)
beta = [calculate_beta_i(r, k, L, i) for i in 1:7] # محاسبه beta_i برای تمام iها
PI = sum((1 - beta[i]) * (1 - exp(-lambda_i[i] * h^q)) * exp(-(lambda - lambda_i[i]) * h^q) /
((1 - exp(-lambda * h^q)) * (1 - beta[i] * exp(-(lambda - lambda_i[i]) * h^q))) for i in 1:7)
return PI
end
function calculate_P_I_i(h, q, r, k, L, lambda, i)
lambda_i_val = lambda_i[i] # مقدار lambda_i برای اندیس i
beta_i = calculate_beta_i(r, k, L, i) # محاسبه beta_i برای اندیس i
# صورت کسر
numerator = (1 - beta_i) * (1 - exp(-lambda_i_val * h^q)) * exp(-(lambda - lambda_i_val) * h^q)
# مخرج کسر
denominator = (1 - exp(-lambda * h^q)) * (1 - beta_i * exp(-(lambda - lambda_i_val) * h^q))
# جلوگیری از تقسیم بر صفر
if denominator == 0.0
denominator = 1e-10
end
# محاسبه P_I_i
P_I_i = numerator / denominator
return P_I_i
end
# تابع Fi
function Fi(m, i)
return m * binomial(m - 1, i - 1) * beta(i, m - i + 1) * betainc(i, m - i + 1, 0.5)
end
# تابع برای محاسبه delta0
function delta0(m)
return 1 - (4 / m) * sum((Fi(m, i) - 0.5)^2 for i in 1:m)
end
# تابع برای محاسبه E(C)
function calculate_EC(r, k, L, h, alpha)
lambda = sum(lambda_i)
PI = calculate_PI(h, r, q, k, L)
beta = [calculate_beta_i(r, k, L, i) for i in 1:7] # محاسبه beta_i برای تمام iها
term1 = D0 * (1 / lambda)^(1 / q) * gamma(1 / q + 1)
term2 = alpha * Y * exp(-lambda * h^q) / (1 - exp(-lambda * h^q))
term3 = 0.0
for i in 1:7
sum_j = 0.0
for j in 1:100 # استفاده از 100 جمله برای تقریب سری
numerator = (exp(-lambda * h^q))^j - (beta[i] * exp(-(lambda - lambda_i[i]) * h^q))^j
denominator = exp(-lambda_i[i] * h^q) - beta[i]
sum_j += j^(1 / q) * h * (1 - beta[i]) * (1 - exp(-lambda_i[i] * h^q)) * (numerator / denominator)
end
term3 += D1[i] / PI * sum_j
end
term4 = 0.0
for i in 1:7 # جمع روی i از 1 تا 7
inner_sum = 0.0
for j in 1:100 # تقریب بینهایت با 100 جمله
# جزء نمایی
exp_term = exp(-(lambda - lambda_i[i]) * h^q)
exp_term_j = exp_term^j
# جزء گاما
gamma_term_prev = gamma((q + 1) / q, lambda_i[i] * (j - 1) * h^q)
gamma_term_curr = gamma((q + 1) / q, lambda_i[i] * j * h^q)
gamma_diff = gamma_term_prev - gamma_term_curr
# جزء تقسیم
denominator = lambda_i[i]^(1 / k)
# محاسبه جملهی j
numerator = (-beta[i]) * exp_term_j / (1 - (beta[i] * exp_term))
term_j = numerator * gamma_diff / denominator
inner_sum += term_j
end
# اضافه کردن به ترم ۴
term4 += D1[i] / PI * inner_sum
end
term5 = C0_RSS # مقدار اولیه C0_RSS
rk_term = r * k * (k * Ci + (k - 1) * Cr + Cq)
sum_term = 0.0
for i in 1:7
beta_i = calculate_beta_i(r, k, L, i) # محاسبه beta_i برای هر i
lambda_i_val = lambda_i[i] # مقدار lambda_i برای هر i
exp_term_lambda = exp(-lambda * h^q)
term1 = exp_term_lambda / (1 - exp_term_lambda)
exp_term_lambda_diff = exp(-(lambda - lambda_i_val) * h^q)
term2 = 1 / (1 - beta_i * exp_term_lambda_diff)
P_I_i = calculate_P_I_i(h, q, r, k, L, lambda, i)
sum_term += (P_I_i / PI) * (term1 + term2)
end
# اضافه کردن به term5
term5 += rk_term * sum_term
term6 = sum(calculate_P_I_i(h, q, r, k, L, lambda, i) / PI * D2[i] for i in 1:7)
EC = term1 + term2 + term3 - term4 + term5 + term6
return EC
end
# تابع برای محاسبه E(T)
function calculate_ET(r, k, L, h, alpha)
lambda = sum(lambda_i)
PI = calculate_PI(h, r, q, k, L)
beta = [calculate_beta_i(r, k, L, i) for i in 1:7] # محاسبه beta_i برای تمام iها
term1 = (1 / lambda)^(1 / q) * gamma(1 / q + 1) + alpha * Z0 * (exp(-lambda * h^q) / (1 - exp(-lambda * h^q))) + Z1
term2 = 0.0
for j in 1:100 # استفاده از 100 جمله برای تقریب سری
for i in 1:7
numerator = (1 - beta[i]) * (1 - exp(-lambda_i[i] * h^q)) * ((exp(-lambda * h^q))^j - (beta[i] * exp(-(lambda - lambda_i[i]) * h^q))^j)
denominator = PI * (exp(-lambda_i[i] * h^q) - beta[i])
term2 += (j^(1 / q) * h) * numerator / denominator
end
end
term3 = 0.0
for i in 1:7
sum_j = 0.0
for j in 1:100 # استفاده از 100 جمله برای تقریب سری
numerator = (1 - beta[i]) * (exp(-(lambda - lambda_i[i]) * h^q))^j
denominator = 1 - beta[i] * exp(-(lambda - lambda_i[i]) * h^q)
gamma1 = gamma((q + 1) / q, lambda_i[i] * (j - 1) * h^q)
gamma2 = gamma((q + 1) / q, lambda_i[i] * j * h^q)
sum_j += numerator / denominator * (gamma1 - gamma2) / (lambda_i[i]^(1 / k))
end
term3 += sum_j / PI
end
term4 = sum(Z2[i] * calculate_P_I_i(h, q, r, k, L, lambda, i) / PI for i in 1:7)
ET = term1 + term2 - term3 + term4
return ET
end
# تابع برای محاسبه E(A)
function calculate_EA(r, k, L, h)
alpha = calculate_alpha(r, k, L)
EC = calculate_EC(r, k, L, h, alpha)
ET = calculate_ET(r, k, L, h, alpha)
EA = EC / ET
return EA
end
# تابع برای محاسبه E(A) با مقادیر دستی
function calculate_EA_manual(h, L, r, k)
if calculate_PI(h, r, q, k, L) >= p0
EA = calculate_EA(r, k, L, h)
alpha = calculate_alpha(r, k, L)
beta_values = [calculate_beta_i(r, k, L, i) for i in 1:7] # تغییر نام به beta_values
return EA, alpha, beta_values
else
return NaN, NaN, NaN
end
end
# مثال استفاده از تابع calculate_EA_manual
h_manual = 0.1
L_manual = 1
r_manual = 2
k_manual = 2
#EA, alpha, beta_values = calculate_EA_manual(h_manual, L_manual, r_manual, k_manual)
#println("E(A) با مقادیر دستی: ", EA)
#println("alpha با مقادیر دستی: ", alpha)
#println("beta_i با مقادیر دستی: ", beta_values)
# تابع برای پیدا کردن مقادیر بهینه و چاپ آنها
function find_optimal_EA()
best_EA = Inf # مقدار اولیه برای مینیمم (بینهایت)
optimal_params = nothing # برای ذخیره مقادیر بهینه
optimal_alpha = nothing # ذخیره مقدار بهینه آلفا
optimal_beta = nothing # ذخیره مقادیر بهینه بتا
# محدوده مقادیر برای h, L, r, k
h_values = 0.1:0.1:2.0 # مقادیر h
L_values = 1.0:2.0 # مقادیر L
r_values = 2:5 # مقادیر r
k_values = 1:6 # مقادیر k
for h in h_values
for L in L_values
for r in r_values
for k in k_values
# محاسبه E(A) با مقادیر فعلی
EA, alpha, beta_values = calculate_EA_manual(h, L, r, k)
# بررسی اگر مقدار جدید کمتر از بهترین مقدار باشد
if !isnan(EA) && EA < best_EA
best_EA = EA
optimal_params = (h=h, L=L, r=r, k=k) # ذخیره مقادیر بهینه
optimal_alpha = alpha # ذخیره آلفای بهینه
optimal_beta = beta_values # ذخیره مقادیر بتای بهینه
end
end
end
end
end
# چاپ مقادیر بهینه و مینیمم E(A)
println("Minimum E(A): ", best_EA)
println("Optimal Parameters: h=", optimal_params.h, ", L=", optimal_params.L,
", r=", optimal_params.r, ", k=", optimal_params.k)
println("Optimal Alpha (α): ", optimal_alpha)
println("Optimal Beta (β): ", optimal_beta)
end
# فراخوانی تابع برای پیدا کردن مقادیر بهینه
find_optimal_EA()
function debug_calculate_EA_to_file(h_values, L_values, r_values, k_values, output_file)
# باز کردن فایل برای نوشتن خروجی
open(output_file, "w") do io
println(io, "Starting debug for E(A)...")
for h in h_values
for L in L_values
for r in r_values
for k in k_values
# محاسبه E(A) با مقادیر فعلی
EA, alpha, beta_values = calculate_EA_manual(h, L, r, k)
# نوشتن اطلاعات در فایل
println(io, "\nChecking Parameters: h=", h, ", L=", L, ", r=", r, ", k=", k)
println(io, "Alpha: ", alpha)
println(io, "Beta Values: ", beta_values)
# بررسی E(A)، E(C) و E(T)
EC = calculate_EC(r, k, L, h, alpha)
ET = calculate_ET(r, k, L, h, alpha)
println(io, "E(C): ", EC, ", E(T): ", ET, ", E(A): ", EA)
# بررسی مقادیر نامعتبر
if isnan(EA) || isnan(EC) || isnan(ET)
println(io, "Warning: NaN detected in calculations.")
elseif EA < 0 || EC < 0 || ET < 0
println(io, "Warning: Negative values detected!")
println(io, "Details: h=", h, ", L=", L, ", r=", r, ", k=", k)
end
end
end
end
end
println(io, "Debugging complete!")
end
end
# تعریف محدوده مقادیر برای h, L, r, k
#h_values = 0.1:0.1:2.0 # مقادیر h
#L_values = 1.0:2.0 # مقادیر L
#r_values = 2:5 # مقادیر r
#k_values = 1:6 # مقادیر k
# نام فایل خروجی
#output_file = "debug_output.txt"
# فراخوانی تابع دیباگ و ذخیره در فایل
#debug_calculate_EA_to_file(h_values, L_values, r_values, k_values, output_file)
#println("Debugging complete. Output saved to file: ", output_file)
Editor is loading...
Leave a Comment