Hello!
I am searching a possibility to detect cycles in a data set. For example, it should tell me that Product A has itself as a component in the following data set:
Data Have;
Input @1 Product $ @3 Component $;
Datalines;
M N
N O
A B
B C
C D
D A
;
Run;
Thanks&kind regards
If you have access to SAS/OR, look into the CYCLE statement of PROC OPTNET.
PG
hello,
if i have understood correctly (you are looking for products that are also components) this may be one solution:
proc sql;
select a.product from have a, have b
where a.product=b.component;
quit;
Hi!
I am afraid this only tells me which "products" in the first column are componets of another product.
What the program should do is to check the structure: 1. M consists (in part) of N. N consits of O -> o.k. 2. A consists of B. B consists of C. C of D. D of A -> this is a contradiction.
only one product correspond to one component ?
Or one product can project to multi-component ?
Sorry, bad example. Multiple Components are possible. This would be a better example:
Data Have;
Input @1 Product $ @3 Component $;
Datalines;
M N
N O
A B
B C
B F
B G
C D
D A
;
Run;
If you have access to SAS/OR, look into the CYCLE statement of PROC OPTNET.
PG
I do. will try.
Copy Paste of Example 2.2 Cycle Detection for Kidney Donor Exchange worked even for a relatively large data set. Many Thanks !!!!!!!!!!!!
Data Have;
Input @1 Product $ @3 Component $;
Datalines;
M N
N O
A B
B C
B F
B G
C D
D A
;
Run;
data want;
set have;
if product<component then flag=0;
else flag=1;
run;
flag=1 will be contradiction.
It looks like I am late. But just post it here for other user who don't have SAS/OR .
Take a look at LOG to see which one is a circle component.
data have;
input (_start _end) (:$1.) @@;
cards;
M N
N O
A B
B C
B F
B G
C D
D A
;
run;
data _null_;
if _n_ eq 1 then do;
length path _path $ 200 ;
if 0 then set have;
*This Hash Table contains the from-to information;
declare hash ha(hashexp:20,dataset:'have',multidata:'Y');
ha.definekey('_start');
ha.definedata('_end');
ha.definedone();
*This Hash Table contains all of branches in a tree,it is very important;
*which we can find all of the from-to ;
declare hash pa(ordered:'Y');
declare hiter hi_path('pa');
pa.definekey('count');
pa.definedata('path');
pa.definedone();
end;
set have;
*initial Hash Table PA, i.e. get the first branch;
count=1;
path=catx(' ',_start,_end);
pa.add();
*Now get start,using Broad Search First to get all of from-to;
do while(hi_path.next()=0);
_path=path; *_path is for rollback;
_start=scan(path,-1,' ');
rc=ha.find();
do while(rc=0);
if not find(path,strip(_end)) then do;
count+1;
path=catx(' ',path,_end);
pa.add();
path=_path;
end;
else putlog 'FOUND:' _end 'is a circle component.';
rc=ha.find_next();
end;
end;
*Now a branch has searched completely,we need to clear it to ;
*prepare for next branch (an observation is a branch);
pa.clear();
run;
Xia Keshan
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
Still thinking about your presentation idea? The submission deadline has been extended to Friday, Nov. 14, at 11:59 p.m. ET.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.