主要内容

为优化变量命名的索引

创建名为指数

优化变量可以使用名称来索引元素。您可以在创建变量时或之后给出这些名称。例如,在创建变量时给出名称。

x = optimvar (“x”,[“联合”“汉莎”“维珍航空”])
x = 1x3 OptimizationVariable array with properties: array wide properties: Name: 'x' Type: 'continuous' IndexNames: {{} {1x3 cell}} Elementwise properties: LowerBound: [-Inf -Inf -Inf] UpperBound: [Inf Inf Inf]参见variables with show。见bounds with showbounds。

optimvar按照变量的顺序,自动将指定的名称映射到索引号。例如,“联合”对应于索引1,“汉莎”对应于索引2,和“维珍航空”对应于索引3。显示最后一个变量以进行确认。

显示(x (3))
[x(维珍航空)]

索引名称使您能够定位的元素x通过索引名。例如:

路线= 2 * x (“联合”) + 3 * x (“维珍航空”
2*x(美联航)+ 3*x(维珍航空)

您可以在创建变量之后创建或更改索引名称。但是,您不能在构造之后更改优化变量的大小。因此,您只能通过设置索引大小与原始变量相同的新名称来更改索引名称。例如:

x = optimvar (“x”3 2);x.IndexNames = {{的第一行“row2”“row3”}, {“col1”“col2”}};

您可以为每个维度分别设置索引名称:

x.IndexNames {1} = {的第一行“row2”“row3”};x.IndexNames {2} = {“col1”“col2”};

您还可以为特定元素设置索引名称:

x.IndexNames {1} {2} =“importantRow”

检查变量的索引名称。

x.IndexNames {1}
ans =1 x3单元格{“第一行”}{‘importantRow} {' row3 '}
x.IndexNames {2}
ans =1 x2单元格{' col1} {' col2 '}

使用指定的索引

通过使用命名的索引变量,您可以轻松地创建和调试一些问题。例如,考虑变量x它是由名字索引的var

var = {“P1”“P2”“I1”“I2”“C”“LE1”“LE2”“HE1”“何”...“HPS”“议员”“有限合伙人”BF1的“BF2”“EP”“页”};x = optimvar (“x”var,下界的, 0);

为…创建边界、目标函数和线性约束x通过使用命名索引。

x (“P1”).下界= 2500;x (“I2”).UpperBound = 244000;linprob = optimproblem;linprob。目标= 0.002614 * x (“HPS”) + 0.0239 * x (“页”) + 0.009825 * x (“EP”);linprob.Constraints。cons1 = x (“I1”) - - - x (“HE1”) < = 132000;

你可以使用字符串(”“)或字符向量(' ')在指标变量中不加区分。例如:

x (“P2”).下界= 3000;x (“议员”).下界= 271536;showbounds (x)
2500 < = x (P1) 3000 < = x (P2) 0 < = x (I1) 0 < = x (I2) < = 244000 0 < = x (C) 0 < = x (LE1) 0 < = x (LE2) 0 < = x (HE1) 0 < = x(何)0 < = x (HPS) 271536 < = x(议员)0 < = x(“有限合伙人”)0 < = x (BF1) 0 < = x (BF2) 0 < = x (EP) 0 < = x (PP)

用字符串指定的变量之间没有区别,例如x(“P2”),以及使用字符向量指定的变量,例如x(“议员”)

由于命名索引变量具有等价的数值,因此即使您有命名索引变量,也可以使用普通的求和和冒号操作符。例如,你可以有以下形式的约束:

const = sum(x) <= 100;显示(若干)
x (P1) + (P2) + x (I1) + (I2) + x(“C”)+ (LE1) + x (LE2) + (HE1) + x(何)+ (HPS) + x(“议员”)+(“有限合伙人”)+ x (BF1的)+ (BF2) + x (EP) + (PP) < = 100
y = optimvar (“y”, {“红色”“绿色”“蓝”}, {“塑料”“木”“金属”},...“类型”“整数”下界的, 0);constr2 = y (“红色”:) = =(5、7、3);显示(constr2)
(1,1) y(“红”、“塑料”)= = 5(1、2)y(“红”,“木”)= = 7(1、3)y(“红”,“金属”)= = 3

使用索引变量查看解决方案

使用指定的索引变量创建并解决优化问题。问题是最大化的利润加权流量的水果到各个机场,受加权流量的约束。

rng (0)%的再现性p = optimproblem (“ObjectiveSense”“最大化”);流= optimvar (“流”...“苹果”“橘子”“香蕉”“浆果”}, {“纽约”“bo”“宽松”},...下界的,0,“类型”“整数”);p.Objective =总和(总和(兰德(4,3)。*流));p.Constraints.NYC =兰德(1、4)*流(:,“纽约”) < = 10;p.Constraints.BOS =兰德(1、4)*流(:,“bo”) < = 12;p.Constraints.LAX =兰德(1、4)*流(:,“宽松”) < = 35;索尔=解决(p);
使用intlinprog解决问题。LP:最佳目标值为-1027.472366。启发式:用ZI轮找到1个解。上限为-1027.233133。相对差距为0.00%。找到最优解。Intlinprog在根节点停止,因为客观值在最优值options的间隙公差范围内。AbsoluteGapTolerance = 0(默认值)。intcon变量是在公差选项内的整数。IntegerTolerance = 1e-05(默认值)。

找出橙子和浆果流向纽约和洛杉矶的最佳流量。

[idxFruit,idxAirports] = finddex (flow, {“橘子”“浆果”}, {“纽约”“宽松”})
idxFruit =1×22 4
idxAirports =1×21 3
橙莓= sol.flow(idxFruit, idxAirports)
orangeBerries =2×20 980.000 70.0000

这个显示意味着没有橙子会纽约70个浆果纽约, 980个橘子将会宽松的而浆果则不会宽松的

列出以下最优流程:

果机场

----- --------

浆果纽约

苹果BOS

橙子松懈

Idx = finddex (flow, {“浆果”“苹果”“橘子”}, {“纽约”“bo”“宽松”})
idx =1×34 5 10
optimalFlow = sol.flow (idx)
optimalFlow =1×370.0000 28.0000 980.0000

这个展示意味着70个浆果纽约28个苹果BOS980个橙子将会宽松的

另请参阅

|

相关的话题