优化变量可以使用名称来索引元素。您可以在创建变量时或之后给出这些名称。例如,在创建变量时给出名称。
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个苹果BOS
980个橙子将会宽松的
.