Создайте набор кортежей OPL CPLEX, объединив наборы кортежей с дополнительным условием для надмножеств, связанных с объединением строк

#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;  };