1. 软件install
1.1 Yalmip
Yalmip是一个开源的MATLAB库,其作用简单来说是一个”翻译官“,用于统一不同求解器和不同问题的建模方式。由于一台电脑上可能会安装有多种求解器,另外求解的问题也有很多种类(例如LP,ILP,MILP,QP,MIQP等等),不同的问题需要在不同的求解器上进行求解,而不同的求解器的语法都不同,这就带来了较大的学习成本。Yalmip就是针对该问题的一个非常强大的工具,可以用非常简单通用的语法来对你的问题进行建模。随后,Yalmip会自动识别你的模型属于的类别(比如到底是MILP还是QP等等),然后根据模型的类别选择最合适的求解器,并将你的模型自动转换成该求解器所能识别的格式进行求解。因此,有了Yalmip后,你所需要做的,就是建模、选择求解器(或者让Yalmip自动帮你选),然后提取求解结果即可。
Yalmip官网下载地址:
https://link.zhihu.com/?target=https%3A//yalmip.github.io/download/
将Yalmip-master 解压后加入到MATLAB检索路径(可自定义,最后在MATLAB安装路径下)
1.2 Gurobi v10.0.1 In MATLAB
Gurobi是一款功能强大且高效的数学优化工具,广泛应用于线性规划(Linear Programming, LP)、混合整数规划(Mixed Integer Programming, MIP)等领域。Gurobi因其出色的性能、易用性和强大的功能集而在学术界及工业界享有盛誉。
Gurobi优化器特点 :
1. 高效求解能力:Gurobi以其快速求解线性和混合整数规划问题而闻名,能够处理大规模问题并在合理的时间内提供高质量解决方案。
2. 多语言支持:Gurobi提供了多种编程语言接口,包括C、C++、Java、.NET(C#)和Python等,方便不同背景的开发者使用。
3. 易于安装和配置:Gurobi提供了详尽的文档和支持材料,帮助用户轻松完成安装过程,并通过示例代码快速上手。
4. 高级功能:除了基本的优化功能外,Gurobi还支持复杂的约束条件和目标函数定制,满足特定应用需求。
对于**版Gurobi,解压后运行安装"Gurobi-10.0.1-win64.msi", 然后运行注册机,出现以下提示安装成功。
完成Gurobi的注册安装和激活后,在MATLAB中,将gurobi的路径添加至matlab即可完成配置。目录为Gurobi根目录\win64\matlab
1.3 Gurobi In Pycharm
Gurobi在Pycharm中的配置参见一下博客
如何在python中安装Gurobi(详细教程)_Alano_bei-GitCode 开源社区
2.代码测试
2.1 MATLAB 2022b
% Written by @MMiL
% 2024.08.13
clc;clear;
C = [3 8 2 10;9 7 5 3;1 5 4 3;4 5 7 9];
% 定义变量
x = binvar(4, 4, 'full');
% 定义约束条件
cons = [sum(x, 1) == 1; sum(x, 2) == 1];
% 定义目标函数
cost = x .* C;
Obj = sum(cost(:));
% 进行优化
ops = sdpsettings('solver', 'gurobi');
result = optimize(cons, Obj, ops);
% 输出结果
a=value(x);
value(Obj)
2.2 Pycharm
# Written by @MMiL
# 2024.08.13
from gurobipy import *
import random
# 数据
N = 3
random.seed(1)
T = {(i, j): random.randint(0, 100) for i in range(N) for j in range(N)}
C = {(i, j): random.randint(0, 100) for i in range(N) for j in range(N)}
# 模型
model = Model('assignment')
# 添加变量
x = model.addVars([(i, j) for i in range(N) for j in range(N)], vtype='B', name='x')
# 目标函数
model.setObjectiveN(x.prod(T), index=0, weight=0.1, name='Time Objective')
model.setObjectiveN(x.prod(C), index=1, weight=0.5, name='Cost Objective')
# 约束
model.addConstrs(((quicksum(x[i, j] for i in range(N)) == 1) for j in range(N)), name='Job Constraingt')
model.addConstrs(((quicksum(x[i, j] for j in range(N)) == 1) for i in range(N)), name='Worker Constraingt')
# 求解
model.Params.OutputFlag = 0
model.optimize()
# 输出
for i in range(model.NumObj):
model.setParam('ObjNumber', i)
print('Obj{}:'.format(i), model.objVal)
for i in range(N):
for j in range(N):
if x[i, j].x > 0:
print('job {}-->worker {}'.format(j + 1, i + 1))
model.write('assignment.lp')