如何基于Miniconda使用Pycharm调用Gurobi

耗费两天一夜不眠不休搞定了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

————————————————————正文分割线—————————————————

一.安装Anaconda/Miniconda和pycharm及环境配置

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包

如何基于Miniconda使用Pycharm调用Gurobi_第1张图片如何基于Miniconda使用Pycharm调用Gurobi_第2张图片

什么是Pycharm?

PyCharm是Python IDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时,提高其开发效率的工具。​比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。我最喜欢代码提示功能:

如何基于Miniconda使用Pycharm调用Gurobi_第3张图片

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。

如何基于Miniconda使用Pycharm调用Gurobi_第4张图片

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。

如何基于Miniconda使用Pycharm调用Gurobi_第5张图片

 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)是基本环境,不过我更倾向于另建环境,如图。

如何基于Miniconda使用Pycharm调用Gurobi_第6张图片如何基于Miniconda使用Pycharm调用Gurobi_第7张图片

 最后,在Pycharm的文件—设置—项目—Python解释器,选择刚才激活的环境中的解释器(也就是该环境下的Python.exe),就ok啦。

如何基于Miniconda使用Pycharm调用Gurobi_第8张图片

 我会用到的包有: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 中国

Gurobi中国关于“如何在 Python 环境中安装 Gurobi 10.0 版本”有一个简略的pdf说明书,但该文档无法在官网找到了,遂通过截图贴出。

如何基于Miniconda使用Pycharm调用Gurobi_第9张图片

如何基于Miniconda使用Pycharm调用Gurobi_第10张图片

如何基于Miniconda使用Pycharm调用Gurobi_第11张图片

如何基于Miniconda使用Pycharm调用Gurobi_第12张图片

如何基于Miniconda使用Pycharm调用Gurobi_第13张图片  

 如何基于Miniconda使用Pycharm调用Gurobi_第14张图片

如何基于Miniconda使用Pycharm调用Gurobi_第15张图片

虽然我安装了Gurobi软件,但是我采用的是第一种方法(gurobipy),因为我认为pip install gurobipy更方便我使用Pycharm和使用其他包。第三种方法(conda install gurobi)我也成功了,先激活环境,输入conda config --add channels http://conda.anaconda.org/gurobi,再输入conda install gurobi。第三种与第一种的区别有待观察。(突然发现不下载Gurobi软件也行,pip、conda就能搞定)

如何基于Miniconda使用Pycharm调用Gurobi_第16张图片

 三. 疑难杂症

 (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/

还可以永久切换到国内源:

如何基于Miniconda使用Pycharm调用Gurobi_第17张图片

以jieba包为例。仅打出pip install jieba时,安装失败

如何基于Miniconda使用Pycharm调用Gurobi_第18张图片

打出pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple/后,jieba包安装成功

如何基于Miniconda使用Pycharm调用Gurobi_第19张图片

  (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)如何更改文件后缀名

如何基于Miniconda使用Pycharm调用Gurobi_第20张图片

 点击勾选框,然后重命名

(8)(因更改文件夹造成)anaconda prompt 提示系统找不到指定的路径 The system cannot find the path specified

右键菜单下的快捷方式,打开目标所在位置,右键点击属性

如何基于Miniconda使用Pycharm调用Gurobi_第21张图片

 如何基于Miniconda使用Pycharm调用Gurobi_第22张图片

 可以看到目标是:%windir%\system32\cmd.exe "/K" "F:\miniconda3\Scripts\activate.bat" "F:\miniconda3"

将后两个双引号的内容改成更新后的路径,别忘了检查环境变量是不是也错了

(9)Pycharm无法安装Python打包工具

conda install pyinstaller

你可能感兴趣的:(pycharm,python,ide)