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

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) <= 6,                 #2*(x1 + x2) <= 12
       a @ x + dminus - dplus == b, #利用矩阵乘法将等式约束四合一
       x >= 0, dplus >= 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')

运行结果:

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0-1整数规划(0-1 Integer Programming)是线性规划的一个子集,其中变量被限制为只能取0或1的整数值。Lingo是一种强大的数学优化软件,它提供了方便的语来定义和解决此类问题。多目标目标规划(Multi-objective Optimization)涉及寻找同时优化两个或更多目标函数的最佳解,这些目标函数之间可能没有简单的加权关系。 在Lingo中,你可以用以下几个步骤来编写一个0-1整数规划的多目标问题: 1. **定义决策变量**:声明哪些变量是整数变量(通常用`@bin`修饰)。 ```lisp @bin x1, x2, ..., xn; ``` 2. **定义目标函数**:设置多个目标函数,使用`minimize`或`maximize`关键字,每个目标后面跟上一个线性表达式。 ```lisp minimize z1 := a1*x1 + a2*x2 + ... + an*xn; maximize z2 := b1*x1 + b2*x2 + ... + bn*xn; ``` 3. **定义约束条件**:列出所有线性和非线性的限制条件,使用`subject to`。 ```lisp x1 + x2 <= M; (线性约束) (x3)^2 <= x4; (非线性约束,^表示幂运算) ``` 4. **多目标部分**:如果有多目标,可以用`minimize`/`maximize`组合来表示。 ```lisp minimize z3 = w1*z1 + w2*z2; (加权目标,w1和w2是权重) ``` 5. **调用优化器**:最后,使用`solve`命令执行优化。 ```lisp solve; ``` **例子**:假设有一个项目分配问题,我们既要最小化成本(z1),又要最大化满意度(z2),且每个项目只能选择一次: ```lisp @bin project分配; minimize cost := cost_project * project; maximize satisfaction := satisfaction_project * project; subject to sum(project, i) == 1; (只有一个项目被选) capacity >= sum(capacity_project * project); (不超过总容量) model ProjectAllocation; solve; ``` **相关问题--:** 1. Lingo如何处理非线性目标函数? 2. 在多目标优化中,如何选择满意解? 3. 如何在Lingo中引入目标函数的权重调整? 4. 如何在实际问题中确定项目的成本函数和满意度函数?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值