基于python的scip库使用,从基础模型到复杂模型,从一维变量到二位变量
创始人
2024-02-29 05:48:15

基础知识

创建模型: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 单个变量+简单模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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())

栗子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_iC = 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.0for 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)

不完整栗子 三维变量

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

    # 创建决策变量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 inrange(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]])#三维变量输出

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...