12.23代码复现

12.23代码复现_第1张图片

Gurobi与Python的交互是非常简单和方便的。Gurobi提供了一个名为"gurobipy"的Python模块,该模块允许您在Python中使用Gurobi的功能来建模和求解优化问题。

下面是一些使用Gurobi与Python进行交互的基本步骤:

1. 安装Gurobi和Python模块:首先,您需要安装Gurobi优化软件和相应的Python接口模块。您可以从Gurobi官方网站下载并安装Gurobi软件。然后,使用pip或conda等工具安装gurobipy模块,如:`pip install gurobipy`。

2. 导入gurobipy模块:在您的Python代码中,导入gurobipy模块,以便能够使用Gurobi相关功能。通常,您可以使用以下导入语句完成导入:
```python
import gurobipy as gp
```

3. 创建模型对象:使用`Model()`函数创建一个优化模型对象。例如:
```python
model = gp.Model()
```

4. 定义变量:使用`addVar()`函数添加变量到模型中,并指定变量的属性,例如变量类型、上下界等。例如:
```python
# 添加一个连续变量x,取值范围为[0, 1]
x = model.addVar(lb=0, ub=1, vtype=gp.GRB.CONTINUOUS, name="x")
```

5. 定义目标函数和约束:使用模型对象的方法来定义目标函数和约束条件。例如:
```python
# 设置目标函数为最大化 x + y
model.setObjective(x + y, sense=gp.GRB.MAXIMIZE)

# 添加一个约束条件:x + 2y <= 3
model.addConstr(x + 2*y <= 3, name="c1")
```

6. 求解优化问题:使用`optimize()`方法求解优化问题。例如:
```python
model.optimize()
```

7. 获取结果:可以通过变量对象的属性来访问最优解和其他有关结果的信息。例如:
```python
# 获取变量x的最优值
print('Optimal value of x:', x.x)

# 获取目标函数的最优值
print('Optimal objective value:', model.objVal)
```

这些是使用Gurobi和Python进行交互的基本步骤。您可以根据您的具体问题和需求,进一步探索Gurobi模型和API的更多功能和选项。Gurobi官方网站和文档提供了更详细的信息和示例代码,可供参考。12.23代码复现_第2张图片

可恶,怎么不兼容我的MATLAB2017

YALMIP("Yet Another LMI Parser")是一个用于建模和解决数学优化问题的MATLAB工具箱。它提供了一个简单易用的界面,允许用户通过定义约束和目标函数来创建线性和非线性优化问题。YALMIP支持线性矩阵不等式(LMI)约束、线性规划、二次规划、半定规划等多种优化问题的建模和求解。

YALMIP的主要特点包括:

1. 简单易用的语法:YALMIP使用简洁的MATLAB语法,使用户能够轻松地定义优化问题,而无需深入了解底层的优化算法。

2. 支持多种优化问题:YALMIP能够处理线性和非线性优化问题,包括线性矩阵不等式(LMI)约束、线性规划、二次规划、半定规划等多种类型的优化问题。

3. 内置优化求解器接口:YALMIP提供与众多优化求解器的接口,包括Gurobi、MOSEK、CPLEX、SDPT3等。用户可以根据需求选择合适的求解器。

4. 自动化问题转化和求解:YALMIP具有自动化的问题转化和求解功能,使用户可以直接关注问题的建模,而不需要手动对问题进行转化。

5. 高效的求解性能:YALMIP与多种优化求解器无缝集成,能够利用这些求解器的高性能来求解大规模、复杂的优化问题。

YALMIP广泛应用于学术研究、工业应用和教学等领域,它提供了一种方便快捷的方式来建模和求解数学优化问题,并为用户提供了灵活性和可扩展性。

CPLEX是一个高性能的商业数学优化软件套件,用于解决各种复杂的优化问题。它由IBM开发,被广泛应用于学术研究、工业应用和商业决策等领域。

CPLEX可以用来求解线性规划、整数规划、混合整数规划、二次规划、混合整数二次规划、约束规划等多种类型的优化问题。它采用了先进的优化算法和技术,具有高效、可靠和可扩展的求解性能。

CPLEX的一些主要特点包括:

1. 高性能求解器:CPLEX具有先进的线性和非线性优化求解器,能够处理大规模、复杂的优化问题,并在短时间内给出最优解或近似最优解。

2. 并行和分布式求解:CPLEX支持并行和分布式求解,可以利用多核处理器、多台计算机或集群来加速求解过程。

3. 多种编程接口:CPLEX提供了多种编程接口,包括C、C++、Java和Python等,使用户能够使用自己熟悉的编程语言来与CPLEX进行交互。

4. 丰富的建模与分析功能:CPLEX提供了强大的建模工具,用户可以灵活地定义数学优化问题的约束条件、目标函数和变量,并进行敏感性分析和结果解释等操作。

5. 自定义约束和目标函数:CPLEX允许用户定义自定义约束和目标函数,从而能够解决各种个性化的优化问题。

CPLEX在多个领域中得到了广泛应用,如供应链管理、物流规划、生产调度、金融风险管理、能源调度等。它被认为是一款功能强大、效率高的数学优化工具,能够帮助用户在复杂决策问题中获得最优解或近似最优解。

CPLEX和Gurobi都是高性能的商业数学优化软件套件,用于解决各种复杂的优化问题。它们在功能和性能方面都非常强大,但存在一些区别。

下面是CPLEX和Gurobi的一些区别点:

1. 供应商和支持:CPLEX由IBM开发和提供支持,而Gurobi由Gurobi Optimization公司开发和提供支持。虽然两者都是商业软件,但供应商和支持方式可能会有所不同。

2. 特定优化类型:CPLEX和Gurobi都支持线性规划、整数规划和混合整数规划等常见类型的优化问题。然而,Gurobi在混合整数二次规划方面具有一些额外的优势,而CPLEX在某些特定领域(如约束规划和非凸优化)具有更多的功能。

3. 性能和求解算法:CPLEX和Gurobi都具有高性能的求解器,但在特定问题和数据集上它们的性能可能有所不同。因此,在实际应用中,可能需要根据问题特点选择合适的求解器。两者都使用了大量的优化算法和技术来加速求解过程,但具体的算法和实现细节是商业机密,无法直接比较。

4. 接口和可扩展性:CPLEX和Gurobi都提供了多种编程接口,如C、C++、Java和Python等,以便用户能够使用自己熟悉的编程语言来与优化器进行交互。它们都具有良好的可扩展性,可以处理大规模和复杂的优化问题。

5. 许可方式和定价:CPLEX和Gurobi的许可方式和定价可能有所不同。这些信息是根据供应商公开的政策而定,因此可能会有差异。用户可以联系相应的供应商来了解具体的许可方式和定价结构。

总的来说,CPLEX和Gurobi都是非常强大的数学优化软件,对于解决复杂的优化问题提供了高效并且可靠的解决方案。在选择使用哪一个软件时,可以根据具体的问题需求、性能要求、支持和定价等因素进行综合考虑。

Gurobi可以通过Python API与Python进行交互。您可以使用以下步骤来与Python进行交互:

1. 安装Gurobi Python API:首先,您需要安装Gurobi Python API。您可以在Gurobi官方网站上下载Gurobi Optimizer,并按照安装指南进行安装。

2. 导入Gurobi模块:在Python代码中,您需要导入Gurobi模块,以便使用Gurobi的优化功能。您可以使用以下代码导入Gurobi模块:

```python
import gurobipy
```

3. 创建优化模型:您可以使用Gurobi模块中的函数来创建优化模型。例如,您可以使用以下代码创建一个线性规划模型:

```python
model = gurobipy.Model("lp")
```

4. 定义变量和约束:您可以使用Gurobi模块中的函数来定义变量和约束。例如,您可以使用以下代码定义一个变量和一个约束:

```python
x = model.addVar(vtype=gurobipy.GRB.CONTINUOUS, name="x")
model.addConstr(x <= 10, "c1")
```

5. 设置优化目标和求解:您可以使用Gurobi模块中的函数来设置优化目标并进行求解。例如,您可以使用以下代码设置优化目标并求解模型:

```python
model.setObjective(x + 2*y, gurobipy.GRB.MAXIMIZE)
model.optimize()
```

通过以上步骤,您可以使用Gurobi Python API与Python进行交互,并利用Gurobi的优化功能来解决各种优化问题。   

12.23代码复现_第3张图片12.23代码复现_第4张图片 

12.23代码复现_第5张图片 12.23代码复现_第6张图片

参考博客

如何在python中安装Gurobi(详细教程)_gurobi python-CSDN博客 

GUROBI的基础使用方法:Python中安装Gurobi:配置与使用_gurobi python安装-CSDN博客文章浏览阅读3.5k次,点赞4次,收藏21次。Python中安装Gurobi:配置记录与使用方法_gurobi python安装https://blog.csdn.net/hhhhhabcdf/article/details/131885517?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-2-131885517-blog-70342275.235^v39^pc_relevant_3m_sort_dl_base1&spm=1001.2101.3001.4242.2&utm_relevant_index=5

12.23代码复现_第7张图片妈呀,头上吓得出汗了

12.23代码复现_第8张图片终于好了,可恶

12.23代码复现_第9张图片12.23代码复现_第10张图片12.23代码复现_第11张图片12.23代码复现_第12张图片

12.23代码复现_第13张图片12.23代码复现_第14张图片12.23代码复现_第15张图片12.23代码复现_第16张图片12.23代码复现_第17张图片终于好了

12.23代码复现_第18张图片12.23代码复现_第19张图片12.23代码复现_第20张图片 12.23代码复现_第21张图片12.23代码复现_第22张图片

一次不行,就多来几次

08-线性回归

课件是d2l-zh-pytorch-slide下schapter_linear-networks里的linear-regression-scratch.ipynb 

def synthetic_data(w, b, num_examples):  #@save
    """生成y=Xw+b+噪声"""
    X = torch.normal(0, 1, (num_examples, len(w)))
    y = torch.matmul(X, w) + b
    y += torch.normal(0, 0.01, y.shape)
    return X, y.reshape((-1, 1))
    """生成y=Xw+b+噪声"""
    X = torch.normal(0, 1, (num_examples, len(w)))
    #
    y = torch.matmul(X, w) + b
    y += torch.normal(0, 0.01, y.shape)
    return X, y.reshape((-1, 1))

12.23代码复现_第23张图片12.23代码复现_第24张图片12.23代码复现_第25张图片

def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    # 这些样本是随机读取的,没有特定的顺序
    random.shuffle(indices)
    for i in range(0, num_examples, batch_size):
        batch_indices = torch.tensor(
            indices[i: min(i + batch_size, num_examples)])
        yield features[batch_indices], labels[batch_indices]

 12.23代码复现_第26张图片

12.23代码复现_第27张图片 

12.23代码复现_第28张图片12.23代码复现_第29张图片 

for epoch in range(num_epochs):
    for X, y in data_iter(batch_size, features, labels):
        l = loss(net(X, w, b), y)  # X和y的小批量损失
        # 因为l形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,
        # 并以此计算关于[w,b]的梯度
        l.sum().backward()
        sgd([w, b], lr, batch_size)  # 使用参数的梯度更新参数
    with torch.no_grad():
        train_l = loss(net(features, w, b), labels)
        print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')

12.23代码复现_第30张图片 

完成!!!

12.23代码复现_第31张图片

def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

12.23代码复现_第32张图片12.23代码复现_第33张图片12.23代码复现_第34张图片 

12.23代码复现_第35张图片 

完成!!!

你可能感兴趣的:(python)