本文章为上篇建模学习打卡第二天的

文章目录

一、本次问题

二、本题理解

三、问题求解

1.lingo实现

(1)先抛除整数约束条件对问题求解

(2)加入整数约束条件求解

2.python实现求解

(1)先抛除整数约束条件对问题求解

(2)加入整数约束条件求解实现   通过 pulp 库求解

(3)加入整数约束条件求解实现  分枝界定法求解


一、本次问题

二、本题理解

目标函数:

max = 40x1+90x2

一级约束条件:

9x1+7x2<=56
7x1+20x2<=70
x1,x2 >= 0

二级约束条件:

x1,x2全为整数

三、问题求解

1.lingo实现

lingo编写代码时,每行代码结束后必须以 ‘ ; ’ 结束,否则无法运行。

(1)先抛除整数约束条件对问题求解

基础线性规划实现(matlab,lingo)_菜菜笨小孩的博客-CSDN博客

  lingo代码实现:(l无其他条件下,ingo中默认变量大于等于0)

max = 40*x1+90*x2;
9*x1+7*x2<=56;
7*x1+20*x2<=70;

        结果:最优解 x1=4.80916 , x2 = 1.816794 ; 最优值为355.8779;显然不符合题意

(2)加入整数约束条件求解

首先,需要引出lingo的变量界定函数 @gin(x) --- 将x限制为整数条件

       ingo代码实现:通过变量界定函数将x1,x2限制为整数约束

max = 40*x1+90*x2;
9*x1+7*x2<=56;
7*x1+20*x2<=70;
@gin(x1);
@gin(x2);

    结果:最优解 x1=4 , x2 = 2 ; 最优值为340;符合题意

lingo实现求解到此结束。

2.python实现求解

(1)先抛除整数约束条件对问题求解

基础线性规划实现---python_菜菜笨小孩的博客-CSDN博客

        python代码实现如下:详解请看上方python基础线性规划的文章

#导入包
from scipy import optimize as opt
import numpy as np#确定c,A,b,Aeq,beq
c = np.array([40,90]) #目标函数变量系数
A = np.array([[9,7],[7,20]]) #不等式变量系数
b = np.array([56,70]) #不等式变量值
Aeq = np.array([[0,0]]) #等式变量系数
beq = np.array([0]) #等式变量值
#限制
lim1=(0,None)
lim2=(0,None)
#求解
res = opt.linprog(-c,A,b,Aeq,beq,bounds=(lim1,lim2))
#输出结果
print(res)

        结果:最优解 x1=4.80916 , x2 = 1.816794 ; 最优值为355.8779;显然不符合题意

(2)加入整数约束条件求解实现   通过 pulp 库求解

安装库:我用python3.8安装成功了

pip install pulp

python代码实现:

1.导入库

import pulp as pulp

2.定义解决问题的函数

def solve_ilp(objective , constraints) :print(objective)print(constraints)prob = pulp.LpProblem('LP1' , pulp.LpMaximize)prob += objectivefor cons in constraints :prob += consprint(prob)status = prob.solve()if status != 1 :return Noneelse :return [v.varValue.real for v in prob.variables()]

3.设置目标函数和约束条件等

V_NUM = 2 #本题变量个数
# 变量,直接设置下限
variables = [pulp.LpVariable('X%d' % i, lowBound=0, cat=pulp.LpInteger) for i in range(0, V_NUM)]
# 目标函数
c = [40, 90]
objective = sum([c[i] * variables[i] for i in range(0, V_NUM)])
# 约束条件
constraints = []
a1 = [9, 7]
constraints.append(sum([a1[i] * variables[i] for i in range(0, V_NUM)]) <= 56)
a2 = [7, 20]
constraints.append(sum([a2[i] * variables[i] for i in range(0, V_NUM)]) <= 70)

4.求解:

res = solve_ilp(objective, constraints)
print(res) #输出结果

完整代码如下:

# -*- coding: utf-8 -*-
import pulp as pulpdef solve_ilp(objective, constraints):print(objective)print(constraints)prob = pulp.LpProblem('LP1', pulp.LpMaximize)prob += objectivefor cons in constraints:prob += consprint(prob)status = prob.solve()if status != 1:# print 'status'# print statusreturn Noneelse:# return [v.varValue.real for v in prob.variables()]return [v.varValue.real for v in prob.variables()]V_NUM = 2
# 变量,直接设置下限
variables = [pulp.LpVariable('X%d' % i, lowBound=0, cat=pulp.LpInteger) for i in range(0, V_NUM)]
# 目标函数
c = [40, 90]
objective = sum([c[i] * variables[i] for i in range(0, V_NUM)])
# 约束条件
constraints = []
a1 = [9, 7]
constraints.append(sum([a1[i] * variables[i] for i in range(0, V_NUM)]) <= 56)
a2 = [7, 20]
constraints.append(sum([a2[i] * variables[i] for i in range(0, V_NUM)]) <= 70)
# print (constraints)res = solve_ilp(objective, constraints)
print(res) #输出解

结果:最优解 x1=4 , x2 = 2 ; 最优值为340;符合题意

(3)加入整数约束条件求解实现  分枝界定法求解

何为分枝界定法,请看详解https://blog.csdn.net/qq_25990967/article/details/121211474

python代码实现:

1.导入库

from scipy.optimize import linprog
import numpy as np
import math
import sys
from queue import Queue

2.定义整数线性规划类

class ILP()

3.定义分枝界定法函数

def __init__(self, c, A_ub, b_ub, A_eq, b_eq, bounds):# 全局参数self.LOWER_BOUND = -sys.maxsizeself.UPPER_BOUND = sys.maxsizeself.opt_val = Noneself.opt_x = Noneself.Q = Queue()# 这些参数在每轮计算中都不会改变self.c = -cself.A_eq = A_eqself.b_eq = b_eqself.bounds = bounds# 首先计算一下初始问题r = linprog(-c, A_ub, b_ub, A_eq, b_eq, bounds)# 若最初问题线性不可解if not r.success:raise ValueError('Not a feasible problem!')# 将解和约束参数放入队列self.Q.put((r, A_ub, b_ub))def solve(self):while not self.Q.empty():# 取出当前问题res, A_ub, b_ub = self.Q.get(block=False)# 当前最优值小于总下界,则排除此区域if -res.fun < self.LOWER_BOUND:continue# 若结果 x 中全为整数,则尝试更新全局下界、全局最优值和最优解if all(list(map(lambda f: f.is_integer(), res.x))):if self.LOWER_BOUND < -res.fun:self.LOWER_BOUND = -res.funif self.opt_val is None or self.opt_val < -res.fun:self.opt_val = -res.funself.opt_x = res.xcontinue# 进行分枝else:# 寻找 x 中第一个不是整数的,取其下标 idxidx = 0for i, x in enumerate(res.x):if not x.is_integer():breakidx += 1# 构建新的约束条件(分割new_con1 = np.zeros(A_ub.shape[1])new_con1[idx] = -1new_con2 = np.zeros(A_ub.shape[1])new_con2[idx] = 1new_A_ub1 = np.insert(A_ub, A_ub.shape[0], new_con1, axis=0)new_A_ub2 = np.insert(A_ub, A_ub.shape[0], new_con2, axis=0)new_b_ub1 = np.insert(b_ub, b_ub.shape[0], -math.ceil(res.x[idx]), axis=0)new_b_ub2 = np.insert(b_ub, b_ub.shape[0], math.floor(res.x[idx]), axis=0)# 将新约束条件加入队列,先加最优值大的那一支r1 = linprog(self.c, new_A_ub1, new_b_ub1, self.A_eq,self.b_eq, self.bounds)r2 = linprog(self.c, new_A_ub2, new_b_ub2, self.A_eq,self.b_eq, self.bounds)if not r1.success and r2.success:self.Q.put((r2, new_A_ub2, new_b_ub2))elif not r2.success and r1.success:self.Q.put((r1, new_A_ub1, new_b_ub1))elif r1.success and r2.success:if -r1.fun > -r2.fun:self.Q.put((r1, new_A_ub1, new_b_ub1))self.Q.put((r2, new_A_ub2, new_b_ub2))else:self.Q.put((r2, new_A_ub2, new_b_ub2))self.Q.put((r1, new_A_ub1, new_b_ub1))

4.定义求解问题中的变量级约束条件

def test():""" 此测试的真实最优解为 [4, 2] """c = np.array([40, 90])A = np.array([[9, 7], [7, 20]])b = np.array([56, 70])Aeq = Nonebeq = Nonebounds = [(0, None), (0, None)]solver = ILP(c, A, b, Aeq, beq, bounds)solver.solve()print("Test 's result:", solver.opt_val, solver.opt_x)print("Test 's true optimal x: [4, 2]\n")

5.求解并输出

if __name__ == '__main__':test()

完整代码如下:

from scipy.optimize import linprog
import numpy as np
import math
import sys
from queue import Queueclass ILP():def __init__(self, c, A_ub, b_ub, A_eq, b_eq, bounds):# 全局参数self.LOWER_BOUND = -sys.maxsizeself.UPPER_BOUND = sys.maxsizeself.opt_val = Noneself.opt_x = Noneself.Q = Queue()# 这些参数在每轮计算中都不会改变self.c = -cself.A_eq = A_eqself.b_eq = b_eqself.bounds = bounds# 首先计算一下初始问题r = linprog(-c, A_ub, b_ub, A_eq, b_eq, bounds)# 若最初问题线性不可解if not r.success:raise ValueError('Not a feasible problem!')# 将解和约束参数放入队列self.Q.put((r, A_ub, b_ub))def solve(self):while not self.Q.empty():# 取出当前问题res, A_ub, b_ub = self.Q.get(block=False)# 当前最优值小于总下界,则排除此区域if -res.fun < self.LOWER_BOUND:continue# 若结果 x 中全为整数,则尝试更新全局下界、全局最优值和最优解if all(list(map(lambda f: f.is_integer(), res.x))):if self.LOWER_BOUND < -res.fun:self.LOWER_BOUND = -res.funif self.opt_val is None or self.opt_val < -res.fun:self.opt_val = -res.funself.opt_x = res.xcontinue# 进行分枝else:# 寻找 x 中第一个不是整数的,取其下标 idxidx = 0for i, x in enumerate(res.x):if not x.is_integer():breakidx += 1# 构建新的约束条件(分割new_con1 = np.zeros(A_ub.shape[1])new_con1[idx] = -1new_con2 = np.zeros(A_ub.shape[1])new_con2[idx] = 1new_A_ub1 = np.insert(A_ub, A_ub.shape[0], new_con1, axis=0)new_A_ub2 = np.insert(A_ub, A_ub.shape[0], new_con2, axis=0)new_b_ub1 = np.insert(b_ub, b_ub.shape[0], -math.ceil(res.x[idx]), axis=0)new_b_ub2 = np.insert(b_ub, b_ub.shape[0], math.floor(res.x[idx]), axis=0)# 将新约束条件加入队列,先加最优值大的那一支r1 = linprog(self.c, new_A_ub1, new_b_ub1, self.A_eq,self.b_eq, self.bounds)r2 = linprog(self.c, new_A_ub2, new_b_ub2, self.A_eq,self.b_eq, self.bounds)if not r1.success and r2.success:self.Q.put((r2, new_A_ub2, new_b_ub2))elif not r2.success and r1.success:self.Q.put((r1, new_A_ub1, new_b_ub1))elif r1.success and r2.success:if -r1.fun > -r2.fun:self.Q.put((r1, new_A_ub1, new_b_ub1))self.Q.put((r2, new_A_ub2, new_b_ub2))else:self.Q.put((r2, new_A_ub2, new_b_ub2))self.Q.put((r1, new_A_ub1, new_b_ub1))def test():""" 此测试的真实最优解为 [4, 2] """c = np.array([40, 90])A = np.array([[9, 7], [7, 20]])b = np.array([56, 70])Aeq = Nonebeq = Nonebounds = [(0, None), (0, None)]solver = ILP(c, A, b, Aeq, beq, bounds)solver.solve()print("Test 's result:", solver.opt_val, solver.opt_x)print("Test 's true optimal x: [4, 2]\n")if __name__ == '__main__':test()

结果:最优解 x1=4 , x2 = 2 ; 最优值为340;符合题意

整数线性规划实现(lingo,python分枝界定法)相关推荐

  1. 整数线性规划实现(matlab分枝界定法)

    文章目录 一.本次问题 1.利用第一天所学知识求解: 2.本题理解: (1)分支界定法 背景: 基本理论(解题步骤): 求解实现1: 1.第一步 2.第二步 3.第三步 4.第四步 结论:综上,最优解 ...

  2. python混合整数线性规划_【Python代码】混合整数规划MIP/线性规划LP+python(ortool库)实现...

    相关知识点 LP线性规划问题 Linear Problem [百度百科]:研究线性约束条件下线性目标函数的极值问题的数学理论和方法. 学过运筹学的小伙伴,可以看这个LP问题的标准型来回顾一下: 不太熟 ...

  3. Python 实现整数线性规划:分枝定界法(Branch and Bound)

    今天做作业,要实现整数线性规划的分枝定界法算法.找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚.规范,所以在此记录.如有错误,请指正. from scipy.optimize import ...

  4. python混合整数线性规划_Python 实现整数线性规划:分枝定界法(Branch and Bound)...

    今天做作业,要实现整数线性规划的分枝定界法算法.找了一些网上的博客,发现都很屎,感觉自己写的这个比较清楚.规范,所以在此记录.如有错误,请指正. from scipy.optimize import ...

  5. MindOpt对于混合整数线性规划问题如何建模优化(python语言)

    简介 MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP).混合整数线性规划(MILP).二次规划(QP),可以支持命令行.c.c++.java和python调用.接下来我们将发布 ...

  6. yalmip + lpsolve + matlab 求解混合整数线性规划问题(MIP/MILP)

    转自,原文: https://www.cnblogs.com/kane1990/p/3428129.html 最近建立了一个网络流模型,是一个混合整数线性规划问题(模型中既有连续变量,又有整型变量). ...

  7. 使用COPT求解混合整数线性规划

    一.使用Copt求解模型步骤 1.模型的引入 使用 from copt import * 引入模型 import coptpy as cp 2.创建求解环境 env = Envr() 创建优化模型,返 ...

  8. 混合整数线性规划,图的最大流,图的匹配,求解

    求解软件有, matlab,lingo,商用软件 GLPK,GNU LP Kit,开源,ansi C 介绍图的匹配,matching https://www.tutorialspoint.com/gr ...

  9. 回溯法、分枝限定法--求解N个杯子分酒问题

    n(<20)个没有刻度.容量分别为A1~ An的酒杯,初始装酒量分别为s1~ sn,求用最少次数倒成D1~ Dn的倒酒过程,其中A1~ An, s1~ sn, D1~Dn数据可以固定在程序中. ...

最新文章

  1. XCode 4.3 不使用新特性 适用低版本的的项目 不是初学者就可以跳过了(转)
  2. 【TensorFlow】MNIST手写数字识别
  3. 层次狄利克雷过程HDP(Hierarchical Dirichlet Processes)
  4. Redis进阶之redis的生命周期
  5. Zemax简单透镜的设计与优化
  6. python zip压缩_用Python处理ZIP压缩包
  7. 用Excel体验梯度下降法计算函数极值
  8. Pandas数据类型——Series
  9. win10计算机打开一直读进度条,win10开机读条后黑屏怎么办_win10开机读条之后黑屏修复方法-win7之家...
  10. PADS-电阻、电容、电感PCB封装
  11. 关于Linux系统指令 top 之 %wa 占用高,用`iostat`探个究竟
  12. TPS793475DBVREP
  13. python中find函数爬虫_python 如何使用find和find_all,爬虫、找文本
  14. CNN实战:猫狗大战
  15. Microdata – HTML5之语义扩展
  16. 浅薄”绝不该是中国程序员的性格特征[转载]
  17. PyQt5 随笔:信号与槽的两种使用方法:@pyqtSlot() 和 connect()
  18. 盈建科内楼板局部荷载的导荷计算
  19. arctime视频字幕添加器
  20. 如何从c++代码调用Linux C库?Barcode Reader Toolkit 常见问题集锦

热门文章

  1. Win7提示文件太大无法放入回收站怎么办
  2. foxmail邮箱日历怎么新建事务
  3. outlook两个账号怎么分开存储邮件
  4. Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)
  5. spring的@ControllerAdvice注解
  6. linux运行程序+后注销,linux – 如果我启动后台进程然后注销,它会继续运行吗?...
  7. 01 - java 开始
  8. oracle rman备份慢,诊断Oracle RMAN备份慢的原因
  9. dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法
  10. 使用vim的重不重要_VIM高级操作,经常用vim的应该多学习。多开发效率很有大帮助!...