大二数学建模多目标规划序贯式解法例题(网上lingo转python语言)

您所在的位置:网站首页 数学建模目标规划例题 大二数学建模多目标规划序贯式解法例题(网上lingo转python语言)

大二数学建模多目标规划序贯式解法例题(网上lingo转python语言)

2024-07-13 01:54| 来源: 网络整理| 查看: 265

byd网上全是同一篇标答文章转来转去的给我气笑了,lingo语言又不熟,这里就放个用python实现标答解法的

这序贯式解法说白了就是根据你自己判断的优先级依次解决罢了,重点是要理解那个正、负偏差变量的设置,我个人理解就是能让柔性约束有一定的显式的变化,将原先需要另列出实际值与目标值作差比较的直接“提拔”成待优化的求解变量,而具体含义和定义还请参照其它文章对此的详解。

1.生产计划问题

某企业生产甲、乙两种产品,需要(同时!)用到A,B,C三种设备,关于产品的赢利与使用设备的工时及限制如下表所示。问该企业应如何安排生产,才能达到下列目标。

(1)力求使利润指标不低于1500 元;(P_1)

(2)考虑到市场需求,甲、乙两种产品的产量比应尽量保持1:2;(P_2)

(3)设备A为贵重设备,严格禁止超时使用;

(4)设备C可以适当加班,但要控制;设备B既要求充分利用,又尽可能不加班。在重要性上,设备B是设备C的3 倍。(P_3)

求解策略:

        分析题意,我们需要在多个目标前提下安排生产,故该题为多目标规划问题,而注意到在表述上各目标之间存在明显的优先级差异,故考虑序贯式解法——其核心是根据优先级的先后次序,将目标规划问题分解成一系列的单目标规划问题,然后再依次求解。

       依目标表述分析知,目标(3)为刚性约束,而目标(1)、(2)、(4)为柔性约束,且三个目标优先等级依次递减,赋于这三个目标P1,P2,P3优先因子(注意它并不是一个约定系数!在min式中就是用来标注求解次序)。之后设出各目标约束的正、负偏差变量(均取正值),即可进行建模。

数学模型:

目标函数 min z 等式中 Pi只起到一个标注优先级次序的作用而非系数;P_3括号里面的系数3乘给d_3就挺巧妙地建立了题目中“在重要性上,设备B是设备C的3 倍”的显式的重要性关系(要最小化z加和中P_3的目标值,那么就肯定优先最小化 有3倍关系的 变化率更高的d_3而非d_4了),也是我个人觉得挺难的一个点。

而四个等式约束含义依次对应题意中的:

力求利润不低于1500元;

甲乙产量比尽量为1/2(分式乘开转差式);

设备B的时长约束;

设备C的时长约束.

代码:

注意solver的设置不一定要加,也不一定用下面的

import numpy as np import cvxpy as cp # 定义参数矩阵 a = np.array([[200, 300], [2, -1], [4, 0], [0, 5]]) b = np.array([1500, 0, 16, 15]) # 定义各变量 x = cp.Variable(2, integer=True) dminus = cp.Variable(4, integer=True) dplus = cp.Variable(4, integer=True) # 定义限制条件 con = [sum(x) = 0, dminus >= 0] #序贯式解法: #一级目标求解 obj1 = cp.Minimize(dminus[0]) prob1 = cp.Problem(obj1, con) prob1.solve(solver='CPLEX') print("一级目标最优解为:", x.value) print("一级目标最优值为:", prob1.value) print(f'd-值:{dminus.value}, d+值:{dplus.value}') #二级目标求解 con.append(dminus[0] == prob1.value) #注意一级目标解取值情况添加作为往后的限制条件 obj2 = cp.Minimize(dminus[1] + dplus[1]) prob2 = cp.Problem(obj2, con) prob2.solve(solver='CPLEX') print("二级目标最优解为:", x.value) print("二级目标最优值为:", prob2.value) print(f'd-值:{dminus.value}, d+值:{dplus.value}') #三级目标求解 con.append(dminus[1] + dplus[1] == prob2.value) #注意二级目标解取值情况添加作为往后的限制条件 obj3 = cp.Minimize(3*(dminus[2] + dplus[2])+dminus[3]) prob3 = cp.Problem(obj3, con) prob3.solve(solver='CPLEX') print("三级目标最优解为:", x.value) print("三级目标最优值为:", prob3.value) print(f'd-值:{dminus.value}, d+值:{dplus.value}') print(f'即最终结果为:\n应安排生产甲产品{x[0].value}件,乙产品{x[1].value}件,获取利润{a[0] @ x.value}元\n' f'A设备生产时长为{2*sum(x.value)}h,正好充分利用\n' f'B设备生产时长为{4*x[0].value}h,少利用{b[2] - 4*x[0].value}h\n' f'C设备生产时长为{5*x[1].value}h,多加班{abs(b[3] - 5*x[1].value)}h') 运行结果:



【本文地址】


今日新闻


推荐新闻


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