From 161b7a0eea76ab096a49189f38df19c537016e25 Mon Sep 17 00:00:00 2001 From: fly6516 Date: Sun, 30 Mar 2025 02:52:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=81=9A=E7=B1=BB?= =?UTF-8?q?=E7=AE=97=E6=B3=95=E5=92=8C=20Q=20=E5=AD=A6=E4=B9=A0=E7=AE=97?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 clustering_algorithms.py 文件,实现 K 均值和 K 中心点聚类算法 - 新增 route.py 文件,实现基于 Q学习的路径规划算法 - 添加分析聚类结果和可视化功能 - 实现并行 Q学习训练,提高训练效率 --- clustering_algorithms.py | 77 +++++++++++++++++++++++++++++++ myplot-1.png | Bin 0 -> 31902 bytes myplot-2.png | Bin 0 -> 32073 bytes route.py | 97 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 clustering_algorithms.py create mode 100644 myplot-1.png create mode 100644 myplot-2.png create mode 100644 route.py diff --git a/clustering_algorithms.py b/clustering_algorithms.py new file mode 100644 index 0000000..179c75b --- /dev/null +++ b/clustering_algorithms.py @@ -0,0 +1,77 @@ +# 导入必要的库 +import numpy as np +from sklearn.datasets import load_iris +from sklearn.cluster import KMeans +from sklearn_extra.cluster import KMedoids +from sklearn.metrics import silhouette_score +import matplotlib.pyplot as plt +import matplotlib +import os +import psutil + +# 设置环境变量以消除Joblib警告 +os.environ['LOKY_MAX_CPU_COUNT'] = str(psutil.cpu_count(logical=False)) + +# 设置Matplotlib支持中文的字体 +matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 +matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 + +# 加载Iris数据集 +iris = load_iris() +X = iris.data # 特征数据 +y = iris.target # 目标标签 + +# K均值聚类算法 +def kmeans_clustering(X, n_clusters=3): + """ + 使用K均值算法对数据进行聚类 + :param X: 输入数据 + :param n_clusters: 聚类数量 + :return: 聚类标签 + """ + kmeans = KMeans(n_clusters=n_clusters, random_state=42) # 初始化KMeans对象 + kmeans.fit(X) # 拟合数据 + labels = kmeans.labels_ # 获取聚类标签 + return labels + +# K中心点聚类算法 +def kmedoids_clustering(X, n_clusters=3): + """ + 使用K中心点算法对数据进行聚类 + :param X: 输入数据 + :param n_clusters: 聚类数量 + :return: 聚类标签 + """ + kmedoids = KMedoids(n_clusters=n_clusters, random_state=42) # 初始化KMedoids对象 + kmedoids.fit(X) # 拟合数据 + labels = kmedoids.labels_ # 获取聚类标签 + return labels + +# 分析聚类结果 +def analyze_clustering(X, labels, algorithm_name): + """ + 分析聚类结果并可视化 + :param X: 输入数据 + :param labels: 聚类标签 + :param algorithm_name: 算法名称 + """ + silhouette_avg = silhouette_score(X, labels) # 计算轮廓系数 + print(f"{algorithm_name} 轮廓系数: {silhouette_avg}") + + # 可视化聚类结果 + plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') + plt.title(f"{algorithm_name} 聚类结果") + plt.show() + +# 主函数 +def main(): + # 使用K均值算法进行聚类 + kmeans_labels = kmeans_clustering(X) + analyze_clustering(X, kmeans_labels, "K均值") + + # 使用K中心点算法进行聚类 + kmedoids_labels = kmedoids_clustering(X) + analyze_clustering(X, kmedoids_labels, "K中心点") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/myplot-1.png b/myplot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..407f58714fd8edd1af674b0a92858e6307f6efcd GIT binary patch literal 31902 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 TzH=v%2YUZj_D!jne&GKCMC}!u literal 0 HcmV?d00001 diff --git a/myplot-2.png b/myplot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ace5a47d9a7a45454cfbd94129b220fdb208022 GIT binary patch literal 32073 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 b>AA+}N9av0EOY1sy8+2dD?cxlG7SE2dBy>$ literal 0 HcmV?d00001 diff --git a/route.py b/route.py new file mode 100644 index 0000000..6055782 --- /dev/null +++ b/route.py @@ -0,0 +1,97 @@ +import numpy as np # Import NumPy for numerical operations +import random # Import random module for exploration +import multiprocessing as mp # Import multiprocessing for parallel computing +#import cupy as cp + + +try: + import cupy as cp # Import CuPy for GPU acceleration + + GPU_AVAILABLE = True # Set flag if CuPy is available +except ImportError: + GPU_AVAILABLE = False # Set flag if CuPy is not available + +# Define the environment +grid_size = (4, 4) # Grid size (4x4) +start = (0, 0) # Start position +end = (3, 3) # End position +obstacles = {(1, 0), (2, 1), (1, 2), (0, 3), (3, 2)} # Set of obstacles + +# Define possible actions and their effects on position +actions = {'up': (-1, 0), 'down': (1, 0), 'left': (0, -1), 'right': (0, 1)} + + +def is_valid(state): + """Check if a state is within the grid and not an obstacle.""" + return (0 <= state[0] < grid_size[0]) and (0 <= state[1] < grid_size[1]) and (state not in obstacles) + + +def get_next_state(state, action): + """Get the next state based on the current state and action.""" + new_state = (state[0] + actions[action][0], state[1] + actions[action][1]) + return new_state if is_valid(new_state) else state + + +# Q-Learning parameters +alpha = 0.5 # Learning rate +gamma = 0.9 # Discount factor +epsilon = 0.1 # Increased exploration rate for better exploration +episodes = 5000 # Increased total training episodes for better learning +np.random.seed(42) # Set random seed for reproducibility +random.seed(42) + +# Initialize the Q-table with all states and actions +grid_states = [(i, j) for i in range(grid_size[0]) for j in range(grid_size[1]) if (i, j) not in obstacles] +Q = {state: {action: 0 for action in actions} for state in grid_states} + +# GPU acceleration setup (if available) +if GPU_AVAILABLE: + Q = {state: {action: 0.0 for action in actions} for state in grid_states} # Initialize Q-table on GPU + actions_list = list(actions.keys()) # Store actions as a list + +def train_q_learning(_): + """Function to train Q-learning in parallel using multiple processes.""" + local_Q = {state: Q[state].copy() for state in grid_states} # Create a local copy of Q-table + for _ in range(episodes // mp.cpu_count()): # Each process handles a fraction of episodes + state = start # Start at the initial position + while state != end: # Run until reaching the goal + # Choose an action using ε-greedy policy + action = max(local_Q[state], key=local_Q[state].get) if random.uniform(0, 1) > epsilon else random.choice( + list(actions)) + next_state = get_next_state(state, action) # Get the next state + reward = 1 if next_state == end else -0.1 # Define rewards + # Update Q-value using the Bellman equation + local_Q[state][action] += alpha * ( + reward + gamma * max(local_Q[next_state].values()) - local_Q[state][action]) + state = next_state # Move to next state + return local_Q # Return the updated local Q-table + +# Parallel Q-learning training +if __name__ == "__main__": + num_processes = max(1, mp.cpu_count() // 2) # Use half the available CPU cores + with mp.Pool(num_processes) as pool: # Create a process pool with reduced number of CPU cores + results = pool.map(train_q_learning, range(num_processes)) # Distribute training across multiple processes + + # Merge Q-tables from all processes + for state in grid_states: + for action in actions: + Q[state][action] = sum(r[state][action] for r in results) / len(results) # Average Q-values + + +# Compute the optimal path from start to end +def get_best_path(): + """Find the best path using the learned Q-values.""" + state = start # Start at the initial position + path = [state] # Initialize path + visited = set() # Track visited states to avoid loops + while state != end: + if state in visited: + break # Avoid infinite loops + visited.add(state) # Mark state as visited + action = max(Q[state], key=Q[state].get) # Choose the best action based on Q-values + state = get_next_state(state, action) # Move to the next state + path.append(state) # Append to path + return path # Return the computed path + + +print(get_best_path()) # Print the optimal path \ No newline at end of file