Untitled

 avatar
unknown
julia
20 days ago
14 kB
7
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)

Leave a Comment