
動的計画法でやれるなら…ってことで。
# てこずったけど… orz
課題A(要素数30)の場合、ver.5.80のループ回数が4万程度なので
がっちり枝刈ればワークシート上ですべての解を出すこともできるよね、ってハナシ。
# すごくてこずったけど… o.....rz
# で、てこずればてこずるほど、テキストが長くなるという… o........rz
# フィルとか再計算とか削除とか再起動とか(w
# 待ってる時間が退屈なのよね。
=============================================
■お約束♪
【 総当りではありません 】
って、一応書いとかないとね。
「要素30の組合せは2^30で、十億以上になります。
Excel2007の行数は百万ちょっとですから解けるわけありません。
十億と百万、どっちが大きいか、わかります???
小学生でもわかりますよ wwwwww」
とか、読まずにダメ出しする人いるから。
# きみ、前回もまったく同じこと言ってた。学習して。
-------------------------
【 分割統治法(Divide and conquer algorithm)による解法を
ExcelWorkSheet上に数式で実装するハナシです 】
って、一応書いとかないとね。
「Subset sab Probremというのはnapzak ploblemの一種で、
一般的な解法は知られていないmasmaticのhard probremです。
dinamik Plogramingというor*anismを使わないと解けません。
もしEkseru formuraで解けたらfierds awordもらえるかも wwwwwww」
とか、知ったかする人いるから。
# いっそ全部英語で書いて。
# あと、伏せなくていいから。
-------------------------
【 Excelが固まったり落ちたりする可能性があります 】
って、一応書いとかないとね。
「Excel5.0が起動しなくなった。会社のパソコンなのにどうしてくれる!」
とかキレる人いるから。
# ぇっと…ごめんなさい。申し訳ないです。ほんとに。
# 頑張ってくださいね。いつかきっといいことありますから。
# 応援してます。くじけないで。
-------------------------
【 この記事は無論冗談ですが、ちゃんと動作します 】
って、一応書いとかないとね。
ネタ扱いする人いるから。
# 動作しない数式で「冗談」になるのかどうかしらんけど。
=============================================
# 長い予防線って、わたし的には「お約束」なんだけど
# あんま面白くなかったな、二番煎じだし。 (ーー;)
=============================================
さて。(^^;;;;;;
DP版に比べるとかなり手数多くなってますが
これはまぁ、しゃあないです。
【 動的計画法みたいに単純なハナシではないので 】
まぁ「複雑=高度」ってワケでもないんですけどね。
なにしろ複数の解を見つけようってハナシなんで。
もっとも、Excel2007なら
要素数20までは数値割当の総当りでいけますから
手間と重さ考えると、利点があるかというと謎かも。
-------------------------
それから、もしかすると、
「作業列使うと速くなりますよ、ご参考まで。」
とか思う人いるかもしれませんが
【 なんでもかんでも切り出せば速くなるわけぢゃないです 】
って、一応書いt(ry
ネストすると遅くなるってのはふつう
同じ計算を何度もすることになるからで
一度しかしない計算を切り出しても基本速度変わりません。
-------------------------
それから、もしかすると、
「論理演算子を使うと簡潔に書けますよ、ご参考まで。」
とか思う人いるかもしれませんが
【 IFのが速いです 】
って、一応k(ry
AND(判定A,判定B) ってやるより
IF(判定A,TRUE,IF(判定B,TRUE)) ってやる方が速いです。
-------------------------
それから、もしかすると、
「RANKっていう関数がありますよ、ご参考まで。」
とか思う人いるかもしれませんが
【 MATCHのが速いです 】
って、いt(ry
MATCHのTRUE型はバイナリサーチなので。
RANKは裏でソートするしね。
=============================================
さて。(^^;;;;;;;;;;;;;;;;;;;;;;;;
◆0 課題設定/下処理
例によって、課題A
http://abyssinia.bbs.fc2.com/?act=reply&tid=2850777#5391387
を使うことにします。
----------
Sheet1について
●STEP0-1
A1: 目標値
A2: =GCD(B:B)
A3: =A1>SUM(B:B)/2
B1以下: 要素
※今気付いたんですが(ぇ
Excel2003以前だと、GCDの引数に列全体を指定すると
#NUM!エラーになりますね。
その場合には要素範囲を指定してください。
●STEP0-2
B列を【降順に】ソート
----------
以下、Sheet2について
●STEP0-3
A1: =IF(MOD(Sheet1!$A$1,Sheet1!A2)>0,"解ナシ",IF(Sheet1!A3,(SUM(Sheet1!B:B)-Sheet1!A1),Sheet1!A1)/Sheet1!A2)
B1: =MIN(Sheet1!B:B)/Sheet1!A2
C1: =COUNT(Sheet1!B:B)
※ ココで"解ナシ"と表示されたら解はありません。
表示されなかったら解があるわけじゃありませんけど。
●STEP0-4
K3: =A1+1
●STEP0-5
L1: =K1+1
L2: =L3+M2
L3: =INDEX(Sheet1!$B:$B,L1)/Sheet1!$A$2
●STEP0-6
L1:L3を、【 2行目に0が返るまで 】右方にフィル
※ 行き過ぎたらクリアしてください。削除すると#REFエラーになります。
●STEP0-7
A4: 1
B4: =A1
D4: =B4
※ C4ぢゃなくてD4です。ちうい。
--------------------------------------------
◆1 主処理
●STEP1-1
A5: =IF(F5=0,"STOP",A4+1)
B5: =IF(I4,INDEX(B$4:B4,F4),IF(J4,B4,D4))
C5: =IF(I4,E4+1,IF(J4,C4+1,MAX(C4+1,MATCH(D4,K$3:AP$3,-1)-1)))
※ K$3:AP$3 の部分は要素数によって変わります。
列数に応じて適当に。
(要素の前の列から始めて1列余分に見てください)
D5: =B5-INDEX(L$3:AP$3,C5)
※ L$3:AP$3 の部分も要素数によって変わります。
E5: =IF(F4<>F5,INDEX(C$4:C4,F5),E4)
F5: =IF(I4,INDEX(F$4:F4,F4),IF(J4,F4,A4))
G5: =G4+H5
H5: =D5=0
I5: =IF(D5>INDEX(L$2:AP$2,C5+1),TRUE,IF(C5=$C$1,TRUE))
※ L$2:AP$2 の部分m(ry
J5: =IF(I5,TRUE,IF(D5<$B$1,TRUE,H5))
K5: =IF(I4,INDEX(C$4:C4,F4),C4)
L5: =IF(L$1=$C5,TRUE,IF(L$1>$E5,FALSE,IF($J4,IF(L$1=$K5,FALSE,L4),L4)))
●STEP1-2
L5を右方にフィル
●STEP1-3
別名で保存
※ ココちょっとポイント
いったん埋めた後で元に戻そうとすると大変なので。
●STEP1-4
5行目を、【 A列に"STOP"が返るまで 】下方にフィル
※ 一気にフィルするときついので、千行ぐらいずつ、様子見ながら。
リソース云々の警告が出たら、最下行を選択しなおしてフィル続行
※ G列の値が現在発見した解の個数です。途中で止めても可。
※ 行き過ぎたら戻ってください(余分な行をクリアしてください)
※ 課題Aの場合、最初の解が見つかるのは102行目
探索が終わるのは(STOPが出るのは)25,769行目です。
※ 2003以前な人は、随時値貼り付けを強く推奨
--------------------------------------------
◆2 書出処理
以下、Sheet1について
●STEP2-1
A4: =MAX(Sheet2!G:G)
C31: =COLUMN()-2
C32: =IF(C31>$A$4,"STOP",MATCH(C31-1,Sheet2!$G:$G,1)+1)
※ C31とかC32とかいうのは、要素数によって変動します。
以下同様
●STEP2-2
C1:C30: =TRANSPOSE(INDEX(Sheet2!$L:$AO,C32,)<>$A$3)*$B1:$B30
として、Ctrl+Shift+Enter で確定
※ ココで詰まった人は……ごめんなさい。 <(_ _)>
# って、え!? 見捨てちゃうの?
# ココで詰まる人はもっと前で詰まってるでしょ。
●STEP2-3
C列を、【 最終行に"STOP"が返るまで 】右方にフィル
=============================================
Q.「『進捗報告』みたいなグラフィックが表示されません。
TRUEとかFALSEとか変な文字列が表示されます。」
A.「あれは"グラフィック"ぢゃなくて
[条件付き書式]でFLASE白くしてTRUE塗ってるだけだから。」
Q.「条件付書式のやり方を教えてください。」
A.「つ
http://bekkoame.okwave.jp/207/218/c996.html 」
=============================================
★qa5212312
あのケースは解が無数にあるので
総ての解を見つけることは土台無理ですが
最初の解は656行目で見つかります。
5000行で18件です。
手間を考えると、打鍵猿に負けますね(^^;;;;
もちろんソルバーには勝てますがw
★何かの専(ry の謎コードで160秒かかったとかいうアレ
この課題はやっぱキツいですね。
(唯一の)解が見つかるのは76,160行目ですから、Excel2003以前では出ません。
50万行ぐらいまで埋めてみましたが、嘗め尽くすのは無理でした。