赞
踩
【衡量每个目标的完成情况】
设
\[fi(i=1,⋯l)\] 为第i个目标函数的实际值;设
\[d0i\] 表示\[fi\] 的目标值
实例说明:
目标函数实际值 \[f1\] 目标值 \[d01\] 正偏差变量
\[d+1\] 负偏差变量
\[d−1\] 意义 收入50万 不少于60万 0 10 未到达还有10万 收入70万 10 0 超出10万
【必须要满足的条件】
【允许有偏差→利用正负偏差变量】
实例说明:【含有“尽可能”、“尽量”等关键词】
尽可能使利润不低于56万
【类似“权重”】
给每一个目标一个优先因子P,仅仅是确定各目标的求解次序
【将之前的单目标最优解变成下一个目标的约束条件,然后迭代这个过程】
1.根据模型中各个目标的优先级(优先因子),确定各目标的求解次序
2.求第一级单目标规划的最优值
3.以第一 级单目标等于最优值
4.依次递推,直到所有目标都求完或不存在可行解为止
某工厂生产产品1和产品2,有关数据如下,请给出方案,设计每天生产产品1、2各多少时,满足下面的要求:
现在的要求是:
【以上不等式变形顺序对应】
- 第一个不等式:因为是≤,所以要求正偏差变量要最小
- 第二个不等式:因为是=,所以要求正偏差和负偏差都要小,所以求和要最小
- 第三个不等式:因为是≥,所以要求负偏差变量要最小
所以得到目标函数:
P仅仅是优先因子,仅仅决定后面多目标求解顺序,而不是真正意义上的权重值
根据1中原理介绍偏差变量,目标函数看似没有包含变量x,实则每一个偏差变量都要利用x计算
“多退少补”原则【将目标约束中的不等式变成等式】
\[−d+1+d−1\] 表示:减去“超过”的,加上“未达到”
- clc,clear
- %初始化优化问题框架
-
- %创建优化变量
- %%2个产品【用x表示】【最小值=0】
- x = optimvar('x',2,'LowerBound',0);
- %%3个目标函数的正偏差变量 【最小值=0】
- dp = optimvar('dp',3,'LowerBound',0);
- %%3个目标函数的负偏差变量 【最小值=0】
- dm = optimvar('dm',3,'LowerBound',0);
-
- %创建优化问题对象
- p = optimproblem('ObjectiveSense','min');
-
- %设置约束条件
-
- %%设置绝对约束
- p.Constraints.cons1 = (2*x(1)+x(2)<=11);
- %%设置3个目标约束
- p.Constraints.cons2 = [x(1)-x(2)-dp(1)+dm(1)==0
- x(1)+2*x(2)-dp(2)+dm(2)==10
- 8*x(1)+10*x(2)-dp(3)+dm(3)==56];
-
- %设置目标函数
- obj = [dp(1);dm(2)+dp(2);dm(3)];
-
- % 单级目标函数的最优值goal,初始设为足够大的数
- % 非常宽松的约束就等于没有约束,确保第一级的正常运算
- goal=100000*ones(3,1);
-
- %序贯算法(迭代最优)
- for i=1:3
- % 重要:更新上一级的最优值,作为该级的约束条件;
- p.Constraints.cons3=[obj<=goal];
- p.Objective = obj(i);
- %求解【 针对优化问题使用solve,会自动选择求解方式】
- [sx,fval] = solve(p);
- %【下面两行可注释】只是展示每一次迭代结果
- fprintf('第%d级目标求解为:\n',i)
- fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp
- %sx类似于python中创建的类【这里指优化类】
- %x(最后得到的优化方案)、dm(负偏差变量)、dp(正偏差变量)为3个sx下的对象
- goal(i) = fval;
- end
表示:每天应生产产品一2件,产品二4件
optimproblem
【用来创建优化问题】prob=optimproblem('ObjectiveSense','max');
ObjectiveSense是目标类型,后面跟的‘max’为求最大优化
默认为求min
x=optimvar('x',1,2,'TYPE','integer','LowerBound',0,'UpperBound',inf);
第一个‘x’里面是变量名,后面 1 2 为变量的行 列
‘TYPE’,后面定义的是该函数所属类型,比如说integer整数型,double双精度型号等
‘LowerBound'下界;'UpperBound'上界
prob.Constraints.cons1
- p.Constraints.cons1 = ( 2*x(1)+x(2)<=11 )
-
- p.Constraints.cons2=[x(1)-x(2)+dm(1)-dp(1)==0
- x(1)+2*x(2)+dm(2)-dp(2)==10
- 8*x(1)+10*x(2)+dm(3)-dp(3)==56];
p为优化问题创建的对象
pro.Objective
- obj=[dp(1); dm(2)+dp(2); dm(3)];
- p.Objective=obj(i);
p为优化问题创建的对象
sovle
函数求解[sx,fval]=solve(p);
p为优化问题创建的对象
sx为最优值变量(理想)
fval为在最优变量下的目标函数值
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。