目标规划

线性规划只能解决一组线性约束条件下,一个目标值的最大值或最小值问题。实际决策中,衡量方案的优劣需要考虑多个目标,这些目标有主要的,次要的;定量的,定性的;互相补充的,互相对立的。用普通的线性规划难以解决此类问题。故考虑采用“目标规划”。
目标规划的求解思路有两种:

  1. 加权系数法:为每个目标赋予一个权系数,将多目标模型转换为单一目标模型。难点在于权系数的确定。
    熵权法确定权值:https://www.cnblogs.com/huzixia/p/10403481.html
  2. 优先等级法:将各目标按照其优先级,转换为单一目标模型。
     
    目标规划中没有最优解的概念,只有满意解,即能够照顾到各目标使决策者满意的解。
     

加权系数法

难点在于权系数的确定,这里采用 熵权法确定权系数

理想解法

示例

求解:

model:
	2*x1+3*x2<=18;
	2*x1+x2<=10;
	

	min=(3*x1-2*x2+12)^2+(-4*x1-3*x2+24)^2;!12,24;
end

解析

已分别求解到f1,f2取最的理想值,然后求解x使得偏离理想值最小。

优先等级法

 

目标规划模型相关概念

  1. 正,负偏差变量
    \(f_i\)(i=1,...,l)表示第i个目标函数,其正偏差变量 \(d{i}^{+}=max\left \{f{i}-d{i}^{0},0 \right \}\)表示决策超过目标值的部分;负偏差值变量表示决策值未达到目标值的部分。且有 。
  2. 绝对(刚性)约束和目标约束
    绝对约束指必须严格满足的等式约束或不等式约束,不能满足这些约束条件的解称为非可行解。目标约束是目标规划特有的,可将约束的右端看作追求的目标值,在达到此目标值时允许发生正或负偏差。
  3. 优先因子(优先等级)与权系数
    目标规划有若干个规划,达到这些目标有主次之分,第一位达到的目标赋予优先因子\(p_1\),依次类推。\(P_k\)比\(P_k+1\)有更高的优先权。具有相同优先因子的两个目标可被赋予不同的权系数\(W_j\)。
  4. 目标规划的目标函数
    目标规划的目标函数按照各目标约束的正负偏差变量和优先因子构造,是所有偏差变量的加权和。目标函数的值要尽可能小的偏离目标值。
    有三种基本形式:
    (1) 第i个目标要求恰好达到目标值,正负偏差值要尽可能的小,即
    \(min {w{i}^{-}}{d{i}^{-}}+{w{i}^{+}}{d{i}^{+}}\)
    (2)第i个目标不超过目标值,正偏差要尽可能小,即
    \(min {w{i}^{+}}{d{i}^{+}}\)
    (3)第i个目标要超过目标值,负偏差要尽可能小,即
    \(min {w{i}^{-}}{d{i}^{-}}\)

目标函数一般数学模型


 

目标规划的序贯算法

核心思路:按照优先级先后次序,将目标规划分解成一系列单目标规划,即每次的目标函数只处理一个目标,此前已求解的优先级更高的目标结果作为一个约束条件。

示例1:


分析:

设每天音乐,新闻,商业节目的播放时间分别为\(x_1\),\(x_2\),\(x_3\),
刚性条件为:

\[x_1+x_2+x_3=12; \]

则\(P_1\)约束条件为:

\[x_3+d_{1}^{-}-d_{1}^{+} =2.4;\\ x_2+d_{2}^{-}-d_{2}^{+} =1; \]

\(P_2\)的约束条件为:

\[250x_3-17.5x_1+d_{3}^{-}-d_{3}^{+} =582.5; \]

目标函数:

\[min=P_1(d_{1}^{+}+d_{2}^{-})+P_2(d_{3}^{-}); \]

lingo代码:

model:
	sets:
		type/1..3/:x;
		level/1,2/:p,z,goal;
		yueshu/1..3/:dplus,dminus,g;
		link(yueshu,type):c;
	endsets

	data:
		g=2.4,1,582.5;
		c=0,0,1,0,1,0,-17.5,0,250;
	enddata
	@sum(type:x)=12;

	@for(yueshu(i):@sum(type(j):c(i,j)*x(j)+dminus(i)-dplus(i))=g(i));
	min=dminus(3);

end

解答:

|x|value|
|--|--|--|
X( 1)| 0.000000
X( 2) | 9.670000
X( 3) | 2.330000

示例2

lingo代码

model:
	sets:
		level/1..5/:p,z,goal; !5个等级;
		type/1..3/:x;!A,B,C生产数;
		yueshu/1..8/:g,dplus,dminus;!8个约束条件;
		link(yueshu,type):c; !8个约束条件的x系数;
		obj(level,yueshu)/1 1,2 2,2 3,2 4,3 8,4 5,4 6,4 7,5 1/:wplus,wminus;
	endsets

	data:
		ctr=?;
		goal=? ? ? ? 0;
		g=1700, 50,50,80,100,120,100,1900;
		c=5 8 12 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 5 8 12;
		wplus=0 0 0 0 1 0 0 0 1;
		wminus=1 20  18 21 0 20 18 21 0;
	enddata

	min=@sum(level:p*z);
	
	p(ctr)=1;
	@for(level(i)|i#ne#ctr:p(i)=0);
	@for(level(i)|i#lt#@size(level):@bnd(0,z(i),goal(i));
      @for(yueshu(i):@sum(type(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i));
	@for(level(i):z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)*dminus(j)));
	
end

tips

使用ctr进行每个level的自动迭代,初始ctr=1,并设置goal(i)(i!=1)=INF,p(i)(i!=ctr)=0,随后用每次计算的结果替代原goal(i),参与后续的计算.

posted @ 2020-12-11 23:46  圆圆的圈圈  阅读(1326)  评论(0)    收藏  举报