こまっています。どなたか教えてください。
プログラムで下の問題を解こうと考えていたのですが...
問題は、30個の重さの違う(ばらつきの範囲は平均から10%程度)
物を円形に(均等に)並べます。その時の円の中心と重りの組合せ
による重心がもっとも近いものを求めたいのです。
ベクトルの合成で一番小さくなる組合せと考えていただいて
いいと思います。
組合せは29!通りあるのはわかるのですが...
どのように計算して(考えて)いけばよいか見当もつかず困っています。
どうかよろしくお願いします。
No.3ベストアンサー
- 回答日時:
実地に応用なさろうとしているんだろうと思います。
準最適、だいたい宜しいんじゃないでしょうか、ある許容範囲内に入れば可。という程度で満足できるとするなら、こんなアプローチはどうでしょうか。
(1) 30個の物を円周上の等間隔30箇所にランダムに配置し、それらの重心と中心との距離の二乗dを計算します。
(2)2つの物を入れ替えることで、dを改良出来ないか調べます。どの二つを入れ替えてみるかはランダムに選び、dが小さくなるなら実際に入れ替える。
で、(2)を繰り返してdをダンダン改良していくんです。(2)を計算する際には、勿論お分かりでしょうけれど、何もまともに30個の重心を計算し直さなくても良いから簡単です。
実際、(2)を繰り返してみると、そう何度も入れ替えないうちにdが改良されなくなっちゃうとおもいます。これはlocal minimumに落ち込んでいるんです。
だからここまでを1クール(<クールってなに?)と数えて、
(3) 何クールもやってみる。そうして一番良かったのを採用するんです。
*で、ちょっと実験してみました。
・(1)30個の物の質量を0~1の一様乱数で作ってランダムに並べてみたら、d=4.09でした。
・(2)を1000回繰り返しました。
・(3) 100クール試みました。
最も成績が悪かったクールで、d=1.2×10^(-4)
最も成績が良かったクールで、d=8.7×10^(-9)
平均はd=1.1×10^(-5)
でした。
また、(2)を1000回繰り返したうち、実際に入れ替えが起こった回数は平均16.9回でした。
この程度のやり方でも結構イイ線行くものです。計算時間はアッという間ですし。
ありがとうございます
ちょっと返事が遅くなりました。すいません
実際に試していただいたみたいで
ほんとうにありがとうございます。
重心と中心との距離の二乗dを計算するのですね
ランダムに入れ替えるのはちょっと工夫して見ます。
No.4
- 回答日時:
では折角ですから、テストに使ったExcel用VBのコードを。
円の半径は1としています。Dim cnt
Dim wgt(30), sinT(30), cosT(30)
Dim xsum, ysum, wsum2, dist2, wsum2dist2
Dim wgtSv(30), dist2sv, xsumSv, ysumSv
Sub exec() 'メインプログラム
Call initialize
Call calcDist
Call displayThem(0)
For k = 1 To 100
Call shuffle
Call calcDist
Call improveDist(1000)
Call displayThem(k)
Next k
End Sub
Sub initialize() 'excelのworksheetの第一行目からおもりの質量を読みとる。
Pi = 3.14159265358979
cnt = 30 'おもりの個数
dt = 2 * Pi / cnt '円周を分ける角度
wsum = 0
For j = 1 To cnt
wgt(j) = Cells(1, j) 'excelのworksheetの第一行目からおもりの質量を読みとる。
sinT(j) = Sin(j * dt) 'sineのテーブル
cosT(j) = Cos(j * dt) 'cosineのテーブル
wsum = wsum + wgt(j) 'おもりの質量の合計
Next j
wsum2 = wsum ^ 2
End Sub
Sub calcDist() '重心と中心の距離の2乗を計算する。
xsum = 0
ysum = 0
For j = 1 To cnt
xsum = xsum + sinT(j) * wgt(j)
ysum = ysum + cosT(j) * wgt(j)
Next j
wsum2dist2 = ((xsum ^ 2) + (ysum ^ 2))
dist2 = wsum2dist2 / wsum2
End Sub
Sub displayThem(k) '並べ方と、重心と中心の距離の二乗を表示する。
For j = 1 To cnt
Cells(k + 4, j) = wgt(j)
Next j
Cells(k + 4, cnt + 2) = dist2
End Sub
Sub shuffle() 'おもりの順番をランダムに入れ替える
For c1 = 1 To cnt
c2 = c1
While c2 = c1
c2 = Int(Rnd(1) * cnt) + 1
Wend
Call swap(c1, c2)
Next c1
Call calcDist
End Sub
Sub improveDist(rep)
For m = 1 To rep
'2個をランダムに選んで、入れ替えたらどうなるか計算する。
c1 = Int(Rnd(1) * cnt) + 1
c2 = c1
While c2 = c1
c2 = Int(Rnd(1) * cnt) + 1
Wend
xsumTry = xsum - (wgt(c1) - wgt(c2)) * (sinT(c1) - sinT(c2))
ysumTry = ysum - (wgt(c1) - wgt(c2)) * (cosT(c1) - cosT(c2))
wsum2dist2Try = (xsumTry ^ 2) + (ysumTry ^ 2)
If wsum2dist2Try < wsum2dist2 Then '改良されるなら本当に入れ替える。
xsum = xsumTry
ysum = ysumTry
wsum2dist2 = wsum2dist2Try
dist2 = wsum2dist2 / wsum2
Call swap(c1, c2)
End If
Next m
End Sub
Sub swap(c1, c2) '2個のおもりを入れ替える
s = wgt(c1)
wgt(c1) = wgt(c2)
wgt(c2) = s
End Sub
No.2
- 回答日時:
プログラムで、無限時間かけられるなら、こういうのはどうでしょうか...
収束時間とか全くわかりませんが、
1.対面同士に適当に石を置く。
2.それに対して直角に、2つ置く
3.合成したベクトルに一番近い組み合わせで石を置いていく...
4.すべておき終わったら任意の3つのいれかえで、ベクトルが最小に
なるものをさがす。
5.3つ入れ替えをベクトルが小さくならなくなるまで繰り返す....
というのはどうでしょうか....
極端な話5だけでもいいとおもいますが、1~3を加えたほうが収束が
早くなりそうなきがしたので...
ありがとうございます
3つの入れ替えと最初の置き方が
ポイントですね。
あとは、時間的にどのぐらいかかるか?ですね。
チャレンジしてみます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 分譲マンション マンション大規模修繕工事の資金不足 神奈川県の築37年総戸数36戸のマンションの管理組合理事長を今年 7 2022/09/03 19:55
- 統計学 統計検定2級の過去問について 1 2023/01/04 16:40
- 経済学 均衡価格の求め方について教えてください 10 2022/12/23 13:25
- 迷惑メール・スパム 詐欺メール出会い系チャットについて 3 2023/06/12 18:35
- 数学 数Ⅲ、無限等比数列の問題についてです。 極限を調べる問題で、 場合分けのうちの |r|>1 の時、 3 2022/11/12 10:19
- 統計学 統計学、エクセルがわかりません!解答と詳しい解説をお願いします! (1)それぞれの地域別に記述統計量 9 2022/08/21 16:30
- 高校 数学A組み合わせの考え方 3 2022/04/19 09:05
- 経済 ドイツ人の平均可処分所得は2017年頃2万2657€(当時レートで290万円)でしたが今いくら? 3 2022/10/06 21:40
- 物理学 下の図についての問題です。 (2)ソレノイドの中心に半径b、巻数Nの微小円形コイルを互いの中心軸がθ 3 2023/05/28 23:11
- Java Java配列の問題を教えてください。 乱数で20個出力し、最大、最小、合計、平均を求め、更に昇順にソ 3 2023/07/10 18:32
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
30パーセントオフで371円だった...
-
公共工事の現場管理費率(%)...
-
「割る」と「割りかえす」の違い
-
eのマイナス無限大乗
-
中学生の数学を習う順番に並べ...
-
面積から辺の長さを出す計算式
-
プール計算って何ですか?
-
楕円の円周の長さの計算の仕方...
-
10進法で時間の計算で30分が0.5...
-
体積凹 理解しない 頭掻きむしる
-
ラプラス変換に関して
-
映画を1.3倍速で見た時の時間計...
-
分数の計算で分子が0になったら...
-
半径の計算方法を教えてください。
-
積分のエクセル計算式を教えて...
-
(x^2-x+1)^10の展開式におけるx...
-
3857143を手計算で素因数分解す...
-
袋のサイズから容量を計算する方法
-
大人になって使う算数、数学は...
-
教えてください!!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
30パーセントオフで371円だった...
-
公共工事の現場管理費率(%)...
-
「割る」と「割りかえす」の違い
-
中学生の数学を習う順番に並べ...
-
楕円の円周の長さの計算の仕方...
-
2割負担の計算。
-
10進法で時間の計算で30分が0.5...
-
プール計算って何ですか?
-
体積凹 理解しない 頭掻きむしる
-
面積から辺の長さを出す計算式
-
一個当たり15秒の製品を1時間で...
-
袋のサイズから容量を計算する方法
-
eのマイナス無限大乗
-
積分のエクセル計算式を教えて...
-
赤で囲んだ式でもできますか? ...
-
積分での計算ミス直す方法。
-
映画を1.3倍速で見た時の時間計...
-
半径の計算方法を教えてください。
-
最後の指針がわかりません
-
量子力学の運動量pの微分演算子...
おすすめ情報