コラッツアタック!


8

この課題は、Collat​​z予想に関連するいくつかの新しい発見に基づいており、共同のpolymathプロジェクトの精神に基づいて多少設計されています。推測全体を解決することは、数学/数論の専門家によって非常に困難または不可能であると見なされていますが、この単純なタスクはかなり実行可能であり、サンプルコードの多くの例があります。最良のシナリオでは、競技者のエントリ、工夫、創造性に基づいて、問題に対する新しい理論的な洞察が得られる可能性があります。

新しい発見は次のとおりです。連続する一連の整数[ n1 ... n2 ]が合計mであると想像してください。これらの整数をリスト構造に割り当てます。これで、Collat​​z予想の一般化バージョンは次のように進むことができます。次に、いくつかの選択基準/アルゴリズムに基づいて、リスト内のm(またはそれ以下)の整数の1つを繰り返します。その整数が1に達した場合は、リストからその整数を削除します。明らかに、Collat​​zの推測は、このプロセスがn1、n2のすべての選択に対して常に成功するかどうかを判断することと同等です。

これがツイスト、追加の制約です。各ステップで、m個の現在の反復をリストに一緒に追加します。次に、関数f(i)を考えます。ここで、iは反復数であり、f(i)はリスト内の現在の反復の合計です。特定の "nice"プロパティを持つf(i)を探します。

全体/全体的な概念は、ここでよりよく/より完全に文書化されています(ルビーの多くの例を使用)。その結果、「ほぼ単調に減少する」f(i)につながるかなり単純な戦略/ヒューリスティックス/アルゴリズムが存在し、そのページに多くの例が示されています。以下は、(gnuplotでプロットされた)グラフィカルな出力の例です。

だからここに課題があります:既存の例のバリエーションまたはまったく新しいアイデアを使用して、選択アルゴリズムを構築し、f(i)を「可能な限り単調減少に近づける」ようにします。応募者は、提出物にf(i)のグラフを含める必要があります。有権者は、そのグラフとコード内のアルゴリズムのアイデアに基づいて投票できます。

コンテストは、n1 = 200 / n2 = 400パラメータのみに基づいています。(サンプルページでも同じです。)うまくいけば、競技者は他の地域を探索し、アルゴリズムを一般化しようとするでしょう。

ここで非常に役立つ1つの戦術は、勾配降下型アルゴリズム、または遺伝的アルゴリズムです。

興味のある参加者とのチャットでこれについてさらに議論できます。

いくつかの参照のために、別のcodegolfこのCollat​​zの挑戦:コラッツの問題(でドアノブ


5
大文字でお願いします!
TheDoctor 2014年

1
なぜ人々は閉会に投票するのですか?非定型的な質問があるのは素晴らしいことです!私は問題を理解することに関与する思考/読書の問題が多すぎますか?!
Mau

2
ここで繰り返すとは、「その整数のCollat​​zシーケンスの次の「反復」に進む」という意味です
vzn

1
あなたが投稿した例は
打ち勝つ

1
@vzn学校が終わった今週末に休暇に向かっているので、すぐに提出を約束することはできません。しかし、私は確かにこれを実験します-結局のところ、これは私が非常に興味をそそる問題への新しいアプローチです。:)
apnorton 2014年

回答:


4

この課題のアルゴリズムを実行するために、Python 2でいくつかのコードを書きました。

import matplotlib.pyplot as plt

def iterate(n):
    return n*3+1 if n%2 else n/2
def g(a):
    ##CODE GOES HERE
    return [True]*len(a)
n1=input()
n2=input()
a=range(n1,n2+1)
x=[]
y=[]
i=0
while any(j>1 for j in a):
    y.append(sum(a))
    x.append(i)
    i+=1
    b=g(a)
    for j in range(len(a)):
        if b[j]:
            a[j]=iterate(a[j])
plt.plot(x,y)
plt.show()

g(x) 値のリストを取り、それぞれを変更する必要があるかどうかのブール値のリストを返します。

リストのすべての値を繰り返し処理していたコメントの直後の行として、最初に試したことが含まれています。私はこれを得た:

試行1

単調に近いようには見えないので、合計を減少させる値のみを反復してみました。

l=len(a)
n=[iterate(i) for i in a]
less=[n[i]<a[i] for i in range(l)]
if any(less):
    return less
m=[n[i]-a[i] for i in range(l)]
return [m[i]==min(m) for i in range(l)]

残念ながら、これは終了しません(少なくとも、のn1=200場合n2=400)。初期化することで、以前に見た値を追跡しようとしましたc=set()

l=len(a)
n=[iterate(i) for i in a]
less=[n[i]<a[i] for i in range(l)]
if any(less):
    return less
m={i:n[i]-a[i] for i in range(l)}
r=[i for i in m if m[i]==min(m.values())]
while all([a[i] in c for i in r]) and m != {}:
    m={i:m[i] for i in m if a[i] not in c}
    r+=[i for i in m.keys() if m[i]==min(m.values())]
for i in r:
    c.add(a[i])
return [i in r for i in range(l)]

ただし、それでも終了するわけではありません。

私はまだ何も試していませんが、新しいアイデアがあればここに投稿します。


あなたの興味と挑戦を復活させるための+1 thx。また... :)プラザ気軽に興味を持って他の人これは、パフォーマンスのために非常に良いではありませんが、あなたはとにかく受け入れを取得し、THXの私の小さなジェスチャーチャットそれについてや、さらに議論をチャットに私を招待
vzn

2

Python 3

私の主なアイデアは、各数値Collat​​zシーケンスをf(i)個別に関数に追加して、の合計の増加を最小限に抑えることでしたf(i)。結果の関数は厳密に減少しているわけではありませんが、(私の意見では)素晴らしい構造を持っています。2番目のグラフは、間隔が長く、f(i)罰関数が少し異なるように作成されました。要旨のコード。

Collat​​z1 Collat​​z2

代わりに(3 * n + 1)/ 2ルールを使用すると、アルゴリズムは完全に単調なf(i)!この変更により、vznのグラフも非常にスムーズになると思います。2番目のグラフは、の間隔を長くして作成されましたf(i)要旨のコード。

Collat​​z3 Collat​​z4

両方の結果は、より大きな[n,2*n]範囲で類似しています。


2番目の2つは小説/素晴らしい、これまでのところ最高の外部エントリです!完全に単調な減少は、突破口のようなものです!「同様の方法」で次第に大きくなる反復で機能することを示すことができれば、それは実際の証明戦略候補です...!
vzn 2015年

@vznいくつかの変更を加えると、厳密に単調fになる可能性があります。私の現在のアルゴリズムが失敗しても、かなりの改善の余地があります。私はそれを実行させて、いくつかn(200以上)で失敗するかどうかを確認します。厳密な単調性はCollat​​z予想よりも強いので、今のところそれを伝えます。:)関数は(3n + 1)/ 2ルールでうまく機能しますか?使ってみませんか?
randomra 2015年

@vzn非常に多くのアイデア...主なホールドバックは関連するxkcd :)です。単調な減少が続くようです。[1,n](単調さが保持している場合)、我々はまた、我々が作成できるかどうかが求めることができるので、範囲がより面白いかもしれません[1,n+1]変更しないで[1,n]ものをして追加することn+1、それに順序を。
randomra

共有されたインスピレーションを見るのはとても素晴らしいです!証明戦略は、一定サイズの「ブロック」など、どちらの方法でも機能します。引用されたpgの実験から、さまざまな戦略はより大きなnで「破綻」する傾向があります。言葉でアルゴリズムのより詳細な説明は素晴らしいでしょう。
vzn 2015年

fyiはこれをルビーに移植し、いくつかの基本的な実験を行いました。このコードは、ソートの非決定性に多少依存しているようですが、nが大きい場合はそうでない可能性があります。
vzn 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.