欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

正负偏差变量 即 d2+、d2- 分别表示决策值中超出和未达到目标值的部分。而 di+、di- 均大于 0 刚性约束和目标约束(柔性目标约束有偏差) 在多目标规划中,>=/<= 在刚性约束中保持不变。当需要将约束条件转换为柔性约束条件时,需要将 >=/<= 更改为 =(因为已经有 d2+、d2- 用来表示正负偏差),并附加上 (+dii-di+) 注意这里是 +di、-di+!之所以是 +di,-di+,是因为需要将目标还原为最接近的原始刚性约束条件 优先级因素和权重因素 对多个目标进行优先排序和优先排序 目标规划的目标函数 是所有偏差变量的加权和。值得注意的是,这个加权和都取最小值。而 di+ 和 dii- 并不一定要出现在每个不同的需求层次中。具体分析需要具体问题具体分析 下面是一个例子: 题目中说设备 B 既要求充分利用,又要求尽可能不加班,那么列出的时间计量表达式即为:min z = P3 (d3- + d3 +) 使用 + 而不是 -d3 + 的原因是

最编程 2024-04-25 17:43:28
...

由于上面的过程需要编写好几个程序,在使用时不方便,下面给出Lingo编写的一个通用程序,在程序中用到数据段未知数据的编程方法。

!序贯算法的核心就在于按照p的优先级依次视作单目标规划去求解  eg.p1表示优先级为1的,需要第一个计算;
model:
sets:
level/1..3/:p,z,goal;
variable/1..2/:x;
h_con_num/1..1/:b;
s_con_num/1..4/:g,dplus,dminus;
!以上为建立变量;
h_con(h_con_num,variable):a;!构建约束;
s_con(s_con_num,variable):c;!构建约束;
obj(level,s_con_num)/1 1,2 2,3 3,3 4/:wplus,wminus;!定义P(i)与dplus(i)、dminus(i)之间的系数.其中1 1代表P(1)和dplus(1)、dminus(1)的系数;
endsets
data:
ctr=?;	!?表示需要输入;
goal=??0;	!因为是一级一级去求偏差的,所以一共三级时,求解到最后一级时只需要输入前两级的最优偏差约束即可,所以goal是??0;
b=12;
g=1500 0 16 15;
a=2 2;
c=200 300 2 -1 4 0 0 5;
wplus=0 1 3 1;
wminus=1 1 3 0;
enddata
min=@ sum(level:p*z);	!这个是按照一级一级来求的,因为从该行往下第二行可以发现在求该级目标的时候,其他级的系数均置为了0.;
p(ctr)=1;	!p是序贯算法中的表示优先级的因子,不是一个系数。所以这里当作系数运算时令为1,详见下一行注释。序贯算法的核心就在于按照p的优先级依次视作单目标规划去求解  eg.p1表示优先级为1的,需要第一个计算;
@for(level(i)|i#ne#ctr:p(i)=0);!i不等于ctr时,p(i)为0;
@for(level(i):z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)*dminus(j)));!构建z(i);
@for(h_con_num(i):@sum(variable(j):a(i,j)*x(j))<b(i));!第一个刚性约束;
@for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i));	!柔性约束;
@for(level(i)|i#lt#@ size(level):@ bnd(0,z(i),goal(i)));	!这里是为了带上之前求出来的级别最优偏差的约束:0=<z(i)<=goal(i);
end

推荐阅读