鱼C论坛

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

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

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

代码是解决数学建模中整数规划问题的代码

  1. import math
  2. from scipy.optimize import linprog
  3. import sys

  4. def integerPro(c, A, b, Aeq, beq, t=1.0E-12):
  5.     res = linprog(c, A_ub = A, b_ub=b, A_eq=Aeq, b_eq=beq)
  6.     if(type(res.x) is float):
  7.         bestX = [sys.maxsize]*len(c)
  8.     else:
  9.         bestX = res.x
  10.     bestVal = sum([x*y for x,y in zip(c,bestX)])
  11.     if all(((x-math.floor(x))<t or (math.ceil(x)-x)<t ) for x in bestX):
  12.   
  13.         return (bestVal, bestX)
  14.    
  15.     else:
  16.         ind = [i for i,x in enumerate(bestX) if (x-math.floor(x))>t and (math.ceil(x) - x)>t][0]
  17.         newCon1 = [0]*len(A[0])
  18.         newCon2 = [0]*len(A[0])
  19.         newCon1[ind] = -1
  20.         newCon2[ind] = 1
  21.         newA1 = A.copy()
  22.         newA2 = A.copy()
  23.         newA1.append(newCon1)
  24.         newA2.append(newCon2)
  25.         newB1 = b.copy()
  26.         newB2 = b.copy()
  27.         newB1.append(-math.ceil(bestX[ind]))
  28.         newB2.append(math.floor(bestX[ind]))
  29.         r1 = integerPro(c, newA1, newB1, Aeq, beq)
  30.         r2 = integerPro(c, newA2, newB2, Aeq, beq)
  31.         if r1[0] < r2[0]:
  32.             return r1
  33.         else:
  34.             return r2

  35.         
  36. if __name__ == '__main__':
  37.     c = [3,4,1]
  38.     A = [[-1,-6, -2],[-2,0,0]]
  39.     b = [-5, -3]
  40.     Aeq = [[0,0,0]]
  41.     beq=[0]
  42.     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 | 显示全部楼层
非要递归的话开头加上:
  1. 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, 2024-4-19 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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