鱼C论坛

 找回密码
 立即注册
查看: 2750|回复: 10

Python递归死循环问题-有关数学建模整数规划

[复制链接]
发表于 2021-7-22 10:00:00 | 显示全部楼层 |阅读模式
40鱼币
本帖最后由 zfcq 于 2021-7-22 10:44 编辑

代码是解决数学建模中整数规划问题的代码
import math
from scipy.optimize import linprog
import sys

def integerPro(c, A, b, Aeq, beq, t=1.0E-12):
    res = linprog(c, A_ub = A, b_ub=b, A_eq=Aeq, b_eq=beq)
    if(type(res.x) is float):
        bestX = [sys.maxsize]*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]
        newCon1 = [0]*len(A[0])
        newCon2 = [0]*len(A[0])
        newCon1[ind] = -1
        newCon2[ind] = 1
        newA1 = A.copy()
        newA2 = A.copy()
        newA1.append(newCon1)
        newA2.append(newCon2)
        newB1 = b.copy()
        newB2 = b.copy()
        newB1.append(-math.ceil(bestX[ind]))
        newB2.append(math.floor(bestX[ind]))
        r1 = integerPro(c, newA1, newB1, Aeq, beq)
        r2 = integerPro(c, newA2, newB2, Aeq, beq)
        if r1[0] < r2[0]:
            return r1
        else:
            return r2

        
if __name__ == '__main__':
    c = [3,4,1]
    A = [[-1,-6, -2],[-2,0,0]]
    b = [-5, -3] 
    Aeq = [[0,0,0]]
    beq=[0]
    print(integerPro(c, A, b, Aeq, beq))

运行结果

运行结果


运行结果应为:
(8.0, array([2, 0., 2.]))

主要是求解决整数规划-分支定界相关问题的方法,可以发有点相关解决方法,或者直接用其他库。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 10:06:44 | 显示全部楼层
递归教学实验可以,生产环境尽量不用。
上面是递归超限了,所以error了,把代码改成不用递归。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 10:13:12 | 显示全部楼层
非要递归的话开头加上:
sys.setrecursionlimit(1000000)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 10:15:23 | 显示全部楼层
suchocolate 发表于 2021-7-22 10:06
递归教学实验可以,生产环境尽量不用。
上面是递归超限了,所以error了,把代码改成不用递归。

那不就成了线性规划问题了吗,这不用递归的话,整数最优解难道要自己一点点试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 10:17:33 | 显示全部楼层
把代码改成尾递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 10:17:53 | 显示全部楼层
学渣李某人 发表于 2021-7-22 10:13
非要递归的话开头加上:

不输出结果,直接 RESTART: Shell 了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 10:19:04 | 显示全部楼层
别用idle或者别用递归, 昨天有人问过这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 10:23:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 10:28:28 | 显示全部楼层
学渣李某人 发表于 2021-7-22 10:23
你这个问题和这个很像:
https://fishc.com.cn/forum.php?mod=viewthread&tid=199343

我这个应该是可以运行成功的,因为有确切结果,我怕我是代码逻辑问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 10:29:41 | 显示全部楼层
zfcq 发表于 2021-7-22 10:28
我这个应该是可以运行成功的,因为有确切结果,我怕我是代码逻辑问题

你先试试用别的编辑器运行一下吧, 实在不行可以用vscode打断点调试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-24 14:13:49 | 显示全部楼层
我也不知道,不过悬赏40鱼币还是我头一次见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 02:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表