Saturday, August 22, 2009

Generating Permutations and Combinations

One of the things I did when playing around with the HL1606 is write a routine that ran through ALL the colors. I mean all 64 possible permutations both my way and Synoptic Labs' way to compare.  Did I write these out by hand? Um, no.

First of all, how do we know there are 64? If you look at the command byte for the HL1606 there are 6 bits involved in determining color, each of which can be one of two options (0 or 1). Doing the probability math: 2*2*2*2*2*2, 2 to the 6th... or 64.  The other way to think about it is that we have 4 options to chose from: 01, 11, 10, 00 or (right to left) ON, DOWN, UP, OFF.  We pick any one of these options 3 separate times (R, G and B).  4*4*4, 4 to the 3rd or again 64. Whether you think of it as 2 options 6 times or 4 options 3 times we can still simply count up in binary to generate the needed command bytes.

Since I needed to create a predefined array for my purposes I wrote a function that would spit out something serially I could copy and paste:

void loop() {  delay(2000); // time to switch over to serial mode  if (i < 1) { // do it only once  for (b=0; b<64; b ++) {    commandByte = b + B10000000;  // add the latch command    Serial.print("colorArray[");    Serial.print(b, DEC);    Serial.print("] = B");    Serial.print(commandByte, BIN);    Serial.println(";");  }  }  i++; }

Just a heads up, this works because I added the 1 onto the left edge of the command byte by adding the actual value of B10000000 to the variable NOT by trying to tack a "B10" on to it on with Serial.print before. Why not? 63 prints out as 111111, 6 characters, but 23 is 10111, 5 characters.  You can't just paste numbers to left edge with text and expect the value to be correct when you copy the printout.

Writing your own program is way more time consuming for a non-numeric situation like writing out UP OFF DOWN and ON for the Synoptic Lab style code - In case you don't remember those lines look like:

  docolor(DOWN, DOWN, UP,128/(2*SPULSE),1);

You'd start with something like the below, but I haven't tested it.

void permutate(int n_options, int r_times) {  int n;  int r;  for (r=0; r<r_times; r ++) {    for (n=0; n<n_options; n ++) {      Serial.print(r, DEC);      Serial.print(" : ");      Serial.print(n, DEC);      Serial.print("  |  ");       }       Serial.println();  }  Serial.println(); }

I just borrowed Math is Fun's permutations and combinations calculator (below).  They generated the list and with a bit of find and replace magic in BBEdit I got the code I needed.

Oh, and for those of you who are curious and don't care about having a pre-written array the following function does work, and is what the attached video is of.

void playAll() {  int b;    for (b=0; b<64; b ++) {    nextColor = colorArray[b];    nextCommand = nextColor + B10000000; // latch it    doColor2(nextCommand);  } }

<div class="posterous_bookmarklet_entry">





"http://www.mathsisfun.com/combinatorics/images/combinations-permutations.swf" type="application/x-shockwave-flash" width="500" height="403">

<div class="posterous_quote_citation">via <a href="http://www.mathsisfun.com/combinatorics/combinations-permutations-calculator.html">mathsisfun.com</a></div>
<p>&nbsp;</p>
</div>

Download now or watch on posterous
MVI_4528.AVI (14411 KB)

Posted via email from what2day's posterous

No comments: