基于Python与Networkx:忽略CSV中X模式随机高亮指定和范围的节点
问题解决方案
一、避开已有X模式的随机高亮逻辑实现
核心思路
- 批量读取4个CSV文件,将每个文件内的X标记位置转换为坐标集合(例如
{(0,1), (2,3)}),把所有禁用模式存入列表forbidden_patterns。 - 循环生成随机高亮组合,直到满足所有条件:
- 随机选择1-4个高亮节点数量
- 随机挑选对应数量的节点,计算标签总和
- 验证总和处于40-80区间,同时确认该节点组合的坐标集合不在禁用模式列表内
代码实现(Python)
import pandas as pd import random # 读取所有CSV,提取禁用模式 def load_forbidden_patterns(csv_paths): forbidden = [] for path in csv_paths: df = pd.read_csv(path, header=None) pattern = set() # 遍历5×5矩阵,记录X的坐标 for i in range(5): for j in range(5): if df.iloc[i, j] == 'X': pattern.add((i, j)) forbidden.append(pattern) return forbidden # 生成符合要求的随机高亮组合 def generate_valid_highlight(node_labels, forbidden_patterns): while True: # 随机确定高亮节点数量(1-4) highlight_count = random.randint(1, 4) # 生成所有节点的坐标列表 all_nodes = [(i, j) for i in range(5) for j in range(5)] # 随机挑选节点 selected_nodes = random.sample(all_nodes, highlight_count) # 计算标签总和 total = sum(node_labels[i][j] for i, j in selected_nodes) # 验证条件 if 40 <= total <= 80: selected_set = set(selected_nodes) if selected_set not in forbidden_patterns: return selected_nodes # 示例调用 csv_files = ['pattern1.csv', 'pattern2.csv', 'pattern3.csv', 'pattern4.csv'] forbidden_patterns = load_forbidden_patterns(csv_files) # 替换为你实际的5×5节点标签矩阵 node_labels = [ [10,12,8,15,9], [11,7,14,10,13], [9,16,8,12,11], [13,10,15,7,14], [12,9,11,16,8] ] valid_highlight = generate_valid_highlight(node_labels, forbidden_patterns) print("符合要求的高亮节点坐标:", valid_highlight)
二、多CSV模式合并为单CSV的实现
完全可以将多个CSV的X模式合并到单个CSV中,方便后续统一读取。合并后的CSV每行存储一个禁用模式的坐标信息,用分号分隔不同坐标。
合并代码实现
import pandas as pd def merge_patterns_to_single_csv(input_csvs, output_path): merged_data = [] for path in input_csvs: df = pd.read_csv(path, header=None) coords = [] # 提取当前CSV的X坐标,转为"行,列"格式 for i in range(5): for j in range(5): if df.iloc[i, j] == 'X': coords.append(f"{i},{j}") # 用分号拼接当前模式的所有坐标,存入合并列表 merged_data.append(';'.join(coords)) # 写入合并后的CSV pd.DataFrame(merged_data, columns=['forbidden_pattern']).to_csv(output_path, index=False) # 示例调用 input_csvs = ['pattern1.csv', 'pattern2.csv', 'pattern3.csv', 'pattern4.csv'] merge_patterns_to_single_csv(input_csvs, 'all_forbidden_patterns.csv')
合并后CSV的读取方式
后续读取合并后的单CSV时,只需将每行的坐标字符串转回集合即可:
def load_merged_forbidden_patterns(merged_csv_path): forbidden = [] df = pd.read_csv(merged_csv_path) for row in df['forbidden_pattern']: coords = row.split(';') pattern = set() for coord in coords: i, j = map(int, coord.split(',')) pattern.add((i, j)) forbidden.append(pattern) return forbidden
内容的提问来源于stack exchange,提问作者user136819
相关产品推荐
相关产品推荐

