You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python与Networkx:忽略CSV中X模式随机高亮指定和范围的节点

问题解决方案

一、避开已有X模式的随机高亮逻辑实现

核心思路

  1. 批量读取4个CSV文件,将每个文件内的X标记位置转换为坐标集合(例如{(0,1), (2,3)}),把所有禁用模式存入列表forbidden_patterns。
  2. 循环生成随机高亮组合,直到满足所有条件:
    • 随机选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:03:11