跳转到内容
学习 > 学习文档
本文内容

4.1 处理约束问题

1. 引言

到目前为止所说明的QUBO模型,本质上是一个无约束优化问题:

minx{0,1}n(i=1ncixi+i<jqijxixj)=xTQx

对于绝大多数实际问题而言,求解该问题的最优化解都存在着必须满足的约束。

比如,投资资金的分配问题,其主要目的是让投资回报达到最大化。不过,在这个过程中有一系列的约束条件——总预算不能超过1000万元(限制了投资的总体规模);每个项目至少要分配50万元(确保每个项目都有足够的资金支持);还要受到行业政策的限制,例如能源项目必须符合碳排放指标,不能超过规定的碳排放量(Emax)等等。将这个例子用数学形式表述,可以写成:

maxi=1nrixis.t.i=1nxi1000xi50ijEcjxjEmaxxi0i.

在实际的优化过程中,这些约束条件可以分为硬约束和软约束。硬约束是必须严格遵守的,例如TSP(旅行商问题)中每个城市只能访问一次;软约束则可以通过调整目标函数来处理,例如通过惩罚函数来体现对某些约束的违反程度。通常来说,可以使用拉乘、惩罚法或者直接构造可行域等方法,将这些约束条件整合到优化模型中,从而找到最优解。

转换的思想很简单,假设我们的目的是计算目标函数的最小值,那么我们可以在目标函数上增加一个非负的惩罚函数(设计为关于决策变量的二次函数形式),也即Penalty Method(惩罚法)。用户可以使用Kaiwu SDK进行约束的惩罚法转换,通过将约束条件转化为惩罚项加入目标函数,从而避免直接求解带约束的优化问题,可以有效重构QUBO模型。

考虑到有约束优化问题一般使用惩罚法进行无约束形式的转换,所以本篇将详细讲述惩罚法在QUBO模型中的应用,特别是如何处理等式约束和不等式约束。

2. 数学表述

由于惩罚项只是原优化问题的约束条件,而不是最优化目标,因此Penalty Method所引入的惩罚项被设计为:

(1)如果当前解满足约束,那么惩罚函数的值等于0;

(2)如果当前解不满足约束,那么惩罚函数是一个很大的正数。

P是一个很大的正数,如果违反约束的话,目标函数会受到一个很大的惩罚,以至于我们最终得到的解会倾向于符合约束。

给定优化问题:

minf(x)s.t.gi(x)0(i=1,2,...,m)hj(x)=0(j=1,2,...,n)xk{0,1}(k=1,2,...,d)

可以通过惩罚法转化为无约束优化问题:

minL(x,P)=f(x)+Pi=1mϕi(gi(x))+Pj=1nψj(hj(x))

其中,f(x)表示优化问题的目标函数;ϕi(gi(x))为不等式约束惩罚项,即仅当gi(x)>0(违反约束)时产生惩罚,本文主要采用松弛变量法处理不等式约束;

ψj(hj(x))为等式约束惩罚项,满足ψj(hj(x))=hj(x)2 即对等式约束的任何偏离hj(x)0均施加惩罚;

最后,P>0控制约束违反的惩罚强度。对于一个有约束优化问题同时存在多个约束的情况,只需将其约束转换成惩罚项形式后,在不等式后直接逐一相加即可。

3. 常见约束类型的具体表达

惩罚法的基本思想是,将约束条件转化为惩罚项,并将惩罚项加入目标函数中。对于违反约束的解,惩罚项会增加目标函数的值,从而使优化算法倾向于找到满足约束的解。现实应用中,最常见的两种约束就是等式约束和不等式约束,下面我们将重点介绍如何对各类约束进行转换。

3.1 线性等式约束情况

原始约束为:

i=1naixi=b

其QUBO形式的惩罚项可以写为:

P(i=1naixib)2

展开后可得:

P(i=1nai2xi+2i<jaiajxixj2bi=1naixi+b2)

其中常数项b2可忽略,不影响优化方向。这种情况下,无论约束违反方向如何(正偏差或负偏差),平方项均施加相同惩罚,符合等式约束的对称性要求;并且平方函数在实数域上光滑可导,便于优化算法处理。

例子: 原始约束为x1+x2+x3=2,对其展开后为二次项:

P(x1+x2+x32)2=P(x12+x22+x32+44x14x24x3+2x1x2+2x1x3+2x2x3)

由于xi为二进制,xi2=xi,化简为:

P(x1+x2+x3+44x14x24x3+2x1x2+2x1x3+2x2x3)

3.2 线性不等式约束

不等式约束通常表示为g(x)0,也即“不超过”、“不少于”等等约束。例如,“某工厂需在总用电量不超过1000度的前提下,优化5台机器的运行时间以最大化产量”。为了将这种约束转化为惩罚项,可以引入松弛变量s,从而将不等式约束转化为等式约束形式。

假设原始约束为:

i=1naixib0

我们可以引入松弛变量s并且保证s0,将其转化为等式约束:

i=1naixib+s=0

s代表约束的违反程度。其QUBO形式的惩罚项可以构造为:

P(i=1naixi+sb)2

其中P是惩罚因子,控制松弛变量对目标函数的影响。如果i=1naixib>0,则松弛变量s的值将大于零,惩罚项也会增加,从而使得违反约束的解在优化过程中不被优先选择。

为了使目标函数符合QUBO的标准形式,我们需要将松弛变量s转化为二进制变量。如果松弛变量s是一个整数变量(例如sZ+),可以通过二进制编码方法将其表示为一组二进制变量,即s=k=0m2ksk,其中sk{0,1}。此时,原惩罚项可以展开为:

P(aixi+2kskb)2

这样修改后,目标函数就变成了一个包含二进制变量的二次型表达式,符合QUBO问题的标准形式。

3.3 逻辑约束的代数表达

实际上,以上两种情况已经能解决大部分问题,但为了更好地解释一部分非常重要也非常常用的约束情况——逻辑约束,这里对此类约束进行归纳总结。

(1)蕴含关系

假设原始约束为

x1x2(x1=1,则x2=1)

其QUBO形式的惩罚项可以写为:

Px1(1x2)=P(x1x1x2)

比如,若某设备启用(x1=1),则其配套安全系统必须激活(x2=1)。

(2)互斥约束

假设原始约束为: x1+x21,此处表示x1x2不能同时为1,其QUBO形式的惩罚项可以写为:

Px1x2

x1=x2=1时惩罚项为P

比如,某会议时间不能同时选择两个冲突的演讲主题(x1x2不能同时为1)。

(3)逻辑或约束

同样地,对于至少有一个1的约束x1+x21,可以构造

(1x)(1y)=1xy+xy

使得QUBO形式的惩罚项可以写为:

P(1xy+xy)

x1=x2=0时惩罚项为P

比如,某岗位招聘需至少满足 “有编程经验”(x1)或 “有数学背景”(x2)。

(4)依赖关系

假设原始约束为 x1+x2x3 ,表示若x3=1,则x1x2至少一个为1,则其QUBO形式的惩罚项可以写为:

Px3(1x1x2)=P(x3x1x3x2x3)

比如,若某项目需审批通过(x3=1),则需至少有一个部门负责人签字(x1x2为 1)。

(5)异或关系

异或(XOR)关系表示两个变量必须不同,即x1x2。其 QUBO 形式的惩罚项可构造为:

P(x1x2)2=P(x122x1x2+x2)

此时当x1x2时,惩罚项为 P;当 x1=x2时,惩罚项为0。

比如,某产品设计必须选择A供应商或B供应商,但不能同时选择两者(x1x2)。

(6)其他

存在其它类型约束,如Rosenberg提出的通过引入辅助变量,构造惩罚项。当需要降次时,会用到该约束形式,在后篇的《处理降次问题》中将深入讨论这一问题。

对任意三次项yiyjyk,引入辅助变量qij=yiyj,则原三次项变为二次项 qijyk,添加惩罚项:

P(qij,yi,yj)=3qij2qijyi2qijyj+yiyj

最终目标函数表示为:

qijyk+λP(qij,yi,yj)

3.4 总结

约束类型原始表达式惩罚项形式
等式约束aixi=bP(aixib)2
不等式约束aixibP(aixib+s)2
逻辑约束x1x2Px1(1x2)
其它约束yiyjykqijyk+λP(qij,yi,yj)

除此之外,下表给出了一些常见约束的惩罚项示例。注意表中所有变量均为二进制变量,参数P为正标量惩罚值,该值必须选择足够大以确保惩罚项确实等效于经典约束,但实际应用中通常很容易确定合适的P值。我们将在《调整惩罚系数》一节深入讨论这一问题。

原始表达式惩罚项形式
x+y1P(xy)
x+y1P(1xy+xy)
x+y=1P(1xy+2xy)
xyP(xxy)
x1+x2+x31P(x1x2+x1x3+x2x3)
x=yP(x+y2xy)

基于 MIT 许可发布