1.例题
某工厂生产产品Ⅰ和产品Ⅱ,有关数据如下,若只追求最大化利润,得到模型:
现有三个目标 1.尽量使产品Ⅰ的产量不超过产品Ⅱ的产量;
2.尽可能充分利用所有设备;
3.尽可能使利润不少于56万
Ⅰ Ⅱ 拥有量 原材料/kg 2 1 11 设备生产能力/h 1 2 10 利润/(万元/件) 8 10
引入三个概念:正负偏差变量,绝对约束和目标约束,优先因子
2.建模步骤
①衡量每个目标的完成情况:正负偏差变量
- 设
为第i个目标函数
- 正偏差变量
表示实际值超过目标值那部分,负偏差变量
表示实际值未达到目标值那部分,这里的
表示
的目标值。
- 例如本题,目标三:尽可能使利润不少于56万,那么
目标函数实际值 目标值 正偏差变量 负偏差变量 意义 假设利润50万 不少于56万 0 6 离目标差6万 假设利润60万 4 0 超出目标4万
②绝对约束和目标约束
- 绝对约束是模型中自带的约束条件,必须满足,否则是不可行解
- 例如
,使用材料的数量不能超过总共数量
③目标函数是模型中对不等式右端追求的值允许有偏差
- 目标三:尽可能使利润不少于56万,也就是
,但允许有偏差
- 这个“偏差”就是加入正负偏差变量,变成:
④优先因子(一般需要查阅相关文献确定优先因子)
- 这三个条件哪个重要?需要从主观上确定优先因子
。
- 例如:我认为目标三最重要,给他优先因子是10;目标二重要,给他优先因子5;目标1第三重要,给他优先因子1.那么三个目标重要性之比是10:5:1。
目标 意义 目标函数 1.不超过目标值 正偏差变量 越小越好
2.恰好达到目标值 正负偏差都尽量小 3.不少于目标值 负偏差变量 越小越好
3.题目解决:
需要衡量每个目标的完成情况,并主观上区分三个目标的重要性,使得整体的完成情况尽量好。
- 把所有的目标约束都加上
变成等式
- 根据需要,主观确定优先因子
多目标规划方程:
4.典型赛题
题目中提到:使xxx最少/多/利润最大,同时“尽量”xxxx(2021年Mathorcup的c题)
5.解决方法:
①fgoalattain函数
fgoalattain()函数的用法:
x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x=fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fgoalattain(problem)
[x,fval] = fgoalattain(......)
[x,fval,attainfactor,exitflag,output] = fgoalattain(......)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(......)
其中fun 是用 M 文件定义的目标向量函数,x0 是初值,weight 是权重。
A,b 定义不等式约束A*x ≤ b ,Aeq,beq定义等式约束 Aeq*x=Beq ,
nonlcon是用 M 文件定义的非线性约束c(x) ≤0,ceq(x)=0 。返回值 fval是目标向量函数的值。
要完整掌握其用法,请用 help fgoalattain 或 type fgoalattain 查询相关的帮助。
详细用法:matlab可以解多目标非线性整数规划问题吗? - 知乎
②序贯算法
③Lingo求解:lingo规划问题的求解_lingo动态规划求解-CSDN博客