72、Cutting Stock Problem

from pyscipopt import Model, quicksum

def IP(A, B, time_limit):

    m, n = len(A), len(A[0])
    model = Model("IP_CSP")

    #切分方式分布
    X = [model.addVar(vtype="I", name="x[%s]" % j) for j in range(n)]

    #分布和最小
    model.setObjective(quicksum(X[j] for j in range(n)), "minimize")

    # 使用箱子个数限制
    for i in range(m):
        model.addCons(quicksum(A[i][j]*X[j] for j in range(n)) >= B[i])

    #设置求解时间
    model.setRealParam("limits/time", time_limit)

    model.optimize()
    print("\ngap:",model.getGap())

    X1 = [round(model.getVal(X[j])) for j in range(n)]
    return X1

def A_and_B_generate(material, demand):
    #先给大的分,再分小的
    demand.sort(key=lambda x:x[0], reverse=True)
    B = [x[1] for x in demand]
    L = [x[0] for x in demand]

    #制作备选集,需要一般化
    A = []
    for i in range(material//L[0]+1):
        for j in range((material-i*L[0])//L[1]+1):
            A.append([i, j, (material-i*L[0]-j*L[1])//L[2]])

    #转置一下
    A = [[A[i][j] for i in range(len(A))] for j in range(len(A[0]))]
    return A, B

def f(material, demand):
    #构造约束
    A, B = A_and_B_generate(material, demand)

    #求解
    X = IP(A, B, 10000)
    return X

if __name__ == '__main__':
    material = 17
    demand = [[3,25], [5,20], [7,18]]
    X = f(material, demand)
    print(X)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值