Untitled
unknown
python
a year ago
2.4 kB
21
Indexable
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}")
Editor is loading...
Leave a Comment