IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 整数规划-分支定界算法尝试(python) -> 正文阅读

[Python知识库]整数规划-分支定界算法尝试(python)


前言

目前csdn中很多分支定界算法有bug,有的代码会无限分支而不停止,因此本文在自己见过的分支定界算法的基础上加入定界的代码


一、分支定界

这是一种对数学建模中线性规划问题进行优化,求整数最优解的方法。
详见https://www.bilibili.com/video/BV12h411d7Dm?p=4
本算法用到的第三方库有:
scipy
math
sys

二、分支定界代码

代码如下:

import numpy
from scipy.optimize import linprog
import sys
import math

#判断是否为整数(当一个值与他的下取整或上取整相差小于1e-6时,为整数)
def judge(L, t=1e-6):
    for i in L:
        if (i-math.floor(i)) < t or (math.ceil(i)-i) < t:
            return False
    return True


def intergerpro(c, A, B, Aeq, Beq, t=1.0e-6):
    res = linprog(c, A, B, Aeq, Beq)
    if not res.success:#整数规划问题不可解时终止分支(定界)
        return [sys.maxsize]
    if judge(res.x):
        bestX = [10000]*len(c)#抄的视频上的代码,意义不明
    else:
        bestX = res.x
    bestVal = sum(x*y for x, y in zip(c, bestX))
    if all(((x-math.floor(x)) < t or (math.ceil(x)-x) < t) for x in bestX):
        return (bestVal, bestX)#整数解
    else:#加约束条件
        ind = [i for i, x in enumerate(bestX) if (x-math.floor(x) > t) and (math.ceil(x)-x) > t][0]
        newcol1 = [0] * len(A[0])
        newcol2 = [0] * len(A[0])
        newcol1[ind] = -1#新不等式约束的系数
        newcol2[ind] = 1#新不等式约束的系数
        newA1 = A.copy()
        newA2 = A.copy()
        newA1.append(newcol1)#追加新不等式约束系数
        newA2.append(newcol2)#追加新不等式约束系数
        newB1 = B.copy()
        newB2 = B.copy()
        newB1.append(-math.ceil(bestX[ind]))#新不等式约束的值
        newB2.append(math.floor(bestX[ind]))#新不等式约束的值
        r1 = intergerpro(c, newA1, newB1, Aeq, Beq)#分支
        r2 = intergerpro(c, newA2, newB2, Aeq, Beq)#分支
        if r1[0] < r2[0]:
            return r1
        else:
            return r2


c = [3, 4, 1]#问题方程
A = [[-1, -6, -2],[-2, 0, 0]]#不等式约束的系数
B = [-5, -3]#不等式约束右边的值
Aeq = [[0, 0, 0]]#等式约束(aeq与beq都为0,代表0*x1+0*x2+0*x3=0,因此这里不写这个参数也行)
Beq = [0]#等式约束值
print(intergerpro(c, A, B, Aeq, Beq))









总结

下面是最优整数解
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:42:21  更:2021-07-30 12:43:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/25 14:30:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计