多目标规划模型

本文同步发布于我的网站,欢迎参观!

在许多实际问题当中,衡量一个方案的好坏标准可能不只一个。比如生产某个东西的时候想要“物美价廉”——既要质量好,又要成本低。这一类问题统称为多目标最优化问题或者多目标规划问题

标准形式

多目标规划问题一般可以写成如下形式:
min ⁡ f 1 ( x ) min ⁡ f 2 ( x ) ⋮ min ⁡ f p ( x )  s.t.  g i ( x ) ≤ 0 , i = 1 , 2 , … , m \begin{aligned} \min & f_1(x) \\ \min & f_2(x) \\ & \vdots \\ \min & f_p(x) \\ \text { s.t. } & g_i(x) \leq 0, i=1,2, \ldots, m \end{aligned} minminmin s.t. f1(x)f2(x)fp(x)gi(x)0,i=1,2,,m

其中, x = ( x 1 , x 2 , … , x m ) T ∈ R m , p ≥ 2 x=\left(x_1, x_2, \ldots, x_m\right)^T \in R^m, p \geq 2 x=(x1,x2,,xm)TRm,p2

例题1 生产计划问题

下面以一道例题来展示常见的多目标规划模型

某厂生产三种布料 A 1 , A 2 , A 3 A_1,A_2,A_3 A1,A2,A3,改厂两班生产,每周生产时间为 80 h 80h 80h,能耗上限 160 t 160t 160t标准煤。其他数据如下表:

布料生产速度(m/h)利润(元/m)每周最大销售量(m)能耗(t/km)
A 1 A_1 A14000.15400001.2
A 2 A_2 A25100.13510001.3
A 3 A_3 A33600.20360001.4

问每周生产三种布料各多少米,才能使得该厂的利润最高,而能耗最少?


设该厂每周生产三种布料分别 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3小时。总利润为 y 1 = f 1 ( x ) y_1=f_1(x) y1=f1(x)(元),总能耗为 y 2 = f 2 ( x ) y_2=f_2(x) y2=f2(x)(吨标准煤),其中 x = ( x 1 , x 2 , x 3 ) T x=(x_1,x_2,x_3)^T x=(x1,x2,x3)T,则上述问题的数学模型为:
min ⁡ y 1 = − f 1 ( x ) min ⁡ y 2 = f 2 ( x )  s.t.  { x 1 + x 2 + x 3 ≤ 80 1.2 × 0.4 x 1 + 1.3 × 0.5 x 2 + 1.4 × 0.36 x 3 ≤ 160 0 ≤ x 1 ≤ 100 , 0 ≤ x 2 ≤ 100 , 0 ≤ x 3 ≤ 100 \begin{aligned} & \min y_1=-f_1(x) \\ & \min y_2=f_2(x) \\ & \text { s.t. }\left\{\begin{array}{l} x_1+x_2+x_3 \leq 80 \\ 1.2 \times 0.4 x_1+1.3 \times 0.5 x_2+1.4 \times 0.36 x_3 \leq 160 \\ 0 \leq x_1 \leq 100,0 \leq x_2 \leq 100,0 \leq x_3 \leq 100 \end{array}\right. \end{aligned} miny1=f1(x)miny2=f2(x) s.t.  x1+x2+x3801.2×0.4x1+1.3×0.5x2+1.4×0.36x31600x1100,0x2100,0x3100
其中
f 1 ( x ) = 0.15 × 400 x 1 + 0.13 × 510 x 2 + 0.2 × 360 x 3 f 2 ( x ) = 1.2 × 0.4 x 1 + 1.3 × 0.51 x 2 + 0.36 × 1.4 x 3 \begin{align} f_1(x)&=0.15\times400x_1+0.13\times510x_2+0.2\times360x_3\\ f_2(x)&=1.2\times0.4x_1+1.3\times 0.51x_2+0.36\times 1.4x_3 \end{align} f1(x)f2(x)=0.15×400x1+0.13×510x2+0.2×360x3=1.2×0.4x1+1.3×0.51x2+0.36×1.4x3


可以发现,多目标规划问题与以前所讲的规划问题的主要区别在于:目标函数不止一个,而是 p p p个。 ( p ≥ 2 ) (p\ge2) (p2)

多目标问题的解法

多目标问题的解法大致可以分为两类:直接解法间接解法。其中常用的多为间接解法:根据问题的实际背景和特征,设法讲多目标优化问题转化为单目标优化问题,从而得到满意的解法。

间接解法有:主要目标法,分层序列法,线性加权求和法。

假设我们现在的问题数学模型形如
min ⁡   y 1 = f 1 ( x ) min ⁡   y 2 = f 2 ( x )  s.t.   g i ( x ) ≤ 0 , i = 1 , 2 , … , m \begin{aligned} \min \ & y_1 = f_1(x) \\ \min \ & y_2 = f_2(x) \\ \text { s.t. }\ & g_i(x) \leq 0, i=1,2, \ldots, m \end{aligned} min min  s.t.  y1=f1(x)y2=f2(x)gi(x)0,i=1,2,,m
下面简述三种解法。

主要目标法

不妨设 f 1 ( x ) f_1(x) f1(x)为主要目标。那么我们为 f 2 ( x ) f_2(x) f2(x)设定一个阈值 θ \theta θ,将其转化为一个约束 f 2 ( x ) ≤ θ f_2(x)\le \theta f2(x)θ
min ⁡   y 1 = f 1 ( x )  s.t.   g i ( x ) ≤ 0 , i = 1 , 2 , … , m f 2 ( x ) ≤ θ \begin{aligned} \min \ & y_1 = f_1(x) \\ \text { s.t. }\ & g_i(x) \leq 0, i=1,2, \ldots, m\\ & f_2(x)\le \theta \end{aligned} min  s.t.  y1=f1(x)gi(x)0,i=1,2,,mf2(x)θ
这里的阈值 θ \theta θ需要自己主观确定,确定的合理一点。

注:论文写作时,使用主要目标法之前,应先将原数学模型写出来。

分层序列法

假设 y 1 y_1 y1 y 2 y_2 y2重要(给目标函数的重要性排个序),那么先不管 y 2 y_2 y2,解第一个模型:
min ⁡   y 1 = f 1 ( x )  s.t.   g i ( x ) ≤ 0 , i = 1 , 2 , … , m \begin{aligned} \min \ & y_1 = f_1(x) \\ \text { s.t. }\ & g_i(x) \leq 0, i=1,2, \ldots, m \end{aligned} min  s.t.  y1=f1(x)gi(x)0,i=1,2,,m
假设解出了最优解: x = x ⋆ , y 1 = f 1 ( x ⋆ ) x=x^\star,y_1=f_1(x^\star) x=x,y1=f1(x)

接着我们需要在“不牺牲 y 1 y_1 y1的情况下最小化 y 2 y_2 y2”,即解第二个模型:
min ⁡   y 2 = f 2 ( x )  s.t.   g i ( x ) ≤ 0 , i = 1 , 2 , … , m f 1 ( x ) ≤ f 1 ( x ⋆ ) \begin{aligned} \min \ & y_2 = f_2(x) \\ \text { s.t. }\ & g_i(x) \leq 0, i=1,2, \ldots, m\\ & f_1(x)\le f_1(x^\star) \end{aligned} min  s.t.  y2=f2(x)gi(x)0,i=1,2,,mf1(x)f1(x)
但是分析发现,条件 f 1 ( x ) ≤ f 1 ( x ⋆ ) f_1(x)\le f_1(x^\star) f1(x)f1(x)是很难满足的。如果第一个模型只有唯一解,那么对于第二个模型要满足 f 1 ( x ) ≤ f 1 ( x ⋆ ) f_1(x)\le f_1(x^\star) f1(x)f1(x),也只有唯一解(即 x = x ⋆ x=x^\star x=x)。

在实际建模中,为了确保 y 2 y_2 y2有一定的“生存空间”,往往将第二个模型的限制条件 f 1 ( x ) ≤ f 1 ( x ⋆ ) f_1(x)\le f_1(x^\star) f1(x)f1(x)增加一个裕度 η \eta η,适当的放松对于 y 1 y_1 y1优化的力度:
min ⁡   y 2 = f 2 ( x )  s.t.   g i ( x ) ≤ 0 , i = 1 , 2 , … , m f 1 ( x ) ≤ f 1 ( x ⋆ ) + η \begin{aligned} \min \ & y_2 = f_2(x) \\ \text { s.t. }\ & g_i(x) \leq 0, i=1,2, \ldots, m\\ & f_1(x)\le f_1(x^\star)+\eta \end{aligned} min  s.t.  y2=f2(x)gi(x)0,i=1,2,,mf1(x)f1(x)+η

线性加权求和法

取权重 w 1 , w 2 ∈ ( 0 , 1 ) w_1,w_2\in(0,1) w1,w2(0,1),且 w 1 + w 2 = 1 w_1+w_2=1 w1+w2=1,将原模型转化为
min ⁡   y = w 1 f 1 ( x ) + w 2 f 2 ( x )  s.t.   g i ( x ) ≤ 0 , i = 1 , 2 , … , m \begin{aligned} \min \ & y = w_1f_1(x)+w_2f_2(x) \\ \text { s.t. }\ & g_i(x) \leq 0, i=1,2, \ldots, m \end{aligned} min  s.t.  y=w1f1(x)+w2f2(x)gi(x)0,i=1,2,,m
w 1 , w 2 w_1,w_2 w1,w2​的取值情况要讨论,需要讨论取不同权重对于结果的影响。

例题

国赛2005B《DVD在线租赁》T2T3

问题重述

DVD租赁网站的会员可以租赁DVD。每个会员每个月可以提交至多2次订单,订单包含了一个基于该会员对DVD偏爱程度排序的DVD列表(长度最大为10),每次租赁可以获得3张DVD。会员看完3张DVD之后需要将3张DVD寄回才可以继续下次租赁。

T2:表2列出了网站手上的100中DVD及其现有张数、当前需要处理的1000位会员的订单。对这些DVD进行分配,使会员获得最大的满意度

T3:继续考虑表2,并假设表2中DVD现有的数量全部为0。作为网站经营管理人员,决定每种DVD的购买量,以及如何对这些DVD进行分配,才能使得一个月内95%的会员得到他想看的DVD,并且满意度最大

表2节选

DVD编号D001D002D003
DVD现有数量104015
会员C0016(表示第6想要)0(表示不想要)0
会员C002000
会员C003003(表示第3想要)
会员编号…

模型假设

  1. 假设按照公历月份进行租赁业务,即会员的所有租赁必须在当月内完成DVD的租与还。
  2. 假设网站对会员进行一次租赁业务时,只能向其提供3张该会员已经预定的DVD,否则不进行租赁。(这个可以减少计算量)

问题二模型建立与求解

我们设会员得到了其第 i i i想要的DVD所产生的满意度为 11 − i 11-i 11i,对得到不想要的DVD的满意度为 0 0 0,依此将表2的订单矩阵转化为满意度矩阵 C C C,其中 c i j c_{ij} cij表示第 i i i位会员对第 j j j中DVD的满意度。显然每位会员最大满意度为 10 + 9 + 8 = 27 10+9+8=27 10+9+8=27​。依照假设2,只有该会员的满意度达到了27,才会给这位会员寄出DVD,对总满意度产生贡献。

我们定义 x i j x_{ij} xij
x i j = { 0  将第  j  种DVD不分配个第  i  个会员  1  将第  j  种DVD分配给第  i  个会员  i = 1 , 2 , ⋯   , 1000 ; j = 1 , 2 , ⋯   , 100 \begin{gathered} x_{i j}= \begin{cases}0 & \text { 将第 } j \text { 种DVD不分配个第 } i \text { 个会员 } \\ 1 & \text { 将第 } j \text { 种DVD分配给第 } i \text { 个会员 }\end{cases} \\ i=1,2, \cdots, 1000 ; j=1,2, \cdots, 100 \end{gathered} xij={01 将第 j DVD不分配个第 i 个会员  将第 j DVD分配给第 i 个会员 i=1,2,,1000;j=1,2,,100
对于每种DVD,分配的总量不能超过现有的数量 n j n_j nj,故有
∑ i = 1 1000 x i j ≤ n j , j = 1 , 2 , … , 100 \begin{gather} \sum_{i=1}^{1000}x_{ij}\le n_j,\quad j=1,2,\dots,100 \end{gather} i=11000xijnj,j=1,2,,100
只给下订单的DVD进行分配,即只有满意度指数 c i j ≠ 0 c_{ij}\not=0 cij=0的时候才会将一张 j j j种DVD分配给会员 i i i,故有
x i j ≤ c i j , i = 1 , 2 , … , 1000 ; j = 1 , 2 , … , 100 \begin{gather} x_{ij}\le c_{ij},\quad i=1,2,\dots,1000;j=1,2,\dots,100 \end{gather} xijcij,i=1,2,,1000;j=1,2,,100
相当于“若 c i j = 0 c_{ij}=0 cij=0,则 x i j = 0 x_{ij}=0 xij=0”。这用了一个很巧妙的方式。

根据假设2,每个会员要么得到3张其预定的DVD,要么不得。故有
∑ j = 1 100 x i j = 3 或 0 , i = 1 , 2 , … , 1000 \begin{gather} \sum_{j=1}^{100}x_{ij}=3或0,\quad i=1,2,\dots,1000 \end{gather} j=1100xij=30,i=1,2,,1000
在上述约束的前提下,我们需要最大化总体满意度指数和
∑ i = 1 1000 ∑ j = 1 100 c i j x i j \begin{gather} \sum_{i=1}^{1000}\sum_{j=1}^{100}c_{ij}x_{ij} \end{gather} i=11000j=1100cijxij
显然每位会员最大的满意度指数为 27 27 27,1000位会员的最大满意度指数和为 1000 × 27 = 27000 1000\times 27=27000 1000×27=27000​,依此进行归一化
max ⁡ w = 1 27000 ∑ i = 1 1000 ∑ j = 1 100 c i j x i j \begin{equation} \max \quad w=\frac{1}{27000} \sum_{i=1}^{1000} \sum_{j=1}^{100} c_{i j} x_{i j} \end{equation} maxw=270001i=11000j=1100cijxij
由此可得问题二的0-1整数线性规划模型如下:
max ⁡ w = 1 27000 ∑ i = 1 1000 ∑ j = 1 100 c i j x i j  s.t.  { ( ∑ j = 1 100 x i j ) − 3 z i = 0 ∑ i = 1 1000 x i j ≤ n j x i j ≤ c i j x i j = 0  或  1 z i = 0  或  1 i = 1 , 2 , ⋯   , 1000 ; j = 1 , 2 , ⋯   , 100 \begin{equation} \begin{aligned} & \max \quad w=\frac{1}{27000} \sum_{i=1}^{1000} \sum_{j=1}^{100} c_{i j} x_{i j} \\ & \text { s.t. }\left\{\begin{array}{l} (\sum_{j=1}^{100} x_{i j})-3 z_i=0\\ \sum_{i=1}^{1000} x_{i j} \leq n_j\\ x_{i j} \leq c_{i j}\\ x_{i j}=0 \text { 或 } 1\\ z_i=0 \text { 或 } 1 \end{array}\right. \\ & i=1,2, \cdots, 1000 ; j=1,2, \cdots, 100 \end{aligned} \end{equation} maxw=270001i=11000j=1100cijxij s.t.  (j=1100xij)3zi=0i=11000xijnjxijcijxij=0  1zi=0  1i=1,2,,1000;j=1,2,,100
其中 z i z_i zi是一个人工变量,用于解决限制 ∑ j = 1 100 x i j = 3 或 0 \sum_{j=1}^{100}x_{ij}=3或0 j=1100xij=30

Lingo代码

需要先设置xls文件的区域名称 [ 1 ] ^{[1]} [1]

MODEL:
SETS:
A /1..1000/:z;  
B /1..100/:dvd; 
link(A,B):ordC,C,x;      
ENDSETS

DATA:
ordC = @OLE("...\2005Bdata.xls", 'ordC');
dvd = @OLE("...\2005Bdata.xls", 'dvd');
ENDDATA

CALC:
@for(A(i):
    @for(B(j):
        C(i,j)=@if(ordC(i,j) #EQ# 0,0,11-ordC(i,j));
    )
);
ENDCALC

max=@sum(link(i,j):C(i,j)*x(i,j))/27000;
@for(A(i):@sum(B(j):x(i,j))=3*z(i));
@for(B(j):@sum(A(i):x(i,j))<=dvd(j));
@for(link(i,j):x(i,j)<=C(i,j));
@for(link(i,j):@bin(x(i,j)));
@for(A(i):@bin(z(i)));
END

解得总体最大满意度为 91.56 % 91.56\% 91.56%,只有6个人没有成功租赁。

问题三模型建立与求解

问题三大体上和问题二接近,但是由于同时要最小化dvd的购买量(减少成本),允许在当前某些会员无法满足租赁要求的时候,让其等待,利用部分会员归还的dvd对其进行租赁。

根据问题一(略),一个月中每张有 0.6 0.6 0.6的概率被租赁两次, 0.4 0.4 0.4的概率被租赁一次。即在二次租赁的情况下,每购买一张DVD当于发挥了 0.6 × 2 + 0.4 = 1.6 0.6\times 2+0.4=1.6 0.6×2+0.4=1.6张DVD的作用。

由此我们在问题二的模型的基础上,进一步考虑DVD两次租赁的情况,满足 95 % 95\% 95%的会员的DVD需求,同时进一步追求DVD总购买量最小,建立双目标线性规划模型。

对于每种DVD,分配的总量不超过购买量的1.6倍
∑ i = 1 1000 x i j ≤ 1.6 y j , j = 1 , 2 , … , 100 \begin{gather} \sum_{i=1}^{1000}x_{ij}\le 1.6y_j,\quad j=1,2,\dots,100 \end{gather} i=11000xij1.6yj,j=1,2,,100
95 % 95\% 95%的会员可以看到他想看的3张DVD,DVD总共至少要 1000 × 3 × 95 % = 2850 1000\times3\times95\%=2850 1000×3×95%=2850
∑ i = 1 1000 ∑ j = 1 100 x i j ≥ 1000 × 3 × 0.95 = 2850 \begin{gather} \sum_{i=1}^{1000}\sum_{j=1}^{100}x_{ij}\ge 1000\times 3\times 0.95=2850 \end{gather} i=11000j=1100xij1000×3×0.95=2850
希望购买的DVD总数量尽量少
min ⁡ z = ∑ j = 1 100 y j \begin{gather} \min \quad z=\sum_{j=1}^{100}y_j \end{gather} minz=j=1100yj
由此可得问题三的双目标线性规划模型如下:
min ⁡ z = ∑ j = 1 100 y j max ⁡ w = 1 27000 ∑ i = 1 1000 ∑ j = 1 100 c i j x i j  s.t.  { ∑ i = 1 1000 ∑ j = 1 100 x i j ≥ 1000 × 3 × 0.95 ∑ i = 1 1000 x i j ≤ 1.6 y j ( ∑ j = 1 100 x i j ) − 3 z i = 0 x i j ≤ c i j x i j = 0  或  1 z i = 0  或  1 y j 为整数 i = 1 , 2 , ⋯   , 1000 ; j = 1 , 2 , ⋯   , 100 \begin{equation} \begin{aligned} & \min \quad z=\sum_{j=1}^{100}y_j\\ & \max \quad w=\frac{1}{27000} \sum_{i=1}^{1000} \sum_{j=1}^{100} c_{i j} x_{i j} \\ & \text { s.t. }\left\{\begin{array}{l} \sum_{i=1}^{1000}\sum_{j=1}^{100}x_{ij}\ge 1000\times3\times 0.95\\ \sum_{i=1}^{1000}x_{ij}\le 1.6y_j\\ (\sum_{j=1}^{100} x_{i j})-3 z_i=0\\ x_{i j} \leq c_{i j}\\ x_{i j}=0 \text { 或 } 1\\ z_i=0 \text { 或 } 1\\ y_j为整数 \end{array}\right. \\ & i=1,2, \cdots, 1000 ; j=1,2, \cdots, 100 \end{aligned} \end{equation} minz=j=1100yjmaxw=270001i=11000j=1100cijxij s.t.  i=11000j=1100xij1000×3×0.95i=11000xij1.6yj(j=1100xij)3zi=0xijcijxij=0  1zi=0  1yj为整数i=1,2,,1000;j=1,2,,100
我们使用主要目标法,我们引入总体最小满意度 θ ∈ [ 0 , 1 ] \theta\in[0,1] θ[0,1],将关于满意度的目标转化为约束:
min ⁡ z = ∑ j = 1 100 y j  s.t.  { 1 27000 ∑ i = 1 1000 ∑ j = 1 100 c i j x i j ≥ θ ∑ i = 1 1000 ∑ j = 1 100 x i j ≥ 1000 × 3 × 0.95 ∑ i = 1 1000 x i j ≤ 1.6 y j ( ∑ j = 1 100 x i j ) − 3 z i = 0 x i j ≤ c i j x i j = 0  或  1 z i = 0  或  1 y j 为整数 i = 1 , 2 , ⋯   , 1000 ; j = 1 , 2 , ⋯   , 100 \begin{equation} \begin{aligned} & \min \quad z=\sum_{j=1}^{100}y_j\\ & \text { s.t. }\left\{\begin{array}{l} \frac{1}{27000} \sum_{i=1}^{1000} \sum_{j=1}^{100} c_{i j} x_{i j} \ge \theta \\ \sum_{i=1}^{1000}\sum_{j=1}^{100}x_{ij}\ge 1000\times3\times 0.95\\ \sum_{i=1}^{1000}x_{ij}\le 1.6y_j\\ (\sum_{j=1}^{100} x_{i j})-3 z_i=0\\ x_{i j} \leq c_{i j}\\ x_{i j}=0 \text { 或 } 1\\ z_i=0 \text { 或 } 1\\ y_j为整数 \end{array}\right. \\ & i=1,2, \cdots, 1000 ; j=1,2, \cdots, 100 \end{aligned} \end{equation} minz=j=1100yj s.t.  270001i=11000j=1100cijxijθi=11000j=1100xij1000×3×0.95i=11000xij1.6yj(j=1100xij)3zi=0xijcijxij=0  1zi=0  1yj为整数i=1,2,,1000;j=1,2,,100

可以稍微对“为什么选取最小化DVD购买量为主要目标”作出一些合理的解释,比如“商家主要追求利润最大化,会员满意度在一定要求(比如90%)之上就差不多了”。

所以这里的 θ \theta θ可以自己主观调整。我们设 θ = 0.95 \theta=0.95 θ=0.95。在实际计算中,如果要求 y i y_i yi为整数,可能难以求得可行解,因而我们取消了对 y i y_i yi的整数约束,在计算之后再对其进行取整。

MODEL:
SETS:
A /1..1000/:z;  
B /1..100/:y; 
link(A,B):ordC,C,x;      
ENDSETS

DATA:
ordC = @OLE("...\2005Bdata.xls", 'ordC');
theta=0.95;
@OLE("...\T3_Output.xlsx",'y')=y;
ENDDATA

CALC:
@for(A(i):
    @for(B(j):
        C(i,j)=@if(ordC(i,j) #EQ# 0,0,11-ordC(i,j));
    )
);
ENDCALC

min=@sum(B(j):y(j));
@sum(link(i,j):C(i,j)*x(i,j))/27000>=theta;
@sum(link(i,j):x(i,j))>=1000*3*0.95;
@for(B(j):@sum(A(i):x(i,j))<=1.6*y(j));
@for(A(i):@sum(B(j):x(i,j))=3*z(i));
@for(link(i,j):x(i,j)<=C(i,j));
@for(link(i,j):@bin(x(i,j)));
@for(A(i):@bin(z(i)));
!@for(B(j):@gin(y(j)));
END

θ = 0.95 \theta=0.95 θ=0.95时,我们解得DVD总最小购买量 min ⁡   z = 1781.250 \min\ z=1781.250 min z=1781.250,各种DVD需要的购买量 y j y_j yj如下表(节选)

DVD编号总计12345
y j y_j yj1781.25013.125201523.12512.5
round( y j y_j yj)17821320152313

这里我和老师求出来的不太一样(1823),可能是我写的代码哪里出错了,还望斧正!

所有数据和代码打包放这里了。

参考文献

[ 1 ] [1] [1] LINGO与EXCEL之间的数据传递 - GShang - 博客园 (cnblogs.com)

以下是使用Gurobi和Python求解双目标线性规划的示例代码: ```python import gurobipy as gp # 创建模型 model = gp.Model('bilevel_problem') # 创建变量 x1 = model.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name='x1') x2 = model.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name='x2') y1 = model.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name='y1') y2 = model.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name='y2') # 创建约束条件 constr1 = model.addConstr(2*x1 + x2 <= y1, name='constr1') constr2 = model.addConstr(x1 + 2*x2 <= y2, name='constr2') # 定义目标函数 model.setObjective(y1 + y2, gp.GRB.MINIMIZE) # 创建子问题 submodel1 = gp.Model('subproblem1') submodel2 = gp.Model('subproblem2') # 创建子问题变量 subx1 = submodel1.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name='subx1') subx2 = submodel1.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name='subx2') suby1 = submodel1.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name='suby1') submodel1.update() subx1 = submodel2.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name='subx1') subx2 = submodel2.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name='subx2') suby2 = submodel2.addVar(lb=0, ub=gp.GRB.INFINITY, vtype=gp.GRB.CONTINUOUS, name='suby2') submodel2.update() # 创建子问题约束条件 subconstr1 = submodel1.addConstr(2*subx1 + subx2 <= suby1, name='subconstr1') submodel1.setObjective(suby1, gp.GRB.MAXIMIZE) subconstr2 = submodel2.addConstr(subx1 + 2*subx2 <= suby2, name='subconstr2') submodel2.setObjective(suby2, gp.GRB.MAXIMIZE) # 添加双层问题约束条件 model.addConstr(suby1 <= y1, name='subconstr1') model.addConstr(suby2 <= y2, name='subconstr2') # 求解模型 model.optimize() # 输出结果 print('x1=', x1.x) print('x2=', x2.x) print('y1=', y1.x) print('y2=', y2.x) ``` 在上面的代码中,我们定义了四个变量和两个约束条件,然后为目标函数设置了两个目标。接下来,我们创建了两个子问题,并分别定义了它们的变量和约束条件。然后,我们将子问题的解添加到双层问题的约束条件中,并使用 `optimize()` 方法求解模型。最后,我们输出了模型的解。 需要注意的是,双目标线性规划具有较高的计算复杂度和较多的局限性,需要根据具体问题进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值