耗费两天一夜不眠不休搞定了pycharm调用gurobi,此时我百感交集、喜极而泣、语无伦次、手舞足蹈。为防止以后换电脑或者重装系统后忘了这套骚操作,遂决定写一篇文档把整个过程记录下来。
文档分为三部分:一.安装Anaconda/Miniconda和Pycharm及环境配置;二.调用Gurobi,三.疑难杂症
先显摆一下调用成功的证明。测试代码1:
from gurobipy import *
# 8部电影
# 7个影厅
# 8个时段
I = list(range(8)) # 时段
J = list(range(7)) # 影厅
K = list(range(8)) # 电影
seat_j = [118, 86, 116, 85, 156, 142, 156]
# 一行为一个影厅,一列为一部电影
price_jk = [[60, 60, 65, 60, 65, 90, 60, 65],
[65, 65, 85, 75, 60, 75, 85, 80],
[60, 70, 75, 80, 75, 80, 80, 75],
[65, 65, 80, 75, 80, 75, 75, 80],
[60, 65, 65, 60, 75, 80, 80, 75],
[60, 65, 65, 80, 75, 75, 80, 75],
[60, 60, 75, 80, 75, 70, 60, 75]]
# 一行为一个时段,一列为一部电影
rate_ik = [[0.50, 0.55, 0.45, 0.50, 0.60, 0.46, 0.55, 0.45],
[0.42, 0.43, 0.41, 0.43, 0.45, 0.30, 0.53, 0.36],
[0.58, 0.63, 0.67, 0.64, 0.70, 0.64, 0.54, 0.57],
[0.62, 0.67, 0.70, 0.65, 0.75, 0.64, 0.53, 0.66],
[0.65, 0.65, 0.73, 0.68, 0.75, 0.74, 0.67, 0.72],
[0.66, 0.69, 0.78, 0.78, 0.78, 0.75, 0.74, 0.70],
[0.67, 0.92, 0.87, 0.87, 0.75, 0.59, 0.68, 0.68],
[0.67, 0.92, 0.87, 0.87, 0.75, 0.59, 0.68, 0.68]]
# 计算满座的票房二维列表,lt_all
all_jk = [[0 for col in K] for row in J]
for j in J:
for k in K:
all_jk[j][k] = price_jk[j][k] * seat_j[j]
# 创建模型
m = Model("ass_mov")
# 创建变量.第i个时段在第j个影厅放映第k部电影
x = m.addVars(I, J, K, vtype=GRB.BINARY)
# 更新变量环境
m.update()
# 创建目标函数
m.setObjective(sum(x[i, j, k] * rate_ik[i][k] * all_jk[j][k]
for i in I for j in J for k in K),
GRB.MAXIMIZE)
# 创建约束条件约束条件
# 每部电影至少放映一次
m.addConstrs(sum(x[i,j,k] for i in I for j in J) >= 1 for k in K)
# 每个时段每个影厅只能放映一部电影
m.addConstrs(sum(x[i,j,k] for k in K) == 1 for i in I for j in J)
# 求解规划模型
m.optimize()
# 输出结果
result = [[0 for col in J] for row in I]
solution = m.getAttr('x',x)
# 得到排片矩阵
for k,v in solution.items():
if v == 1:
result[k[0]][k[1]] = k[2] + 1
# 得到最大收益值
max_get = sum(
x[i, j, k].x * rate_ik[i][k] * all_jk[j][k]
for i in I for j in J for k in K
)
# 打印最大收益值,和排片矩阵
print('最大收益为:',max_get)
print('最佳排片方法:')
print('\n影厅j|', J)
print('-'*28)
for idx,l in enumerate(result) :
print(f'时段{idx}|',l)
测试代码1运行结果:
C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\question1.py
Gurobi Optimizer version 10.0.0 build v10.0.0rc2 (win64)
CPU model: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz, instruction set [SSE2|AVX|AVX2]
Thread count: 2 physical cores, 4 logical processors, using up to 4 threads
Optimize a model with 64 rows, 448 columns and 896 nonzeros
Model fingerprint: 0xae490d04
Variable types: 0 continuous, 448 integer (448 binary)
Coefficient statistics:
Matrix range [1e+00, 1e+00]
Objective range [2e+03, 1e+04]
Bounds range [1e+00, 1e+00]
RHS range [1e+00, 1e+00]
Found heuristic solution: objective 325324.25000
Presolve time: 0.00s
Presolved: 64 rows, 448 columns, 896 nonzeros
Variable types: 0 continuous, 448 integer (448 binary)
Found heuristic solution: objective 381565.75000
Root relaxation: objective 3.865421e+05, 65 iterations, 0.00 seconds (0.00 work units)
Nodes | Current Node | Objective Bounds | Work
Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time
* 0 0 0 386542.15000 386542.150 0.00% - 0s
Explored 1 nodes (65 simplex iterations) in 0.01 seconds (0.00 work units)
Thread count was 4 (of 4 available processors)
Solution count 3: 386542 381566 325324
Optimal solution found (tolerance 1.00e-04)
Best objective 3.865421500000e+05, best bound 3.865421500000e+05, gap 0.0000%
最大收益为: 386542.14999999997
最佳排片方法:
影厅j| [0, 1, 2, 3, 4, 5, 6]
----------------------------
时段0| [6, 7, 5, 5, 5, 5, 5]
时段1| [1, 7, 7, 7, 7, 7, 4]
时段2| [6, 3, 5, 5, 5, 5, 5]
时段3| [6, 3, 5, 5, 5, 5, 5]
时段4| [6, 3, 6, 8, 6, 5, 5]
时段5| [6, 3, 4, 3, 6, 4, 4]
时段6| [3, 3, 4, 3, 2, 4, 4]
时段7| [3, 3, 4, 3, 2, 4, 4]
进程已结束,退出代码0
测试代码2:
import gurobipy as gp
from gurobipy import GRB
try:
# Create a new model
m = gp.Model("mip1")
# Create variables
x = m.addVar(vtype=GRB.BINARY, name="x")
y = m.addVar(vtype=GRB.BINARY, name="y")
z = m.addVar(vtype=GRB.BINARY, name="z")
# Set objective
m.setObjective(x + y + 2 * z, GRB.MAXIMIZE)
# Add constraint: x + 2 y + 3 z <= 4
m.addConstr(x + 2 * y + 3 * z <= 4, "c0")
# Add constraint: x + y >= 1
m.addConstr(x + y >= 1, "c1")
m.optimize()
测试代码2运行结果:
C:\Users\xzr\.conda\envs\py310gurobi\python.exe F:\PycharmProjects\workspace\untitled\jizulunban\question2.py
Gurobi Optimizer version 10.0.0 build v10.0.0rc2 (win64)
CPU model: Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz, instruction set [SSE2|AVX|AVX2]
Thread count: 2 physical cores, 4 logical processors, using up to 4 threads
Optimize a model with 2 rows, 3 columns and 5 nonzeros
Model fingerprint: 0x98886187
Variable types: 0 continuous, 3 integer (3 binary)
Coefficient statistics:
Matrix range [1e+00, 3e+00]
Objective range [1e+00, 2e+00]
Bounds range [1e+00, 1e+00]
RHS range [1e+00, 4e+00]
Found heuristic solution: objective 2.0000000
Presolve removed 2 rows and 3 columns
Presolve time: 0.00s
Presolve: All rows and columns removed
Explored 0 nodes (0 simplex iterations) in 0.01 seconds (0.00 work units)
Thread count was 1 (of 4 available processors)
Solution count 2: 3 2
Optimal solution found (tolerance 1.00e-04)
Best objective 3.000000000000e+00, best bound 3.000000000000e+00, gap 0.0000%
x 1
Obj: 3
y 0
Obj: 3
z 1
Obj: 3
进程已结束,退出代码0
————————————————————正文分割线—————————————————
1.1 软件介绍
什么是Anaconda?
Anaconda是免费易于安装的包管理器、环境管理器和 Python 发行版,它里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,它把很多常用的不常用的库装好了,并且在安装一个库时会询问是否安装与该库相关联的库,它将库之间的关系理的非常清楚,为用户提供极大的便利。
什么是Miniconda?
Miniconda是一款小巧的python环境管理工具,安装包大约只有50M多点,其安装程序中只包含conda软件包管理器和Python,用法和Anaconda一样。2021年我曾下载Anaconda(受人忽悠)用来做项目,后来发现我那点python代码完全没必要用三十多g的Anaconda,miniconda足够轻量好用。
由于只使用python,所以我只会用到Anaconda Powershell Prompt/Anaconda Prompt来安装一些包。Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。常用的conda指令有:创建新环境:conda create -n 环境名 python=x.x;安装包:conda install 包。
conda命令说明_conda config命令_俗世苍鹰的博客-程序员秘密 - 程序员秘密
比如安装xlwt包:
什么是Pycharm?
PyCharm是Python IDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时,提高其开发效率的工具。比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。我最喜欢代码提示功能:
1.2 软件安装
Anaconda:
Anaconda | Anaconda Distribution
Index of /anaconda/archive/ | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror
Miniconda:
Miniconda — conda documentation
Anaconda/Miniconda在官网或镜像下载均可,如果电脑是64位,就选64位的版本。安装时选择“recommended”(推荐)的选项,一直同意,一直下一步即可。自定义位置那里我选择了F盘,因为我C盘快满了。
Pycharm:
Download PyCharm: Python IDE for Professional Developers by JetBrains
Pycharm一定下载community(社区)版,因为专业版付费。自定义位置最好也别在C盘,我的仍在F盘。安装选项能勾的都勾上,folder name选JetBrains就ok。
Pycharm安装完毕,点击New Project,我给新项目取名为“workspace”(瞎起的),右击项目新建python文件,就可以写代码啦。我将python文件设置在F:\PycharmProjects\workspace下面。
1.3 设置环境变量
当你要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前所在目录下面寻找次程序外,还会到 path 中指定的路径去找,所以设置环境变量是必须项。
Anaconda/Miniconda主要有三个环境待配置,以我的Miniconda为例:
1.Miniconda的安装路径:F:\miniconda3
2.Miniconda的安装路径\Scripts:F:\miniconda3\Scripts
3.另一个不太懂的路径:F:\miniconda3\Library\bin
上述三个环境变量都是通过:此电脑—右键—高级系统设置—环境变量—系统变量—双击path—新建三次变量—点三次确定,over。
1.4 创建环境
Anaconda/Miniconda的作用之一就是环境管理器,我们可以新建很多个环境,在不同的环境下用不同版本的python和所需的包。。
首先,在Anaconda Powershell Prompt创建新环境:conda create -n py310gurobi python=3.10,意思是创建名为“py310gurobi”基于python3.10的环境,该环境在创建的同时也会下载python3.10。环境的位置是(默认)C:\Users\xzr\.conda\envs\py310gurobi,Python也在该位置(参见下图解释器路径)。使用conda install 下载包时,包的位置也是该环境下(默认)C:\Users\xzr\.conda\envs\py310gurobi\Lib\site-packages。.conda文件夹的“."表示该文件夹可隐藏,有的人有,有的人没有,问题不大。
然后,在Anaconda Powershell Prompt激活环境:conda activate py310gurobi。(base)是基本环境,不过我更倾向于另建环境,如图。
最后,在Pycharm的文件—设置—项目—Python解释器,选择刚才激活的环境中的解释器(也就是该环境下的Python.exe),就ok啦。
我会用到的包有:gurobipy、numpy、pandas、datetime、xlwt等,如果“conda install 包”方法下不了,我就会试试“pip install 包”的方法。区别是conda install可以将包放在conda环境中,而pip install将包放在了python文件夹中(与miniconda不搭嘎),看看路径就会一目了然。
用conda install下载的包:C:\Users\xzr\.conda\envs\py310gurobi\Lib\site-packages
用pip install下载的包(非conda环境):C:\Users\xzr\AppData\Roaming\Python\Python310\site-packages(AppData默认建了名字为Python的文件夹,专门来装pip install下载的包)
所以,当你换了个conda环境后,在原先环境下用conda install下载的包,新环境是没有的,只能重新conda install了。(在不同环境下共用包的方法还有待探索)最好是先激活环境conda activate py310gurobi,然后再pip install 包,这样下载的包就在conda环境中了。
Gurobi的许可申请
学习资料-Gurobi 中国
Gurobi中国关于“如何在 Python 环境中安装 Gurobi 10.0 版本”有一个简略的pdf说明书,但该文档无法在官网找到了,遂通过截图贴出。
虽然我安装了Gurobi软件,但是我采用的是第一种方法(gurobipy),因为我认为pip install gurobipy更方便我使用Pycharm和使用其他包。第三种方法(conda install gurobi)我也成功了,先激活环境,输入conda config --add channels http://conda.anaconda.org/gurobi,再输入conda install gurobi。第三种与第一种的区别有待观察。(突然发现不下载Gurobi软件也行,pip、conda就能搞定)
(1)pip install 一片红
或者 no matching distribution found for XXX
或者 Read timed out
pip 安装包关于国外源出错,试试在pip install xxx后面加上 -i 国内源。
pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple/
国内四大源:
阿里云: -i https://mirrors.aliyun.com/pypi/simple/
豆瓣(douban) :-i https://pypi.douban.com/simple/
清华大学: -i https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学: -i https://pypi.mirrors.ustc.edu.cn/simple/
还可以永久切换到国内源:
以jieba包为例。仅打出pip install jieba时,安装失败
打出pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple/后,jieba包安装成功
(2)CMD换盘
试试在>后面输入“cd d/ 你要去新的路径”
(3)报错:'conda' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
方法:查看环境变量、添加环境变量
首先,打开Anaconda Prompt,输入path,即可查看本电脑的环境变量,建议使用“以管理员身份运行”Anaconda Prompt,正常打开有可能输入命令会因为没有权限而不执行;然后,添加环境变量,见本文1.3,此处不再赘述;最后,Anaconda Prompt输入conda list查看有无添加成功。
(4)报错:“you will need to adjust your conda configuration to proceed”
方法:Windows+R,输入cmd,输入 conda config --remove-key channels
原因就是你当前设定的镜像源已经不支持该包了,所以需要删除,再重新创建环境(5)(因更改文件夹造成)anaconda prompt 提示系统找不到指定的路径 The system cannot find the path specified
(5)更改C:\Users\下的用户名
安装软件时,由于文件夹名称为中文,常常会遇到意想不到的错误,但是却不知道哪里出错了。我之前的用户名是我的中文名,后来改成英文字母后,就没问题了。采取的方法是这个
更改C盘用户目录下的用户名(亲测有效)_小小的香辛料的博客-CSDN博客_如何更改c盘用户文件夹里的用户名
(6)版本不匹配
卸载,然后下载最新版软件
(7)如何更改文件后缀名
点击勾选框,然后重命名
(8)(因更改文件夹造成)anaconda prompt 提示系统找不到指定的路径 The system cannot find the path specified
右键菜单下的快捷方式,打开目标所在位置,右键点击属性
可以看到目标是:%windir%\system32\cmd.exe "/K" "F:\miniconda3\Scripts\activate.bat" "F:\miniconda3"
将后两个双引号的内容改成更新后的路径,别忘了检查环境变量是不是也错了
(9)Pycharm无法安装Python打包工具
conda install pyinstaller