• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:色塗り問題の件、お願いします。前回は僕の説明不足でした。。。)

三色色塗り問題を解くための簡単なソースコードと説明

このQ&Aのポイント
  • 三色色塗り問題を解くための簡単なソースコードと、その説明を紹介します。
  • 条件は、6つのノードと3つの色があり、接続がつながっているノード同士は同じ色になってはいけません。
  • 初心者でも理解しやすいように、ソースコードを提供しますので、参考にしてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • moritan2
  • ベストアンサー率25% (168/670)
回答No.1

いろんなやり方があるけど、初心者向きにわかりやすさを重視するなら再帰をつかうのがいいでしょう。 int a[MAX_NODE]; // ノードの色が入る配列 bool check_link(int n) { // n個目までのノードの色がa[]に入っている時、そこまでリンクのあるノードに同じものがないかをチェックする関数 // 違反がなければ true、あれば false、n < 2 の時は常に true // この関数ぐらいは自分で書けるでしょ } bool aaa(int n) { int i; if(check_link(n) == false) { // チェックがfalseなら失敗なので、戻る return false; } // ここまで n個目までは違反がないことがわかった if(n >= MAX_NODE) { // n >= MAX_NODE なら答えは a[] に完成している return true; } for(i = 0; i < 3; i++) { // n+1個目の色を順番に試す a[n] = i; if(aaa(n + 1) == true) { // 正解が見つかった return true; } } return false; } これで aaa(0); を呼び出して true が返ってきたら答えは a[] に完成しているし、false なら解は存在しない。 ただし、上の方法はあくまでも原理を記述したもので、ノード数が多くてリンクもたくさんなら 解を得るまでの時間を短縮するためにいろいろ工夫が必要になるでしょう。 たとえば check_link(n)は、一つ前(n-1)までは真であることが確認済みと仮定するとか。

masassi19830818
質問者

補足

moritan2さん、 //n個目までのノードの色がa[]に入っている時、そこまでリンクのあるノードに同じものがないかをチェックする関数 // 違反がなければ true、あれば false、n < 2 の時は常に true // この関数ぐらいは自分で書けるでしょ のところも教えていただけないでしょうか? できもしないのに手を出してしまって、困っています。提出しなければいけない状況なんで、もし差し支えなければよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • グラフ色塗り問題のプログラミングができなくて困っています。

    すいません、よろしくお願いします。三色色塗り問題を解きたいのですが、よくわかりません。 条件はこのようになっています。 ノード数 6 V={X1、X2、X3、X4、X5、X6} 色数 3 接続{(X1,X2)、(X2,X3)、(X3,X4)、(X4,X5)、(X5,X6)、(X6,X1)、(X2,X5)} 接続がつながっているノード同士は同じになってはいけないという設定なんですが、初心者なものでどうすればよいのか。。。 じぶんで本を読んだりしてみはしましたがさっぱりわからず困っています。 簡単なソースコードを教えてください。よろしくお願いします。

  • 色塗り問題について、新たな質問です。よろしくお願いします。

    これまでに質問に答えていただいた皆様、また、拙い質問の投稿の不備をご指摘していただいた皆様ありがとうございました。今回、更に課題が出てどうすればいいのか困っています。 それは、ノード間の通信量を計る、というものなのですが、前回のもふくめて問題を書きます。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1962022にあるmoritan2さんに頂いた回答の「n個目までのノードの色がa[]に入っている時、そこまでリンクのあるノードに同じものがないかをチェックする関数、違反がなければ true、あれば false、n < 2 の時は常に true」というものも併せて教えていただけると幸いです。 「色塗り問題」 <条件> ノード数 6 V={X1、X2、X3、X4、X5、X6} 色数 3 接続{(X1,X2)、(X2,X3)、(X3,X4)、(X4,X5)、(X5,X6)、(X6,X1)、(X2,X5)} 制約 接続がつながっているノード同士は同じ色になってはいけない。 更に、隣のノードと通信をして、制約に違反していなければそのまま配色、違反していればその旨を元のノードに伝え、色の変更を要求する、という機能を追加しなければならなくなりました。 この、通信量を測れるようにするには、どのようなコードを書けばよいのでしょうか?教えてください。よろしくお願いします。

  • わからない問題があるので助けてください。

    お久しぶりです。 わからない問題があったので教えていただけると助かります。 g(x) ≧ 0 なる制約の下でf(x) を最大化する問題を考える。 これが凸計画問題であるとき、(x1、λ1)がL(x、λ) = f(x) + λg(x) の鞍点ならば、x1は最適解であることを証明せよ。 という問題です。 お願いします。

  • 非線形計画法 主-双対問題

    次のような制約付き最小化問題を考えています。 目的関数は非線形です。 min x1^2+x2^2 s.t. -x1-x2+4<=0 x1>=0 x2>=0 この問題の場合最適解は(x1,x2)=(2,2)であり、その時の目的関数値は8となります。 次に次式のような双対問題を考えます。 g(x)=-x1-x2+4とおき 双対関数 φ(u)=inf{x1^2+x2^2+u*(-x1-x2+4) : x1>=0 , x2>=0} =inf{x1^2-u*x1 : x1>=0}+inf{x2-2-u*x2 : x2>=0}+4*u 上記においてもしu>=0であれば、x1=x2=(u/2). (なぜなら、x1^2-u*x1をx1で微分するとx1=u/2となる。) u<0であるならばx1=x2-0であることに注目しますと。 φ(u)=-(1/2)*u^2+4*u for u>=0 =4u for u<0 となります. 双対関数がu>0の場合は最大がu=4であることに注目すると、その時の目的関数は8であり、主問題と双対問題の最適な目的関数値は一緒となります。 次に主問題を次のように制約を増やした最小化問題を考えます。 min x1^2+x2^2 s.t. -x1-x2+4<=0 -2*x1-3*x2<=0 x1>=0 x2>=0 これの最適解は上記の問題と同じにならないといけないのですが、 例えば、ラグランジュ関数F(x1,x2,λ1,λ2)を次のようにおき各変数で偏微分して最適解を求めると(λ:ラグランジュ乗数)、 F(x1,x2,λ1,λ2)=x1^2+x2^2+λ1*(-x1-x2+4)+λ2*(-2*x1-3*x2) 最適解はx1=12, x2=-8であり、その時の目的関数は208となり、前問と異なった解が得られました。 この原因は明確であり、ラグランジュ関数の中の各制約式が、偏微分して解を得ることで不等式制約ではなく等式制約とみなされたためです。 偏微分して解を求めなければいいのですが、どうしても偏微分でかいを求めたいために、、前門で示した双対問題を導入しましたが、結果は双対問題のほうでも偏微分するので一緒でした。 しかし、双対問題で得られた解。つまりuは主問題のλに相当し、KKT条件より必ず正である必要があるので、双対問題を解き、uが負になった制約式はの除いてそのあともう一度問題を解きなおす。つまり2番目の問題を前問に置き換える。 っといったことをして問題を解決させようとかんがえていますが、これは理論的に正しいのでしょうか。 これはほんの例題ですが、複数個の不等式制約式を扱い、かつ偏微分可能な最適化問題を解く際に、最適解に対して全てが有効制約になるとは限りませんので、どうかうまくいくアドバイスをください。

  • 最適化の計算問題なんですが

    はじめまして 最適化のレポート問題なのですが 目的 :z = 3x1 - 5x2 → Max 制約 :x1 + 2x2 ≤ 7 (i) -4x1 + 3x2 ≤ 5 (ii) x1, x2 ≥ 0 を考える 。 以下の各問いに答えよ 。 (1) 最適解および最適値を求めよ 。 (2) 最適基底行列およびその逆行列は何か 。 という問題で、(1)はシンプレックスタブロー法で x1=7, x2=0, x3=0, x4=33 最適値=21 と求まったのですが 最適基底行列とはなんですか? 教えて頂きたいです。 お願いしますm(__)m

  • 制約つき最適化問題

    最小化:f(x1,x2)=(x1)^2+(1/3)(x2)^2 制 約:g(x1,x2)=-x1-x2+1<0 という制約条件が1つの問題であれば、ψ=(-x1-x2+1)^2とすることで拡張目的関数が F(x1,x2,r)=f(x1.x2)+rψ(x1,x2) =(x1)^2+(1/3)(x2)^2+r(-x1-x2+1)^2 ただし(-x1-x2+1<0である時) となり、極小解を求めると、制約を満足していない領域においては dF/dx1=(1+r)x1+rx2-r=0 dF/dx2=3rx1+(1+3r)x2-3r=0 より x1=r/(4r+1) x2=3r/(4r+1) r=∞であるので、x1=1/4 x2=3/4と求まります。 --------------------------------------------------------------- 以前に制約が複数個にしたらどうなるのか質問させてもらったんですが、拡張目的関数を編微分するということは理論的にどういうことを意味しているのでしょうか。 単純に目的関数を各変数について編微分すると局所部分がわかるということなのですが、ペナルティ関数項が入った場合も同じようなことがいえるのでしょうか?

  • 至急お願いします!線形計画問題についてです。

    maximize 7x1 + 4x2 + 2x3 subject to 3x1 + 3x2 + x3 ≦ 36 .................. 2x1 + x2 + x3 = 18 .................. x1,x2,x3≦0 この問題を2段階法により解けという問題なのですが、x1,x2,x3と3変数も出てきているのに、制約関数が2式のみって、解くことができないですよね?3変数であれば最低でも3式は必要だと思います。 問題のミスでしょうか? どなたか教えてください。

  • ばねの問題

    以前も質問したのですがもう一度詳しく質問させてもらいます よくある問題なのですが式の立て方がわかりません 問題 バネ定数kのバネで結ばれた2つの質点1および2がある。 質点1および2の質量をMおよびmとする 位置をx1およびx2とする。 両質点にバネから力が作用しない際のバネの長さ(自然長)をδとする。 質点はバネの伸縮するx軸方向のみに運動するものと仮定する。 (1)質点Aおよび質点Bの運動方程式を完成させよ M・((d^2(x1))/(dt^2))=k(x2-x1-δ)・・(1) m・((d^2(x2))/(dt^2))=-k(x2-x1-δ)・・(2) とあるのですが自分の考えでは ____OwwwwwwwwwO ____x1____o1_______o2___x2___ 質点1の位置:x1 質点2の位置:x2 質点1の自然長での位置:o1 質点2の自然長での位置:o2 としたとき x1についての自然長からののび:x2-x1-δ-(x2-o2) となるではないでしょうか? お願いします

  • 限界代替率と予算制約線の問題

    次の問題がわからないので教えてください 「ある個人の効用関数と予算制約式が以下の時、この個人の最適消費量を求めよ」 U(x1、x2)=x1^2,x2^3 400x1+600x2≦10000

  • 【至急】線形計画問題について、ヒントをください!

    maximize 7x1 + 4x2 + 2x3 subject to 3x1 + 3x2 + x3 ≦ 36 .................. 2x1 + x2 + x3 = 18 .................. x1,x2,x3≦0 . この問題の最適解と最適値を求めたいのですが、、まず標準形の線形計画問題に変形する段階で、 2x1 + x2 + x3 = 18 と、 = がでできてしまい、 subject to 3x1 + 3x2 + x3 + x4 = 36 ................... 2x1 + x2 + x3 + x5 = 18 ................... x1,x2,x3,x4,x5≦0 としていいのか、 subject to 3x1 + 3x2 + x3 + x4 = 36 ................... 2x1 + x2 + x3 = 18 ................... x1,x2,x3,x4≦0 としていいのかが分かりません。 ≦ や ≧ ではなく、= が制約関数に含まれていると、標準形ではどの様に変形すれば宜しいのでしょうか? どなたか教えてください。また、理由もお聞かせ頂けると幸いです。