数学建模之运筹学

您所在的位置:网站首页 何为整数 数学建模之运筹学

数学建模之运筹学

2023-08-07 04:00| 来源: 网络整理| 查看: 265

在这里插入代码片# 运筹学

线性规划 线性规划

概念:约束条件及目标函数都是决策变量的线性函数的规划问题。 在这里插入图片描述 缺陷: 线性规划只能解决一组线性约束条件下,一个目标的最大值或最小值问题。 在实际决策中,衡量方案优劣要考虑多个目标,这些目标中,有主要的,也有次要的;有最大值的,也有最小值的;有定量的,也有定性的;有相互补充的,也有相互对立的。对于这些问题,线性规划则无能为力。——线性目标规划

(化简立)即得标准型

eg.求解 在这里插入图片描述

Python 代码

法一:scipy.optimize.linprog

linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)

参数解释: c是价值向量; A_ub和b_ub对应线性不等式约束; A_eq和b_eq对应线性等式约束; bounds对应公式中的lb和ub,决策向量的下界和上界; method是求解器的类型,如单纯形法; 其他的参数暂时不用。

注意:用此方法求解,都需要把方程组转化成标准形式!

from scipy.optimize import linprog # 导包 C = [-1,4] # 价值向量 A = [[-3,1],[1,2]] # 系数矩阵 b = [6,4] # 约束向量 # 给每个决策变量指定取值范围 X0_bounds = [None,None] X1_bounds = [-3,None] res = linprog(C,A,b,bounds=(X0_bounds,X1_bounds)) print(res) # 输出结果 ''' con: array([], dtype=float64) fun: -22.0 # 最优值 message: 'Optimization terminated successfully.' nit: 5 slack: array([3.90000000e+01, 1.77635684e-15]) status: 0 success: True x: array([10., -3.]) # 最优解 '''

若是非标准形式,如求最大值: 在这里插入图片描述 再去求解!

Matlab代码

[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)

参数解释: x :返回决策向量的取值 fval :返回目标函数的最优值 f :价值向量 A :线性不等式约束的系数向量(跟Python要输入成矩阵不同,Matlab输入向量) b :线性不等式约束的约束向量 Aeq : 线性等式约束的系数向量(跟Python要输入成矩阵不同,Matlab输入向量) beq :线性不等式约束的约束向量 LB:决策向量的下界向量 UB:决策变量的上界向量

f = [-1, 4]; A = [-3, 1; 1, 2]; b = [6, 4]; lb = [0, -3]; [x, y] = linprog(f, A,b,[],[],lb,[])

在这里插入图片描述

Lingo代码 min=-1*x1+4*x2; -3*x1+1*x2= y_max[j]) prob.solve() return {'objective':pulp.value(prob.objective), 'var': [[pulp.value(var[i][j]) for j in range(col)] for i in range(row)]} # 然后构造参数传递进去: if __name__ == '__main__': costs = np.array([[4, 5, 6, 5], [7, 10, 5, 6], [8, 9, 12, 7]]) max_plant = [20, 20, 50] max_cultivation = [15, 25, 20, 30] res = transportation_problem(costs, max_plant, max_cultivation) print(f'最小值为{res["objective"]}') print('各变量的取值为:') pprint(res['var']) ''' 最大值为575.0 各变量的取值为: [[15.0, 5.0, 0.0, 0.0], [0.0, 0.0, 20.0, 0.0], [0.0, 20.0, 0.0, 30.0]] ''' Lingo代码 model: sets: warehouses/1..4/: e; vendors/1..6/: d; links(warehouses,vendors): c,x; endsets data: !数据部分; e= 76 88 96 40; !属性值; d=42 56 44 39 60 59; c= 500 550 630 1000 800 700 800 700 600 950 900 930 1000 960 840 650 600 700 1200 1040 980 860 880 780; enddata max=@sum(links(i,j): c(i,j)*x(i,j)); !目标函数; @for(warehouses(i):@sum(vendors(j): x(i,j))x,y},{xx(i),yy(i)}); b=eig(a); %求矩阵的特征值 f=subs(f,{x,y},{xx(i),yy(i)}); if all(b>0) fprintf('(%f,%f)是极小值点,对应的极小值为%f\n',xx(i),yy(i),f); elseif all(b0) & any(b


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3