1、没有办法,要用到optimization solver 求解, 还好gurobi的例子 还是不错的,会有pdf说明。但是,每隔一段时间就会忘记,因此做个记录。
2、gurobi的优势,是给出接口,用其他语言对接,这里 主要用两种 matlab 和 python 语言,先说一下matlab的用法。
3、有两种定义方式: 直接定义,或者根据运输问题的定义。因为运输问题的比较特殊,因此有另外一种形式的定义。先看一般的直接定义,主要是把model的相关属性定义好,下面整理一下。
4、模型名称 model.modelname = ‘facility’; 自己设置一个名称,保存的时候,就知道是什么模型了。
5、变量的类型 model.vtype ,如果都是一种类型,直接设置 model.vtype = ‘B’; 如果是不同的类型,那么就要分开设置,如 model.vtype = [repmat(‘B’, nPlants, 1); repmat(‘C’, nPlants * nWarehouses, 1)];
6、变量名 model.varnames ,可以直接写出来 ,如 model.varnames = {‘x’; ‘y’; ‘z’} 定义了 3个变量。如果是运输问题的话,那么定义的变量 是 trans1,1 trans1,2 trans2,1 trans2,2 这种形式, 可以 用如下的方式定义:
for p = 1:nPlants
model.varnames{p} = sprintf(‘Open%d’, p);
end
for w = 1:nWarehouses
for p = 1:nPlants
v = flowidx(w, p); % flowidx = @(w, p) nPlants * w + p;
model.varnames{v} = sprintf(‘Trans%d,%d’, w, p);
end
end
上面的这段代码,要好好领悟,因为可以转变成你的代码。变量名有先后顺序的,因此顺序很重要(在运输问题中)
这段需要锻炼一下,保留代码,留着以后用。
6、约束名称 model.constrnames,和变量名称一样的方式,先不详细说明。
7、系数矩阵的输入,包括A, rhs 和 obj。
系数矩阵的输入,matlab采用的稀疏矩阵,用的是sparse(必须要用这种方式),这样节省内存空间(0元素比较多的时候)。可以采用手动输入,或者在运输问题(有规律的)的时候,循环输入。不管采用哪种方式,心中的那个A矩阵一定要清楚,手动输入的话,也可以采用从excel导入的方式。
注意:obj的是纵向的向量,obj是横向的向量。
8、保存模型 gurobi_write(model, ‘mymip.lp’);
9、其他的设置。 包括约束的方向 model.sense,大于,小于 或者 等于 ; 目标函数的 min 或者max model.modelsense
10、设置参数 params ,然后运行 result = gurobi(model, params);,这个东西只能靠积累啊,用的多的就经常用,控制结果
11、保存输出 。 将结果放在result里面,一般关联两个主要的属性 x和objval ,然后 看怎么把这结果放到txt里面,或者excel里面去。
结束。。。。。。