LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ClassPriority.m
1classdef ClassPriority < opt.DecisionVariable
2 % ClassPriority Optimize the priority of job classes. In 'levels' mode each
3 % class gets an integer priority in [minPriority, maxPriority] (one dim per
4 % class); in 'permutation' mode encoded keys induce a priority ordering
5 % (n-1 dims). Mirrors native-Python ClassPriority.
6
7 properties
8 jobclasses % cell array of JobClass
9 mode
10 minPriority
11 maxPriority
12 end
13
14 methods
15 function obj = ClassPriority(jobclasses, mode, priorityRange, name)
16 if nargin < 2 || isempty(mode), mode = 'levels'; end
17 if nargin < 3 || isempty(priorityRange), priorityRange = [1 10]; end
18 if nargin < 4 || isempty(name), name = 'class_priorities'; end
19 obj@opt.DecisionVariable(name);
20 obj.jobclasses = jobclasses;
21 obj.mode = mode;
22 obj.minPriority = priorityRange(1);
23 obj.maxPriority = priorityRange(2);
24 if strcmp(mode, 'levels')
25 obj.dimension = numel(jobclasses);
26 else
27 obj.dimension = max(1, numel(jobclasses) - 1);
28 end
29 end
30
31 function c = getJobClasses(obj), c = obj.jobclasses; end
32 function m = getMode(obj), m = obj.mode; end
33 function b = getBounds(obj), b = opt.DecisionVariable.unitBounds(obj.dimension); end
34
35 function v = decode(obj, x)
36 if strcmp(obj.mode, 'levels')
37 v = zeros(1, numel(x));
38 for i = 1:numel(x)
39 p = obj.minPriority + x(i) * (obj.maxPriority - obj.minPriority);
40 v(i) = round(p);
41 end
42 else
43 n = numel(obj.jobclasses);
44 if n == 1
45 v = 0; return;
46 end
47 keys = [x(:).' 0.0];
48 % descending order (argsort of -keys), stable ties by index
49 [~, order] = sortrows([-keys(:), (1:n).']);
50 v = (order.' - 1); % 0-based class indices
51 end
52 end
53
54 function apply(obj, model, value)
55 if strcmp(obj.mode, 'levels')
56 for i = 1:numel(obj.jobclasses)
57 cls = obj.resolveOrSelf(model, obj.jobclasses{i});
58 cls.setPriority(value(i));
59 end
60 else
61 m = numel(value);
62 for rank = 1:m
63 classIdx = value(rank) + 1; % 0-based -> 1-based
64 priority = m - (rank - 1);
65 cls = obj.resolveOrSelf(model, obj.jobclasses{classIdx});
66 cls.setPriority(priority);
67 end
68 end
69 end
70
71 function t = getVariableType(obj), t = 'class_priority'; end
72 end
73
74 methods (Access = private)
75 function c = resolveOrSelf(~, model, jc)
76 c = opt.DecisionVariable.resolveClass(model, jc);
77 if isempty(c), c = jc; end
78 end
79 end
80end
Definition Station.m:245