news 2026/4/15 18:28:10

NuCS:一个用于研究、教学和生产应用的约束求解器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NuCS:一个用于研究、教学和生产应用的约束求解器

原文:towardsdatascience.com/nucs-7b260afc2fe4?source=collection_archive---------11-----------------------#2024-11-22

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/495306191bc8964f9fe64b4124ca060f.png

照片来自 Eric Prouzet 在 Unsplash

纯 Python 的极速约束求解

https://medium.com/@yangeorget?source=post_page---byline--7b260afc2fe4--------------------------------https://towardsdatascience.com/?source=post_page---byline--7b260afc2fe4-------------------------------- Yan Georget

·发表于 Towards Data Science ·阅读时间 6 分钟·2024 年 11 月 22 日

TLDR

NuCS是一个Python 库,用于求解约束满足和优化问题(CSP 和 COP),是我作为副项目开发的。由于它完全用 Python 编写,NuCS 易于安装,并且可以用几行代码建模复杂问题。NuCS 求解器非常快速,因为它得益于NumpyNumba的支持。

许多问题都可以形式化为 CSP(约束满足问题)。这也是为什么像 NuCS 这样的约束库对开发者或数据科学家来说非常有帮助。

让我们考虑著名的 N 皇后问题,其要求在一个N x N的棋盘上放置N个皇后,使得它们互不威胁。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/12beb4d111f5e0a9295ba09c194decc5.png

8 皇后问题的解法。来源:Yue Guo

1420012 皇后问题的解法在不到2 秒的时间内,在一台运行以下程序的 MacBook Pro M2 上被找到:

(venv)➜ nucs git:(main)time NUMBA_CACHE_DIR=.numba/cache python-m nucs.examples.queens-n12--log_level=ERROR--processors=6{'ALG_BC_NB':262006,'ALG_BC_WITH_SHAVING_NB':0,'ALG_SHAVING_NB':0,'ALG_SHAVING_CHANGE_NB':0,'ALG_SHAVING_NO_CHANGE_NB':0,'PROPAGATOR_ENTAILMENT_NB':0,'PROPAGATOR_FILTER_NB':2269965,'PROPAGATOR_FILTER_NO_CHANGE_NB':990435,'PROPAGATOR_INCONSISTENCY_NB':116806,'SOLVER_BACKTRACK_NB':131000,'SOLVER_CHOICE_NB':131000,'SOLVER_CHOICE_DEPTH':10,'SOLVER_SOLUTION_NB':14200}NUMBA_CACHE_DIR=.numba/cache python-m nucs.examples.queens-n126.65s user0.53s system422%cpu1.699total

什么是约束编程?

约束编程是一种求解组合优化问题的范式。在约束编程中,用户通过声明约束条件来明确可行解的限制,这些约束指定了解决方案所需的属性。求解器结合约束传播和回溯算法来寻找解决方案。

作为示例,以下是使用 NuCS 的魔法序列问题模型(找到一个序列x_0, … x_n-1,使得对于每个i在*[0, n-1]中,x_ii*在序列中出现的次数):

classMagicSequenceProblem(Problem):def__init__(self,n:int):super().__init__([(0,n)]*n)foriinrange(n):self.add_propagator((list(range(n))+[i],ALG_COUNT_EQ,[i]))# redundant constraintsself.add_propagator((list(range(n)),ALG_AFFINE_EQ,[1]*n+[n]))self.add_propagator((list(range(n)),ALG_AFFINE_EQ,list(range(n))+[n]))

在 NuCS 中,约束被称为传播器。

传播器(这里是ALG_COUNT_EQ)简单地表明x_i是序列中i出现的次数。以下两个ALG_AFFINE_EQ传播器是冗余的,这意味着它们对于 NuCS 找到解并不是必需的,但它们加速了求解过程。

查看文档以获取 NuCS 支持的传播器完整列表。请注意,NuCS 中的大多数传播器是全局(即n元)并实现了最先进的传播算法。

Python

Python 是数据科学家首选的编程语言:它具有简单的语法,日益壮大的社区以及大量的数据科学和机器学习库。

但另一方面,Python 被认为是一种较慢的语言:根据基准测试,它的速度可能比 C 慢 50 到 100 倍。

选择 Python 来开发高性能的约束编程库并非显而易见,但我们将看到,Numpy(高性能计算包)和 Numba(Python 的即时编译)结合使用,极大地提升了性能。

已经有许多尝试在 Python 中编写约束求解器,但这些要么很慢,要么只是封装器,并依赖于用 Java 或 C/C++编写的外部求解器。

Numpy

NumPy将类似 C 和 Fortran 的语言的计算能力带到了 Python 中。

[## NumPy

强大的 N 维数组 NumPy 的向量化、索引和广播概念使其既快速又多功能…

numpy.org](https://numpy.org/?source=post_page-----7b260afc2fe4--------------------------------)

在 NuCS 中,一切都是 Numpy 数组。

这使得可以利用 Numpy 的索引和广播能力,并编写紧凑的传播器,例如Max_i x_i <= y

defcompute_domains_max_leq(domains:NDArray,parameters:NDArray)->int:x=domains[:-1]y=domains[-1]ifnp.max(x[:,MAX])<=y[MIN]:returnPROP_ENTAILMENT y[MIN]=max(y[MIN],np.max(x[:,MIN]))ify[MIN]>y[MAX]:returnPROP_INCONSISTENCYforiinrange(len(x)):x[i,MAX]=min(x[i,MAX],y[MAX])ifx[i,MAX]<x[i,MIN]:returnPROP_INCONSISTENCYreturnPROP_CONSISTENCY

Numba

Numba 是一个开源的**即时编译(Just-In-Time)**编译器,它将 Python 和 NumPy 代码的子集转换为快速的机器码。

[## Numba:高性能 Python 编译器

@njit(parallel=True) def simulator(out): # 并行迭代循环 for i in prange(out.shape[0]): out[i] = run_sim()…

numba.pydata.org](https://numba.pydata.org/?source=post_page-----7b260afc2fe4--------------------------------)

在以下示例中,我们找到了12 皇后问题的 14200 个解(请注意,我们在这里使用的是单处理器)。

NUMBA_DISABLE_JIT=1python-m nucs.examples.queens-n12--log_level=ERROR179.89s user0.31s system99%cpu3:00.57total

通过启用即时编译(Just-In-Time compilation),我们实现了x60的加速:

NUMBA_CACHE_DIR=.numba/cache python-m nucs.examples.queens-n123.03s user0.06s system99%cpu3.095total

为了让 Numba JIT 编译你的代码,你应该:

在 NuCS 中,这些指南已经成功地为以下问题实现:

得益于 Numpy 和 Numba,NuCS 在性能上与用 Java 或 C/C++编写的解算器相当。

请注意,由于 Python 代码是编译的且结果被缓存,当你第二次运行程序时,性能将显著提高。

示例

NuCS 提供了许多模型,用于经典的约束编程问题,如:

其中一些示例需要一些高级技术:

大多数这些模型也可以在CSPLib中找到,它是 CSP 相关问题的宝典。

统计与日志记录

在搜索解决方案时,NuCS 还会聚合一些统计数据:

{'ALG_BC_NB':262006,'ALG_BC_WITH_SHAVING_NB':0,'ALG_SHAVING_NB':0,'ALG_SHAVING_CHANGE_NB':0,'ALG_SHAVING_NO_CHANGE_NB':0,'PROPAGATOR_ENTAILMENT_NB':0,'PROPAGATOR_FILTER_NB':2269965,'PROPAGATOR_FILTER_NO_CHANGE_NB':990435,'PROPAGATOR_INCONSISTENCY_NB':116806,'SOLVER_BACKTRACK_NB':131000,'SOLVER_CHOICE_NB':131000,'SOLVER_CHOICE_DEPTH':10,'SOLVER_SOLUTION_NB':14200}

在这里我们可以看到:

通过与模型互动并理解它如何影响统计数据,已被证明是一种非常有用的练习,能够最大化利用 NuCS。

NuCS 还提供了一些基本的日志记录功能。

NUMBA_CACHE_DIR=.numba/cache python-m nucs.examples.golomb-n10--symmetry_breaking--log_level=INFO
2024-11-1217:27:45,110-INFO-nucs.solvers.solver-Problem has82propagators2024-11-1217:27:45,110-INFO-nucs.solvers.solver-Problem has45variables2024-11-1217:27:45,110-INFO-nucs.solvers.backtrack_solver-BacktrackSolver uses variable heuristic02024-11-1217:27:45,110-INFO-nucs.solvers.backtrack_solver-BacktrackSolver uses domain heuristic02024-11-1217:27:45,110-INFO-nucs.solvers.backtrack_solver-BacktrackSolver uses consistency algorithm22024-11-1217:27:45,110-INFO-nucs.solvers.backtrack_solver-Choice points stack has a maximal height of1282024-11-1217:27:45,172-INFO-nucs.solvers.backtrack_solver-Minimizing variable82024-11-1217:27:45,644-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:802024-11-1217:27:45,677-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:752024-11-1217:27:45,677-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:732024-11-1217:27:45,678-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:722024-11-1217:27:45,679-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:702024-11-1217:27:45,682-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:682024-11-1217:27:45,687-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:662024-11-1217:27:45,693-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:622024-11-1217:27:45,717-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:602024-11-1217:27:45,977-INFO-nucs.solvers.backtrack_solver-Found a(new)solution:55{'ALG_BC_NB':22652,'ALG_BC_WITH_SHAVING_NB':0,'ALG_SHAVING_NB':0,'ALG_SHAVING_CHANGE_NB':0,'ALG_SHAVING_NO_CHANGE_NB':0,'PROPAGATOR_ENTAILMENT_NB':107911,'PROPAGATOR_FILTER_NB':2813035,'PROPAGATOR_FILTER_NO_CHANGE_NB':1745836,'PROPAGATOR_INCONSISTENCY_NB':11289,'SOLVER_BACKTRACK_NB':11288,'SOLVER_CHOICE_NB':11353,'SOLVER_CHOICE_DEPTH':9,'SOLVER_SOLUTION_NB':10}[1610232634415355]

定制化

最后,NuCS 是一个非常开放的平台,几乎可以定制任何内容:

在以下Golomb 标尺示例中,在使用之前注册了一个自定义一致性算法:

consistency_alg_golomb=register_consistency_algorithm(golomb_consistency_algorithm)solver=BacktrackSolver(problem,consistency_alg_idx=consistency_alg_golomb)

结论

总结来说,NuCS 是一个功能丰富的约束解算器库。尽管它完全用 Python 编写,但性能非常快,可以应用于广泛的领域:研究、教学和生产。

如果你想参与 NuCS 的开发,欢迎随时在 Github 上联系我!

一些有用的链接,供进一步了解:

如果你喜欢这篇关于 NuCS 的文章,请拍手50 次!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 11:34:16

Visio绘制Nano-Banana系统架构图:技术文档可视化规范

Visio绘制Nano-Banana系统架构图&#xff1a;技术文档可视化规范 1. 引言&#xff1a;为什么架构图需要“画”出来&#xff1f; 你有没有遇到过这种情况&#xff1f;花了几天时间&#xff0c;终于把Nano-Banana这个AI模型的系统逻辑理清楚了&#xff0c;但当你试图向团队里的…

作者头像 李华
网站建设 2026/4/15 3:23:06

StructBERT情感分析模型在电商场景中的实战应用

StructBERT情感分析模型在电商场景中的实战应用 1. 为什么电商急需一款真正好用的情感分析工具&#xff1f; 你有没有遇到过这样的情况&#xff1a;运营同事每天要翻几百条商品评论&#xff0c;却只能靠“扫一眼”判断用户是满意还是生气&#xff1b;客服主管想快速了解某款新…

作者头像 李华
网站建设 2026/4/15 11:37:01

Janus-Pro-7B实测:比SDXL快5倍的文生图模型部署教程

Janus-Pro-7B实测&#xff1a;比SDXL快5倍的文生图模型部署教程 1. 为什么Janus-Pro-7B值得你花10分钟部署 你有没有试过等一张图生成等得去泡了杯咖啡、回了三封邮件&#xff0c;最后发现构图歪了、手长了、背景糊了&#xff1f; 这不是你的问题——是很多文生图模型的真实体…

作者头像 李华
网站建设 2026/4/9 18:41:05

人脸识别从零开始:Retinaface+CurricularFace镜像实战

人脸识别从零开始&#xff1a;RetinafaceCurricularFace镜像实战 你是不是也对人脸识别技术充满好奇&#xff1f;想自己动手搭建一个能“认人”的系统&#xff0c;却苦于复杂的模型部署和环境配置&#xff1f;今天&#xff0c;我们就来彻底解决这个问题。 我将带你使用一个开…

作者头像 李华