#mathematical-optimization #cplex #opl
#математическая оптимизация #cplex #opl
Вопрос:
У меня есть набор кортежей в моей модели, определенный следующим образом:
tuple taskToolThTuple {string task; string tool; float throughput;}; {taskToolThTuple} taskToolTh = ...;
Данные, которые заполняют этот набор кортежей, выглядят примерно так:
taskToolTh = { lt;"task1", "tool1", 10gt; lt;"task1", "tool2", 11gt; lt;"task1", "tool3", 12gt; lt;"task2", "tool1", 8gt; lt;"task3", "tool1", 9gt; lt;"task3", "tool3", 14gt; ... };
Другими словами, для выполнения задач требуются специальные инструменты. Для некоторых задач требуется 1 инструмент, для некоторых задач требуется несколько инструментов.
Кроме того, задачи могут выполняться только на рабочих станциях, содержащих все инструменты, необходимые для выполнения задачи. Данные о том, какие инструменты доступны на каждой станции, содержатся в отдельном наборе кортежей:
tuple stationToolTuple {string station; string tool;}; {stationToolTuple } stationTool = ...;
Данные выглядят примерно так:
stationTool = { lt;"station1", "tool1"gt; lt;"station2", "tool1"gt; lt;"station2", "tool3"gt; lt;"station3", "tool2"gt; lt;"station3", "tool3"gt; lt;"station4", "tool1"gt; lt;"station4", "tool2"gt; lt;"station4", "tool3"gt; ... };
Что мне нужно сделать, так это создать новый набор кортежей, который включает станцию, инструмент, задачу, пропускную способность, но добавляет задачу только на станцию, которая может справиться с этой задачей. Например, на станции 2 доступны инструменты 1 и 3, поэтому там можно выполнять как задачи 2, так и задачи 3. Однако задача 1 требует инструментов 1, 2 и 3, поэтому ее нельзя выполнить там.
Если бы этот синтаксис был разрешен, я думаю, это сработало бы:
{tuple} StationToolTaskThTuple = {string station; string tool; string task; float throughput;}; {StationToolTaskTuple} StationToolTask = {lt;s,to,ta,thgt; | lt;ta,to,thgt; in taskToolTh, lt;s,togt; in stationTool : card({to2 | lt;ta,to2,thgt; in taskToolTh} inter {to2 | lt;s,to2gt; in stationTool}) == card({to2 | lt;ta,to2,thgt; in taskToolTh})};
Идея выше заключается в том, что я соединяю любые строки в taskToolTh и stationTool, где инструмент совпадает, но только тогда, когда соединяемые строки также удовлетворяют требованию, чтобы станция s содержала все инструменты, необходимые для выполнения задачи ta. К сожалению, я получаю ошибку в этой строке («Совокупный набор в настоящее время не поддерживается для выражений фильтра».).
Если возможно, я бы хотел сделать это без использования языка сценариев. Возможно ли это? Если да, то я был бы признателен за помощь в том, как это сделать.
Ответ №1:
вы можете выполнить некоторые вычисления раньше, чтобы не выполнять нарезку в заданном вычислении.
Например, следующие работы:
.мод
tuple taskToolThTuple {string task; string tool; float throughput;}; {taskToolThTuple} taskToolTh = ...; tuple stationToolTuple {string station; string tool;}; {stationToolTuple } stationTool = ...; int c1[t in taskToolTh, s in stationTool ]= card({s.tool | s2 in taskToolTh:t.task==s2.task } inter {t.tool | t2 in stationTool:t2.station==s.station}); int c2[t in taskToolTh, s in stationTool ]= card({t2.tool |t2 in taskToolTh:t2.task==t.task}); tuple StationToolTaskThTuple {string station; string tool; string task; float throughput;}; {StationToolTaskThTuple} StationToolTask = {lt;s,to_,ta,thgt; | lt;ta,to_,thgt; in taskToolTh, lt;s,to_gt; in stationTool : //card({to2 | lt;ta,to2,thgt; in taskToolTh} inter {to2 | lt;s,to2gt; in stationTool}) == card({to2 | lt;ta,to2,thgt; in taskToolTh}) c1[lt;ta,to_,thgt; , lt;s,to_gt; ]==c2[lt;ta,to_,thgt; , lt;s,to_gt; ] }; execute { writeln(StationToolTask); }
.дат
stationTool = { lt;"station1", "tool1"gt; lt;"station2", "tool1"gt; lt;"station2", "tool3"gt; lt;"station3", "tool2"gt; lt;"station3", "tool3"gt; lt;"station4", "tool1"gt; lt;"station4", "tool2"gt; lt;"station4", "tool3"gt; }; taskToolTh = { lt;"task1", "tool1", 10gt; lt;"task1", "tool2", 11gt; lt;"task1", "tool3", 12gt; lt;"task2", "tool1", 8gt; lt;"task3", "tool1", 9gt; lt;"task3", "tool3", 14gt; };