0

0

如何用整数线性规划高效求解 4×4 零和幻方重排问题

花韻仙語

花韻仙語

发布时间:2026-02-14 11:57:02

|

746人浏览过

|

来源于php中文网

原创

如何用整数线性规划高效求解 4×4 零和幻方重排问题

本文介绍一种远优于暴力枚举的专业方法——基于 SciPy milp 的二元整数线性规划(BILP)建模,可在秒级内判定给定 16 个数能否重排为行、列及两条主对角线之和均为 0 的 4×4 矩阵,并输出可行解(若存在)。

本文介绍一种远优于暴力枚举的专业方法——基于 scipy `milp` 的二元整数线性规划(bilp)建模,可在秒级内判定给定 16 个数能否重排为行、列及两条主对角线之和均为 0 的 4×4 矩阵,并输出可行解(若存在)。

在组合约束求解问题中,面对 16! ≈ 2.1×10¹³ 种全排列的暴力搜索空间,传统穷举法完全不可行。原始代码尝试用 itertools.permutations 截断采样,本质上仍属随机试探,既无法保证解的存在性证明,也无法在合理时间内收敛。真正可扩展、可验证的解法需转向数学规划建模:将“重排”转化为“分配决策”,用二元变量刻画每个数字是否被放置于特定位置,并将所有约束(唯一性、行列和、对角线和)统一表达为线性等式。

核心思想是引入三维二元决策变量 $ x_{k,i,j} \in {0,1} $,其中:

  • $ k = 0,\dots,15 $ 表示第 $k$ 个给定数字(共 16 个);
  • $ i,j = 0,\dots,3 $ 表示目标网格的行与列索引。

$ x_{k,i,j} = 1 $ 当且仅当第 $k$ 个数被填入位置 $(i,j)$。由此可构建以下五类线性约束:

每个数字恰好使用一次
$$ \sum{i=0}^{3}\sum{j=0}^{3} x_{k,i,j} = 1 \quad \forall\,k $$

每个格子恰好填一个数字
$$ \sum{k=0}^{15} x{k,i,j} = 1 \quad \forall\,i,j $$

每行和为 0
$$ \sum{k=0}^{15} \sum{j=0}^{3} (\text{nums}[k] \cdot x_{k,i,j}) = 0 \quad \forall\,i $$

每列和为 0
$$ \sum{k=0}^{15} \sum{i=0}^{3} (\text{nums}[k] \cdot x_{k,i,j}) = 0 \quad \forall\,j $$

两条主对角线和为 0
$$ \sum{k=0}^{15} \sum{i=0}^{3} (\text{nums}[k] \cdot x{k,i,i}) = 0, \quad \sum{k=0}^{15} \sum{i=0}^{3} (\text{nums}[k] \cdot x{k,i,3-i}) = 0 $$

这些约束共同构成一个混合整数线性规划(MILP)问题。由于目标函数仅用于可行性判定(无优化目标),我们设 $c = \mathbf{0}$,调用 scipy.optimize.milp 求解即可。

你好星识
你好星识

你的全能AI工作空间

下载

以下是完整可运行实现(已适配原题数据):

import numpy as np
from scipy.optimize import milp

# 原始输入(注意:原始数据经验证无解;此处按答案提示修正第二行首元素为 2)
numbers = np.array([5, -5, 3, -2,  # row 0
                    2, -1, 9, -10,  # row 1 ← modified from 1 to 2
                    -7, -4, 7, 4,   # row 2
                    -3, -8, 2, 8]) # row 3

n = 4
N = n * n  # 16

# 构造三维广播模板:(16, 4, 4),每个 slice 是该数字在全部位置的副本
nums_3d = numbers.reshape(N, 1, 1)
nums_3d = np.tile(nums_3d, (1, n, n))

# 初始化约束矩阵 A 和右端向量 b
A_list, b_list = [], []

# 约束 1:每个数字用且仅用一次 → 16 条等式
for k in range(N):
    A_k = np.zeros((N, n, n))
    A_k[k] = 1
    A_list.append(A_k.flatten())
    b_list.append(1)

# 约束 2:每个格子填且仅填一个数字 → 16 条等式
for i in range(n):
    for j in range(n):
        A_ij = np.zeros((N, n, n))
        A_ij[:, i, j] = 1
        A_list.append(A_ij.flatten())
        b_list.append(1)

# 约束 3:每行和为 0 → 4 条等式
for i in range(n):
    A_row = np.zeros((N, n, n))
    A_row[:, i, :] = nums_3d[:, i, :]
    A_list.append(A_row.flatten())
    b_list.append(0)

# 约束 4:每列和为 0 → 4 条等式
for j in range(n):
    A_col = np.zeros((N, n, n))
    A_col[:, :, j] = nums_3d[:, :, j]
    A_list.append(A_col.flatten())
    b_list.append(0)

# 约束 5:主对角线 & 反对角线和为 0 → 2 条等式
A_diag = np.zeros((N, n, n))
A_diag[:, range(n), range(n)] = nums_3d[:, range(n), range(n)]
A_list.append(A_diag.flatten())
b_list.append(0)

A_anti = np.zeros((N, n, n))
A_anti[:, range(n), range(n-1, -1, -1)] = nums_3d[:, range(n), range(n-1, -1, -1)]
A_list.append(A_anti.flatten())
b_list.append(0)

# 拼接为标准 MILP 形式:A @ x == b
A_eq = np.vstack(A_list)
b_eq = np.array(b_list)

# 求解:变量 x ∈ [0,1] 且为整数
res = milp(
    c=np.zeros(A_eq.shape[1]),           # 无目标,仅求可行解
    constraints=(A_eq, b_eq, b_eq),     # (A, lb, ub) → 等式约束
    bounds=(0, 1),                        # 二元变量
    integrality=1                         # 强制整数解
)

if res.success:
    x_sol = np.round(res.x).astype(int)  # 解码二元解
    # 重构 4x4 网格:对每个 (i,j),找出满足 x[k,i,j]==1 的 k,取 numbers[k]
    grid_sol = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            k = np.argmax(x_sol.reshape(N, n, n)[:, i, j])
            grid_sol[i, j] = numbers[k]

    print("✅ 找到可行解:")
    print(grid_sol)
    # 验证
    assert np.allclose(grid_sol.sum(axis=0), 0), "列和不为 0"
    assert np.allclose(grid_sol.sum(axis=1), 0), "行和不为 0"
    assert np.allclose(np.diag(grid_sol).sum(), 0), "主对角线和不为 0"
    assert np.allclose(np.diag(np.fliplr(grid_sol)).sum(), 0), "反对角线和不为 0"
    print("✔ 所有约束验证通过。")
else:
    print("❌ 无可行解(原始数据不可行,或修正后仍无解)")

? 关键注意事项

  • 原始数据不可行:对题目所给 [5,-5,3,-2,1,-1,9,-10,-7,-4,7,4,-3,-8,2,8],该模型会明确返回 success=False,即数学上不存在满足全部约束的重排——这是暴力法永远无法给出的确定性结论。
  • 数值稳定性:milp 对浮点精度敏感,建议使用 np.round(res.x) 解码,并用 np.allclose(..., atol=1e-8) 验证。
  • 扩展性:本框架天然支持任意 $n\times n$ 网格(只需调整 n 和约束循环),且时间复杂度不随 $n!$ 增长,而是取决于 MILP 求解器性能(对 $n=4$ 通常
  • 替代方案:若需更高性能或更大规模,可迁移至 ortools(Google)、PuLP + CBC 或商业求解器(Gurobi/CPLEX)。

综上,面对高维组合约束问题,放弃暴力、拥抱建模,是工程实践中兼顾效率、正确性与可解释性的必由之路。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

23

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

11

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

7

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

8

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

3

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

26

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

9

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

181

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

14

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号