0-1型整数线性规划是整数线性规划中的特殊情形,它的变量𝒙𝒊仅 取值0或1。这时𝒙𝒊称为0-1变量,或称二进制变量。
解0-1型整数线性规划最直观的方法,就是枚举法,即检查变量取 值为0或1的每一种组合,比较目标函数值以求得最优解,这需要 检查变量取值的𝟐𝒏个组合。
对于变量个数n较大(例如n>10),这几乎是不可能的。
因此常设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。
这样的方法称为隐枚举法(implicit enumeration). 分枝定界法也是一种隐枚举法。
例如 目标函数 max Z = 3X1 - 2X2 + 5X3
s.t. X1 + 2X2 - X3 <= 2
X1 + 4X2 + X3 <= 4
X1 + X2 <= 3
4X1 + X3 <= 6
X1,X2,X3 = 0或1
解题时可根据目标函数加入一个约束条件,称为过滤的条件。
用全部枚举的方法,3个变量共有23=8个解,原来4个约束条件, 共需32次运算。现在增加了过滤条件※,如按下述方法进行,就 可减少运算次数。 将5个约束条件按※, ① , ② , ③ ,④的顺序排好,
对每个解,依次代入约束条件左侧,求出数值,看是否适合不等 式条件,如某一条件不适合,同行以下各条件就不必再检查,因 而就减少了运算次数。
# 隐枚举法
# max Z = 3X1 - 2X2 + 5X3
# X1 + 2X2 - X3 <= 2
# X1 + 4X2 + X3 <= 4
# X1 + X2 <= 3
# 4X1 + X3 <= 6
# X1,X2,X3 = 0 或 1
import random as rd
def generateSequence(n):
x = []
x.append([0 for i in range(n)])
xTran = []
m = 0
while len(x) != 2 ** n:
for i in range(len(x)):
for j in range(n):
xTran.append(x[i][j])
xTran[n - m - 1] = 1
x.append(xTran)
xTran = []
m += 1
return x
def judge(x):
judge = None
if x[0] + 2 * x[1] - x[2] <= 2 and x[0] + 4 * x[1] + x[2] <= 4 and x[0] + x[1] <= 3 and 4 * x[0] + x[2] <= 6:
judge = True
else:
judge = False
return judge
n = 3
solution = generateSequence(n)
zmax = -float("inf")
best = []
for x in solution:
if judge(x):
z = 3 * x[0] - 2 * x[1] + 5 * x[2]
zmax = z
break
for x in solution:
z = 3 * x[0] - 2 * x[1] + 5 * x[2]
if z > zmax:
if judge(x):
zmax = z
best.append(x)
else:
continue
else:
continue
print("最优解:x = ",best[-1],"max z = ",zmax)