Untitled
import numpy as np # Khởi tạo các tham số x = np.random.rand(10) # X là vị trí ngẫu nhiên trong không gian v = np.random.rand(10) # v là vector vận tốc tương ứng với tọa độ c1 = 0.5 # Hệ số học tập 1 c2 = 0.5 # Hệ số học tập 2 G = float('inf') # Giá trị tốt nhất toàn cục ban đầu (vô cùng lớn) XG = 0 # Vị trí tốt nhất toàn cục ban đầu xB = np.copy(x) # Vị trí tốt nhất của từng hạt pB = np.full(10, float('inf')) # Giá trị tốt nhất của từng hạt ban đầu (vô cùng lớn) # Giới hạn vận tốc và vị trí v_max = 1.2 v_min = 0.01 x_min = 5 x_max = 13 # Số vòng lặp num_iterations = 2500 print("Nhập hàm mục tiêu sử dụng biến `x` (ví dụ: x*np.cos(x) - 0.5*x*np.cos(0.6*x**2)):") user_input = input("Hàm mục tiêu: ") # Chuyển chuỗi nhập vào thành hàm mục tiêu def test(x): try: return eval(user_input) # Đánh giá biểu thức nhập vào except Exception as e: raise ValueError("Hàm mục tiêu không hợp lệ! Vui lòng nhập lại.") from e # Thuật toán PSO for j in range(num_iterations): # Lặp qua từng thế hệ for i in range(10): # Lặp qua từng hạt # Sinh các số ngẫu nhiên r1 = np.random.rand() r2 = np.random.rand() # Cập nhật vận tốc v[i] += c1 * r1 * (XG - x[i]) + c2 * r2 * (xB[i] - x[i]) # Giới hạn vận tốc if v[i] > v_max: v[i] = v_max elif v[i] < v_min: v[i] = v_min # Cập nhật vị trí x[i] += v[i] # Giới hạn vị trí if x[i] > x_max: x[i] = x_max elif x[i] < x_min: x[i] = x_min # Tính giá trị hàm mục tiêu tại vị trí hiện tại p = test(x[i]) # Cập nhật vị trí và giá trị tốt nhất của từng hạt if p < pB[i]: pB[i] = p xB[i] = x[i] # Cập nhật vị trí và giá trị tốt nhất toàn cục min_pB = np.min(pB) if min_pB < G: G = min_pB XG = xB[np.argmin(pB)] # Kết quả print(f"Giá trị tốt nhất toàn cục: {G}") print(f"Vị trí tốt nhất toàn cục: {XG}")
Leave a Comment