Создание нового набора из компонентов существующего набора в OPL / CPLEX

У меня есть набор, который я прочитал в моем проекте OPL, который выглядит следующим образом:

S = {<"A","">, <"B","">, <"AB","A">, <"AB","B">, <"C","">, <"ABC","A">,<"ABC","B">, <"ABC","C">, <"ABC","AB">},

где каждый элемент ‹,> представляет собой кортеж с двумя строковыми элементами. Этот набор представляет родительско-дочерние отношения между интересующими элементами.

Из этого набора мне нужно создать новый набор:

S' = {<"A",{""}>, <"B",{""}>, <"C",{""}>, <"AB",{"A","B"}>, <"ABC",{"A","B","C","AB"}>},

где каждый элемент ‹,> является кортежем, первый элемент каждого кортежа представляет собой строку, а второй элемент каждого кортежа - набор строк. Моя попытка создать этот набор:

tuple child{
    string Item;
    string Child; 
 }

 {child} Children = ...; //Reads in the set S

 tuple dependents{
    string Item;
    {string} ItemChildren; 
 } 

 {dependents} dependentsSet = {<x.Item, y.Child> | x in Children, (y in Children : <x,y> in Children)};

Используя имена переменных из приведенного выше кода, цель создания S ' заключается в том, что позже в моей программе мне нужно создать набор ограничений, по одному для каждого элемента, и в каждом ограничении, которое мне нужно проиндексировать. над ItemChildren. Я относительный новичок в OPL, поэтому я знаю, что неправильно использую синтаксис при инициализации переменной dependentSet, но я не знаю, как правильно написать этот оператор, чтобы он создавал набор, который я ищу.

Может ли кто-нибудь помочь мне понять утверждения, необходимые для создания набора, который мне нужен?


person tjnel    schedule 21.01.2018    source источник


Ответы (1)


tuple child{
    string Item;
    string Child; 
 }

 {child} Children 
  = {<"A","">, <"B","">, <"AB","A">, <"AB","B">, <"C","">, <"ABC","A">,
  <"ABC","B">, <"ABC","C">, <"ABC","AB">};

{string} setOfParents={i.Item | i in Children};
{string} setOfChildren={i.Child | i in Children};

 tuple dependents{
    string Item;
    {string} ItemChildren; 
 } 

 {string} kids[p in setOfParents]={k | k in setOfChildren : <p,k> in Children};

 {dependents} dependentsSet = {<x, kids[x]> | x in setOfParents};
 execute
 {

 writeln(dependentsSet);
} 

дает

 {<"A" {""}> <"B" {""}> <"AB" {"A" "B"}> <"C" {""}>
 <"ABC" {"A" "B" "C" "AB"}>}
person Alex Fleischer    schedule 21.01.2018