CheckBoxListコントロールのinputにスタイルを設定する


苦肉の策なので、良い方法があれば教えていただきたいです。


CheckBoxListの各input要素に別々のスタイルをプログラムから設定したい。

例えば、CheckBoxList.Items[i].Valueに設定した色をinput要素の背景に設定したい。


しかしCheckBoxList.ItemsにInputAttributesはない。

input要素にスタイルを設定する方法が見つからなかったので、
スタイルシートを使って間接的に設定する。


まずCheckBoxListの持つListItemはspanで囲まれたinputとlabelに展開され、
CheckBoxList.Items[i].Attributesに追加した属性はspanの属性に追加される。


なので、CheckBoxList.Items[i].Attributes.Addでspanにidを付けて、
スタイルシートに"#spanに付けたid input"に対するスタイルを追加すればいい。

// checkboxlistはCheckBoxListコントロール
// checkboxlist.Items[i].Valueは8桁の16進数がFFFFFFFFみたいに入っている
for(int i=0;i < checkboxlist.Items.Count;i++)
{
  ListItem item = checkboxlist.Items[i];

  // 各チェックボックスを囲むspanにidを付ける
  string item_id = string.Format("{0}_Items_{1}", checkboxlist.ID, i);
  item.Attributes.Add("id", item_id);

  Style item_style = new Style();
  item_style.BackColor = Color.FromArgb(Convert.ToInt32(item.Value), 16);

  // 設定したいスタイルを追加する
  Page.Header.StyleSheet.CreateStyleRule(item_style,
    null,
    string.Format("#{0} input", item_id)
  );
}

Mebius関数を素因数分解しないで求めるメモ

MANUEL BENITO AND JUAN L. VARONA. RECURSIVE FORMULAS RELATED TO THE SUMMATION OF THE MOBIUS FUNCTIONにあったやつ

Mebius関数とは

\mu(1)=1
\mu(n)=0 (nがある素数の2乗で割り切れる)
\mu(n)=(-1)^k (nが相異なるk個の素因数に分解できる)
Wikipedia メビウス関数

計算方法

Mertens functionを
\forall x \ge 1, M(x)=\sum^{\lfloor x \rfloor}_{n=1} \mu(n)
と定義すると
\sum^{n}_{k=1} M(n/k) = \sum^{n}_{a=1} \sum^{\lfloor n/a \rfloor}_{b=1} \mu(b) = 1
が成り立つ

これを使えば
M(n)=1-\sum^{n}_{k=2} M(n/k)
よって
\mu(n)=M(n)-M(n-1)
で計算できる

証明

M(n/k)で足しあわされるμ(k)を具体的に書き並べてみると
\sum^{n}_{k=1} M(n/k)=\sum^{n}_{a=1} \sum^{\lfloor n/a \rfloor}_{b=1} \mu(b)=
μ(1)+μ(2)+…+μ([n/1])+
μ(1)+μ(2)+…+μ([n/2])+
… +
μ([n/n])
各μ(b)はb≦[n/a]を満たすaについて足しあわされる

ここでa,bは自然数なので, ab≦n ⇔ b≦[n/a]≦n/a が成り立つ
よって
\sum^{n}_{a=1}\sum^{\lfloor n/a \rfloor}_{b=1}\mu(b)=\sum^{n}_{a=1}\sum_{ab \le n}\mu(b)

ab=1,2,3,…,nまで分けて考えてみると
\sum^{n}_{k=1} \sum^{n}_{a=1}\sum_{ab=k}\mu(b)=\sum^{n}_{k=1} \left( \sum^{n}_{a=1} \mu^{*}(k/a) \right)
ただし, \mu^{*}(x) = \mu(x) (x \in Z), 0 (other)
=\sum^{n}_{k=1} \sum_{a|k} \mu(k/a)=\sum^{n}_{k=1} \sum_{d|k} \mu(d)

さらにMebius関数の性質
\forall n \ge 2, \sum_{d|n}\mu(d) = 0
を使えば
\sum^{n}_{k=1}M(n/k)=\mu(1)+\sum^{n}_{k=2} \sum_{d|k} \mu(d)=1
になる

Rの課題?

メモ
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1377312633

課題5
対角要素が1:10の対角行列を作りなさい。

答え

diag(1:10,ncol=10,nrow=10);

http://www.okada.jp.org/RWiki/?%B9%D4%CE%F3Tips%C2%E7%C1%B4#n42877c2

課題6
matrix(1:100,10,10)を作り、rev を使って
次の行列を作りなさい。

10 20 30 40 50 60 70 80 90 100
 9 19 29 39 49 59 69 79 89 99
 8 18 28 38 48 58 68 78 88 98
 7 17 27 37 47 57 67 77 87 97
 6 16 26 36 46 56 66 76 86 96
 5 15 25 35 45 55 65 75 85 95
 4 14 24 34 44 54 64 74 84 94
 3 13 23 33 43 53 63 73 83 93
 2 12 22 32 42 52 62 72 82 92
 1 11 21 31 41 51 61 71 81 91

答え

apply(matrix(1:100,10,10),2,rev);

http://www.okada.jp.org/RWiki/?R%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0Tips%C2%E7%C1%B4#mbbf5f3c

Rの情報は検索しにくい…

正多角形グラフの隣接行列とハミルトン閉路,パスの数を数えてみる

MathWorldに載っているけれど確かめてみた
http://ideone.com/WayQn

結果だけ
正四面体
// Hamiltonian Path: 6本
// Cycle: 6本
// Tetrahedral graph */

正六面体
// Hamiltonian Path: 18本
// Cycle: 12本
// Cubical graph */

正八面体
// Hamiltonian Path: 40本
// Cycle: 32本
// Octahedral graph */

正十二面体
// Hamiltonian Path: 162本
// Cycle: 60本
// Dodecahedral graph */

正二十面体
// Hamiltonian Path: 6320本
// Cycle: 2560本
// Icosahedral graph */

隣接行列はWolframAlphaやSAGEから拝借

Rで素数の無限リスト

以下を参考に..

# 無限リスト[x, fn(x), fn(fn(x)), ... ]を作る
infinite.stream <- function(x, fn){
  list(car=x, cdr=function() infinite.stream(fn(x),fn))
}

# 無限リストlstから最初のn項のベクトルを返す
infinite.take <- function(n, lst){
  if(n == 0) c()
  else c(lst$car, Recall(n-1, lst$cdr()))
}

# 無限リストlstの各項にfnを適用した無限リストを返す
infinite.apply <- function(fn, lst){
  infinite.stream(fn(lst$car), function(x) infinite.apply(fn,lst$cdr()))
}

# 無限リストlstの要素xのうち, fn(x)がTRUEな要素だけの無限リストを返す
infinite.filter <- function(fn, lst){
  if(fn(lst$car)) list(car=lst$car, cdr=function() infinite.filter(fn,lst$cdr()))
  else infinite.filter(fn,lst$cdr())
}

odd.from <- function(n) infinite.stream(n,function(x) x+2)
primes <- list(car=2, cdr=function() infinite.filter(is.prime, odd.from(3)))
is.prime <- function(n){
  ps <- primes
  y <- ps$car
  while(y^2 <= n){
    if(n%%y==0){
      return(F)
    } else {
      ps <- ps$cdr()
      y <- ps$car
    }
  }
  return(T)
}

show(infinite.take(10,primes))
# [1]  2  3  5  7 11 13 17 19 23 29

リンゴ振り分け問題をGLPKで解く

3つの八百屋から値段の異なるリンゴをいくつか仕入れた。
これを5つの袋に決められた個数ずつ振り分ける。
袋ごとの平均単価が同じくらいになるように振り分ける方法を見つけたい。

元ネタはここ

要するに画像の5x3の表を埋めつつ目的関数を最小化したい
ただし, 表の要素は非負整数

目的関数は
行ごとの平均単価からの差の絶対値を合計したもの
min:  f(X) = \sum^{5}_{i=1} |-1.26X_{i1}+1.74X_{i2}-326.X_{i3}|

目的関数に絶対値が入ったままでは扱いづらいので
変数T_i=|-1.26X_{i1}+1.74X_{i2}-326.X_{i3}|
制約-T_i \le -1.26X_{i1}+1.74X_{i2}-326.X_{i3} \le Tiを導入する

結局, 目的関数と制約式は次のようになる
min: f(X) = \sum^{5}_{i=1} T_i
subject to:
\sum^{3}_{j=1} X_{k j} = R_k
\sum^{5}_{i=1} X_{i k} = S_k
X_{i j} \ge 0, \mathrm{integer}
-T_i \le -1.26X_{i1}+1.74X_{i2}-326.X_{i3} \le Ti
ただし, Rは各袋に入れるリンゴの個数 \{R_i\}=\{8,21,4,55,8\}
Sは八百屋から仕入れたリンゴの個数 \{S_i\}=\{3,4,1\}を表す

これをそのままGLPKのモデルとデータとして書く
モデル(shiwake.mod)

param YN;
param FN;
set Yaoya := 1..YN;
set Fukuro:= 1..FN;

param request{Fukuro};
param stock{Yaoya};
param price{Yaoya};
param mean_price;

var X{Fukuro,Yaoya} ,>=0 ,integer;
var T{Fukuro};

minimize DM: sum{i in Fukuro} T[i];
s.t. Tate{k in Yaoya}: sum{i in Fukuro}X[i,k] == stock[k];
s.t. Yoko{k in Fukuro}: sum{i in Yaoya}X[k,i] == request[k];
s.t. ABS_LB{k in Fukuro}: sum{i in Yaoya} (price[i]-mean_price)*X[k,i] >= -T[k];
s.t. ABS_UB{k in Fukuro}: sum{i in Yaoya} (price[i]-mean_price)*X[k,i] <= T[k];

データ(shiwake.dat)

param YN := 3;
param FN := 5;

param request := 
 1 8
 2 21
 3 4
 4 55
 5 8;

# 八百屋から仕入れた個数
param stock :=
 1 29
 2 51
 3 16;

# 八百屋ごとのリンゴの単価
param price :=
 1 43
 2 46
 3 41;

# 全体の平均単価
param mean_price := 44.26;

あとはglpsolに渡せばよい

glpsol.exe -m shiwake.mod -d shiwake.dat -o shiwake.txt

結果
八百屋A, 八百屋B, 八百屋Cの順に
袋1は3個, 4個, 1個で平均単価44.25円
袋2は9個,10個, 2個で平均単価44.24円
袋3は2個, 2個, 0個で平均単価44.5円
袋4は12個, 31個, 12個で平均単価44.25円
袋5は3個, 4個, 1個で平均単価44.25円
と振り分ければよいことが分かった

p.s. GLPKのWindowsバイナリのダウンロードはここ