• 基于python的scip库使用,从基础模型到复杂模型,从一维变量到二位变量


    基础知识

    创建模型:model=Model(name)#name是模型名字

    创建变量:model.addVar(vtype,name,lb=0,ub=1)#vtype是变量类型,有I(Integer)表示离散变量,B(Binary )表示0/1变量

    创建目标函数: model.setObjective(coeffs,sense)#前者是目标函数,后者是"minisize"或者"maxsize"

    创建约束条件:model.addCons(cons)#cons是约束条件

    求解:model.optimize()#求解
    model.getBestSol()#得到决策变量数值
    model.getObjVal()#得到目标函数值

    导入库

    from pyscipopt import Model,quicksum
    
    • 1

    栗子1 单个变量+简单模型

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TSukY3vE-1669722749884)(https://secure2.wostatic.cn/static/n5t2QFHMdMXKgezGxvNVEB/image.png?auth_key=1669722684-oHoHBNTW9ibh62F1uuUSSm-0-1e6358b79e80672ac5933eafbe7d7ee6)]

    def prumen1():
        #创建模型
        model=Model("remen")
    
        #创建变量
        x=model.addVar(vtype="I",name="x",lb=0)
        y = model.addVar(vtype="I", name="y", lb=0)
        z = model.addVar(vtype="I", name="z", lb=0)
        w = model.addVar(vtype="I", name="w", lb=0)
    
        #创建目标函数
        model.setObjective(5 * x + 6 * y + 7 * z + 8 * w , "minimize")
    
        #创建约束条件
        model.addCons(x + y + z + w == 100)
        model.addCons(5 * x + 4 * y + 5 * z + 6 * w >= 530)
        model.addCons(2 * x + y + z + 2 * w <= 160)
    
        #求解
        model.optimize()
        sol = model.getBestSol()
    
        print("x: {}".format(sol[x]))
        print("y: {}".format(sol[y]))
        print("z: {}".format(sol[z]))
        print("w: {}".format(sol[w]))
        print(model.getObjVal())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    栗子2 一维变量+二维变量+复杂模型

    模型感谢Cathy友情提供
    在这里插入图片描述

    def prumen2():
        n = 200  # residential areas -变量i居民区数量
        m = 40  # shelters-变量j庇护所数量
        areas = range(n)
        shelters = range(m)
    
        path = 'Pb2_areas.csv'
        areas_matrix = np.genfromtxt(path, dtype=float, delimiter=',', encoding='utf-8-sig')
        path = 'Pb2_shelters.csv'
        shelters_matrix = np.genfromtxt(path, dtype=float, delimiter=',', encoding='utf-8-sig')
    
        R = areas_matrix[:, 2]  # 第三列的居民区居民数量-变量R_i
        C = shelters_matrix[:, 2]  # 第三列的庇护所能庇护的容量-变量C_j
    
        # 计算居民到庇护所的距离
        D = np.zeros((n, m))  # -变量D_ij距离
        for i in areas:
            for j in shelters:
                D[i, j] = abs(areas_matrix[i, 0] - shelters_matrix[j, 0]) + abs(areas_matrix[i, 1] - shelters_matrix[j, 1])
    
        # 定义问题
        model=Model("Cathy_exp")
    
        # 定义变量
       for i in range(n):
            x = model.addVar(vtype="B", name="x")#一维变量
        for i in range(n):
            for j in range(m):
                y_ij=model.addVar(vtype="B", name="y")#二维变量
    
        # 目标函数
        ansa=0.0
        for j in range(m):
            for i in range(n):
                ansa+=(D[i, j] * y_ij[i,j])
        model.setObjective(ansa, "minimize")
    
        # 约束条件
        model.addCons(quicksum(x[j] for j in shelters)==10)
        for i in areas:
            model.addCons(quicksum(y_ij[i,j] for j in shelters)==1)
        for j in shelters:
            model.addCons(quicksum(R[i]*y_ij[i,j] for i in areas)<=C[j]*x[j])
    
    
        model.optimize()
        print(model.getObjVal())
        # print(m)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    不完整栗子 三维变量

    这个的完整代码就不透露了~~~

        # 创建决策变量
        x, y, h = {}, {}, {}
        for i in range(n):
            for j in range(m):
                x[i, j] = model.addVar(vtype="B", name="x(%s,%s)" % (i, j)) #二维变量定义
        y = [[[model.addVar(vtype="I", name="y(%s,%s,%s)" % (i, j, k), lb=0) for k in range(t)] for j in range(m)] for i in
             range(n)] #三维变量定义
    
         #输出
         sol = model.getBestSol()      
         for i in range(n):
            for j in range(m):
                print(x[i, j], "=", sol[x[i, j]])#二维变量输出
                for k in range(t):
                    print(y[i, j, k], "=", sol[y[i, j, k]])#三维变量输出
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    Rt-Thread 移植3--临界段保护(KF32)
    oracle:记一次磁盘头故障处理
    【计算机视觉 | 语义分割】语义分割常用数据集及其介绍(四)
    建筑模板常见的问题有哪些?
    【FAQ】音频编辑服务在调用删除音频时只是删除了声音时长未变,如何实现删除时不留有空白时长
    按照规则来,为什么还是提图片必须是一条字符串啊!
    libtorch之cv::Mat和Tensor的互转
    目标分割技术-语义分割总览
    react context原理
    Flutter 中使用 extension 使项目更具可读性和效率 01
  • 原文地址:https://blog.csdn.net/weixin_46967285/article/details/128104143