ادامهی تشریح بخش های یک کد بهینه سازی
بخش ۳ و ۴: تابع هدف و قیود – خطوط ۱۱۰ تا ۲۶۰
class FrameAnalyzer:
def evaluate_design(self, section_indices: List[int]) -> Dict:
🫀 این بخش، دستگاه سنجش کیفیت و خطقرمزهای مهندسی را پیادهسازی میکند. تابع evaluate_design قلب برنامه است و برای هر طرح (مجموعهای از پروفیلها) این مراحل را انجام میدهد:
مرحلهی ۱: محاسبهی وزن کل سازه
total_weight = 0.0
for idx in beam_indices:
section = SECTION_LIST[idx]
weight = section.A * length * 7850 # چگالی فولاد
total_weight += weight
وزن هر عضو از مساحت مقطع × طول × چگالی فولاد (۷۸۵۰ kg/m³) محاسبه میشود.
مرحلهی ۲: محاسبهی بارهای ثقلی (ASCE 7)، به عنوان مثال آورده شده است و باید مطابق با استاندارد یا مبحث ۶ ترکیبات بار مختلف کد نویسی شوند.
w_u = 1.2 * w_DL + 1.6 * w_LL
بارهای مرده و زنده با ضرایب LRFD ترکیب میشوند (ASCE 7 Section 2.3).
مرحلهی ۳: محاسبهی بار لرزهای (ASCE 7)، مشابه ویرایش پنجم استاندارد ۲۸۰۰ است و مقدار Cs در بخش جدایی از کد با توجه به ورودی های شتاب طیفی محاسبه میشود، پیشنهاد میکنم این بخش چون میتواند تغییر در ساختگاه داشته باشید به عنوان یک کد جدا نوشته شود و در کد بهینه سازی فراخوانی شود. ⚠️
seismic_load = self.calculate_seismic_load(total_weight) # V = Cs × W
نیروی برش پایه از رابطهی V = Cs × W محاسبه میشود (ASCE 7 Eq. 12.8-1).
مرحلهی ۴: بررسی قیود (AISC 360)
بررسی تیرها (AISC 360 Chapter F و G) و یا فرمول های مبحث ۱۰، این بخش با توجه به سیستم سازه ای شما باید نوشته شود و دقیقا روابط آیین نامه با توجه به شکل پذیری سازه کد نویسی شوند:
# ظرفیت خمشی: Mn = Fy × Zx
phi_Mn = inputs.phi_b * inputs.Fy * section.Zx
bending_ratio = Mu / phi_Mn # باید ≤ 1.0
# ظرفیت برشی: Vn = 0.6 × Fy × Aw
phi_Vn = inputs.phi_v * 0.6 * inputs.Fy * section.d * section.tw
shear_ratio = Vu / phi_Vn # باید ≤ 1.0
بررسی ستونها (AISC 360 Chapter E) یا مبحث ۱۰ مطابق توضیحاتی که برای تیر داده شده است :
# تنش کمانش بحرانی (Euler buckling)
lambda_c = (KL / section.ry) * sqrt(Fy / (π² × E))
if lambda_c <= 4.71 * sqrt(E/Fy):
Fcr = (0.658^(Fy/Fe)) × Fy # کمانش غیرالاستیک
else:
Fcr = 0.877 × Fe # کمانش الاستیک
Pn = Fcr × A
compression_ratio = axial_load / (phi_c × Pn) # باید ≤ 1.0
این روابط مستقیماً از AISC 360 Eq. E3-2 و E3-3 گرفته شدهاند.
توجه بفرمایید که این بخش همانطور که در بالا اشاره شد فقط به عنوان مثال آورده شده است.
⭕⚠️
مرحلهی ۵: تابع جریمه (Penalty Function)، مهم ترین قسمت این بخش است و با توجه به الگوریتم انتخاب شده و روش های دیگری که در مقالات آمده است میتواند تغییر کند.
if not constraints_ok:
excess = sum(max(0, r - 1.0) for r in all_ratios)
penalty = 1000 * excess
objective_value = total_weight + penalty
اگر هر یک از نسبتهای تنش (در این مثال) از ۱.۰ بیشتر شود (یا سایر معیار های آییننامهها (یعنی قیدها) نقض شده باشند)، یک جریمهی سنگین به وزن (در این مثال که هدف وزن کمینه بود یا سایر اهداف بهینه سازی با توجه به اهداف انتخاب شده) اضافه میشود. این کار باعث میشود الگوریتم، طرحهای غیرمجاز (مغایر الزامات آییننامهها) را بهعنوان طرحهای بد تشخیص دهد و از آنها گذر کند.
همچنین میتوانید به این بخش با توجه به الگوریتم خود یک کد اضافه کنید که فضای پارتو را نیز مرتب (سورت) کند.
پست های قبلی ⬇️
#structural_optimization
کانال تلگرامی
https://t.me/EarthQuakeSoftware
کانال بله
https://ble.ir/EarthQuakeSoftware
.

