递归:如何避免Python设置在迭代过程中更改设置 RuntimeError

2024-01-12

背景及问题描述:

我有一些代码可以解决图着色问题(广义上定义为将“颜色”分配给无向图的问题,确保由边连接的两个顶点没有相同的颜色)。我正在尝试使用约束传播来实现一个解决方案,以提高标准递归回溯算法的效率,但遇到以下错误:

  File "C:\Users\danisg\Desktop\coloring\Solver.py", 
  line 99, in solve
  for color in self.domains[var]:
  RuntimeError: Set changed size during iteration

在这里,对于每个顶点,我保留一个set该特定顶点的可能特定值:

  self.domains = { var: set(self.colors) for var in self.vars }

进行分配后,我将此约束传播到相邻域,以限制搜索空间:

  for key in node.neighbors:          # list of keys corresponding to adjacent vertices
      if color in self.domains[key]:  # remove now to prune possible choices
          self.domains[key].remove(color)

这不是抛出实际错误的地方(在我的代码中,我指出问题出在try-except块),但这可能是问题的根源。

我的问题:

如果不是正确的实施,我在这里有正确的想法吗?更重要的是,我该如何解决这个问题?另外,是否需要单独保存domains字典?或者我们可以做domain图中每个节点的属性?

My Code:

这是solve调用此代码的函数:

def solve(self):

    uncolored = [var for var in self.vars if self.map[var].color == None]
    if len(uncolored) == 0:
        return True

    var  = min(uncolored, key = lambda x: len(self.domains[var]))
    node = self.map[var]
    old  = { var: set(self.domains[var]) for var in self.vars }

    for color in self.domains[var]:

        if not self._valid(var, color):
            continue


        self.map[var].color = color
        for key in node.neighbors:

            if color in self.domains[key]:
                self.domains[key].remove(color)

        try:
            if self.solve():
                return True
        except:
            print('happening now')


        self.map[var].color = None
        self.domains = old


    return False

我的实现使用Node object:

class Solver:

    class Node:

        def __init__(self, var, neighbors, color = None, domain = set()):

            self.var       = var
            self.neighbors = neighbors
            self.color     = color
            self.domain    = domain

        def __str__(self):
            return str((self.var, self.color))



    def __init__(self, graph, K):

        self.vars    = sorted( graph.keys(), key = lambda x: len(graph[x]), reverse = True )  # sort by number of links; start with most constrained
        self.colors  = range(K)
        self.map     = { var: self.Node(var, graph[var]) for var in self.vars }
        self.domains = { var: set(self.colors)           for var in self.vars }

以下是另外两个常用/有用的函数:

def validate(self):

    for var in self.vars:
        node = self.map[var]

        for key in node.neighbors:
            if node.color == self.map[key].color:
                return False

    return True

def _valid(self, var, color):

    node = self.map[var]

    for key in node.neighbors:

        if self.map[key].color == None:
            continue

        if self.map[key].color == color:
            return False

    return True

代码失败的数据和示例:

我正在使用的示例图可以找到here https://drive.google.com/file/d/0B1PjzDTxaswROWQwQ3ctSFhoUHc/edit?usp=sharing.

读取数据的函数:

def read_and_make_graph(input_data):

    lines = input_data.split('\n')

    first_line = lines[0].split()
    node_count = int(first_line[0])
    edge_count = int(first_line[1])

    graph = {}
    for i in range(1, edge_count + 1):
        line  = lines[i]
        parts = line.split()
        node, edge = int(parts[0]), int(parts[1])

        if node in graph:
            graph[node].add(edge)

        if edge in graph:
            graph[edge].add(node)

        if node not in graph:
            graph[node] = {edge}

        if edge not in graph:
            graph[edge] = {node}

    return graph

应该这样调用:

file_location = 'C:\\Users\\danisg\\Desktop\\coloring\\data\\gc_50_3'
input_data_file = open(file_location, 'r')
input_data = ''.join(input_data_file.readlines())
input_data_file.close()

graph  = read_and_make_graph(input_data)
solver = Solver(graph, 6)  # a 6 coloring IS possible

print(solver.solve())      # True if we solved; False if we didn't

我认为问题就在这里:

for color in self.domains[var]:

    if not self._valid(var, color):
        continue

    self.map[var].color = color
    for key in node.neighbors:

        if color in self.domains[key]:
            self.domains[key].remove(color)  # This is potentially bad.

if key == var when self.domains[key].remove(color)被调用时,您可以更改当前正在迭代的集合的大小。您可以通过使用来避免这种情况

for color in self.domains[var].copy():

使用 copy() 将允许您迭代集合的副本,同时从原始集合中删除项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归:如何避免Python设置在迭代过程中更改设置 RuntimeError 的相关文章

随机推荐

  • Google Chrome:垂直滚动条在某些网页上消失,可能是由于奇怪的工具栏

    我的一位客户在查看我们网站上的某些页面时遇到问题 具体来说 它是垂直滚动条 在某些页面上消失 她使用的是 Google Chrome 正如下面的截图所示 Chrome 还有一个奇怪的工具栏 在第一张图片上 滚动没有问题 http i45 t
  • 仅显示上周创建的帖子

    我希望能够显示帖子并按几个标准对它们进行排序 首先是它们的投票数量 其次是它们的创建日期 我不希望显示一周以上的帖子 因此只显示上周的帖子 我尝试这样做 但它给了我一个 NilClass 与 2 比较失败的错误 我知道代码的工作原理只是按投
  • Gtk.CssProvider() 基于 ID 的选择器在 Gtk3 中如何工作?

    我已经断断续续地摆弄这个问题好几天了 但似乎无法解决可能出现的问题 本质上 我正在尝试使用 CSS 样式声明在 Gtk3 中设置一些 Gtk Widget 的样式 没有什么复杂的 只是尝试通过其 id 名称来定位特定元素 Gtk CssPr
  • 确定运行时 JVM 可执行文件的位置

    如何在运行时获取当前运行的 JVM 的可执行文件的位置 我想使用 ProcessBuilder 类将另一个 JVM 实例化为子进程 我知道有java home系统属性 但这并不指定 JVM 可执行文件的位置 我知道我可以做这样的事情来获取路
  • 如何让异步流返回两个数据源

    我有以下函数 它返回标准输出数据 作为异步流 该数据是由运行System Diagnostics Process 当前该方法中的所有内容都按预期工作 我可以用await foreach 循环 我得到由外部 exe 生成的每一行输出 priv
  • 不同组件中的垫菜单和按钮

    I have
  • 在 PL/SQL 中使用带有“LIKE %”的变量(例如“variable%”)?

    问题类似于使用LIKE in SQL PLUS 其中 select 语句包含LIKE条款如下 select from sometable where somecolumn LIKE something 如何在游标中使用相同的内容 我尝试使用
  • scipy.io.wavfile.read 返回的数据是什么意思?

    的文档scipy io wavfile read说它返回采样率和数据 但在这种情况下 数据实际上意味着什么 wav files 谁能用通俗的语言告诉我这些数据是如何准备的 附言 我在某处读到这意味着振幅 我读到的内容正确吗 如果是 那么该幅
  • Android Studio - 1.5.11 之前的 IBus 可能会导致输入问题。有关详细信息,请参阅 IDEA-78860 [重复]

    这个问题在这里已经有答案了 Android Studio 1 5 Build AI 141 2422023 built on November 12 2015 我刚刚更新了我的Android Studio on Ubuntu 15 10当它
  • MVC5 - 数据注释 - 客户端验证没有发生?

    我有一个 MVC 5 应用程序 我使用数据注释来进行大部分验证 我的班级中的属性之一如下所示 Required ErrorMessage Please enter a business name StringLength 80 public
  • 如何从选项卡排序列表中排除小部件?

    此图来自Qt官网 我以此为例 我想避免一些不重要的小部件以选项卡为中心 如果您有一个小部件想要在一些常用的之间快速旋转 则此策略非常有用QLineEdit输入数据并转义那些很少使用的设置 Take the picture as an exa
  • python 中具有无限初始条件的 ODE

    我有一个二阶微分方程 我想用 python 求解它 问题是对于其中一个变量我没有初始条件0但仅限于无穷大的值 谁能告诉我应该提供哪些参数scipy integrate odeint 能解决吗 Equation Theta 需要根据时间来找到
  • 在 Eclipse 中添加外部 jar

    我创建了一个连接 MySQL 的程序 我使用 eclipse 添加外部 jar 选项添加 Connector j 程序在eclipse中运行良好 但是当我使用 eclipse 创建可执行 jar 并运行它时 它总是给出 ClassNotFo
  • 打开文件失败是否必须使用die?

    大多数时候 我会做这样的事情 open FH gt file txt or die Cann t open file Does die必须使用吗 如果我希望我的脚本继续 并且如果无法打开文件则忽略错误 我应该做什么 你可能想做类似的事情 i
  • openSUSE 的构建必备

    我是 openSUSE 的新手 我需要获得系统的构建必要条件 但无法使用它sudo apt get install build essential或者甚至通过使用sudo apt get update然后按照前面的代码进行操作 我找到了一种
  • 无法使用 SSH 访问 AWS CodeCommit

    弄清楚如何让 AWS CodeCommit 与标准 SSH 身份验证配合使用非常困难 看到另一个类似的主题 但没有答案 我还不能发表评论 这是在 Windows 上使用 Git Bash 重现步骤 创建具有完全权限的 IAM 用户 AwsA
  • 如何从 dropzone.js 上传和删除文件

    我使用了下面的代码 图像已被删除 但缩略图仍然显示 Dropzone options myDropzone init function this on success function file response file serverId
  • 在 R 中将日期转换为星期几

    我的数据框中有一个这种格式的日期 02 July 2015 我需要将其转换为星期几 即 183 就像是 df day of week lt weekdays as Date df date column 但这不理解日期的格式 你可以使用lu
  • 防止引导程序弹出窗口中的默认值

    我正在使用 twitter bootstrap 并且我已经得到了这段代码 addYT on click function event var this this event preventDefault popover placement
  • 递归:如何避免Python设置在迭代过程中更改设置 RuntimeError

    背景及问题描述 我有一些代码可以解决图着色问题 广义上定义为将 颜色 分配给无向图的问题 确保由边连接的两个顶点没有相同的颜色 我正在尝试使用约束传播来实现一个解决方案 以提高标准递归回溯算法的效率 但遇到以下错误 File C Users