0-1型整数线性规划--隐枚举法

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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值