• 締切済み

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

これまでに質問に答えていただいた皆様、また、拙い質問の投稿の不備をご指摘していただいた皆様ありがとうございました。今回、更に課題が出てどうすればいいのか困っています。 それは、ノード間の通信量を計る、というものなのですが、前回のもふくめて問題を書きます。 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)} 制約 接続がつながっているノード同士は同じ色になってはいけない。 更に、隣のノードと通信をして、制約に違反していなければそのまま配色、違反していればその旨を元のノードに伝え、色の変更を要求する、という機能を追加しなければならなくなりました。 この、通信量を測れるようにするには、どのようなコードを書けばよいのでしょうか?教えてください。よろしくお願いします。

みんなの回答

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

#include <stdio.h> #define MAX_NODE 6 typedef struct { int n1; int n2; } LINK; int color[MAX_NODE]; // ノードの色が入る配列 int n_comm; // 通信回数 LINK link[] = {{0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5}, {0, 5}, {1, 4}}; int n_link = 7; bool check_link(int n) { int i; for(i = 0; i < n_link; i++) { int n1, n2; n1 = link[i].n1; n2 = link[i].n2; if(n2 == n - 1) { n_comm++; if(color[n1] == color[n2]) { return false; } } } return true; } bool aaa(int n) { int i; if(check_link(n) == false) { return false; } if(n >= MAX_NODE) { return true; } for(i = 0; i < 3; i++) { color[n] = i; if(aaa(n + 1) == true) { return true; } } return false; } int main() { int ans; int i; ans = aaa(0); if(ans == true) { printf("n_comm=%d\n", n_comm); for(i = 0; i < MAX_NODE; i++) { printf("%d, ", color[i]); } printf("\n"); } return 0; }

masassi19830818
質問者

補足

祖母が倒れ、入院しており、お返事が遅れてしまいすみませんでした。このプログラムをビルドしてみましたが、警告で、 「61行目、’==’:演算中の’int’型と’const bool’型の混用は安全ではありません。」 とでましたが、これはそのまま実行していいのでしょうか?何か修正点があれが教えてください。宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • moritan2
  • ベストアンサー率25% (168/670)
回答No.1

リンクの判定はリンクの情報がどのように与えられるのか仕様を明らかにしてもらわないと答えようがないと思うのですが、、、 その次の問題に関しても、どうも要求仕様がはっきりしません。元のノードというのが意味がはっきりしません。 また、3色でできないときはどうするのか? 平面の地図でもすこし複雑になると3色では足りず4色が必要なんですけど。4色なら平面の地図なら必ず塗り分け可能らしいですけど。この証明が、昔からある有名な難問で4色問題といいます。近年になってコンピュータを使った証明がされたらしいですけど。

masassi19830818
質問者

補足

moritan2さん、度々回答いただきありがとうございます。 僕が解きたい問題の基本形が下の図のようモノなんです。 ○-○-○ | | |   ○-○-○  <ノードの割り当ては上段左からX1、X2、X3、下段右からX4、X5、X6となっていて、線でつながっているノード同士は同じ色になってはいけない> という設定なんです。 通信は、例えば、X1が、自分が「赤」(三色問題として、色は赤、青、緑とします。)ということをX2にしらせ、X2は自分がなれる色(この場合、青と緑が可能)になります。 しかし、X2が、自身に割り当てられる色がなかった場合、X1にその旨を通知し、X1への色の変更を要求します。そしてまた、X2へ自分の色を通知するというわけです。 基本形は、ノード数6、リンク数7、色数3でしたが、特にノード数とリンク数を自分で設定できるようにして、その際の通信量をはかりたいというわけです。 これで、補足要求の答えになりましたでしょうか? もし足りない部分があったらまたお願いします。

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

関連する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)} 接続がつながっているノード同士は同じになってはいけないという設定なんですが、初心者なものでどうすればよいのか。。。 じぶんで本を読んだりしてみはしましたがさっぱりわからず困っています。 簡単なソースコードを教えてください。よろしくお願いします。 moritan2さん、trick--o--さん、回答ありがとうございました! 実は、この問題のノード数、色数、制約を可変的にしたいのです。よろしければ、ソースコードと、その簡単な説明をお願いします。たびたびすみません。。。

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

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

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

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

  • 非線形計画問題

    min f(x1,x2)=(x1-1)^2+x2^2 subject to x1+x2>=5 2x1+x2>=7 (計画変数x1,x2は非負) (1)KKT条件を示し、最適解x1*,x2*を求め、目的関数の最小値を示せ。 (2)最適解x1*,x2*が存在する鞍点において、制約条件式(x1+x2>=5)の右辺の値がσだけ増加したときの 目的関数の変化量を求めよ。また、このような変化量に対して、λ1*,λ2*がどのような意味をもつか簡潔に述べよ。 という問題です」。 (1)はノーマルな解法で解いたら, x1*=2,x2*=3,目的関数の最小値は10でした。 (2)については変化量を求めたら、5σ^2-10σでした。 ですが、「このような変化量に対して、λ1*,λ2*がどのような意味をもつか簡潔に述べよ。」 ところはわかりませんでした。 そこがわかる方がいらっしゃいましたら、ぜひご教授お願いします!

  • 非線形計画問題に関する質問

    非線形計画問題に関する質問 minimize f(x1,x2)=(x1-1)^2+x2^2 subject to x1+x2≧5 (1) 2x1+x2≧7 x1≧0 x2≧0 (1)の右辺の値がδだけ増加した時の目的関数の変化量と、この変化量に 対して乗数λ1,λ2はどのような意味を持つか述べよ という問題です。 最適値は(x1,x2)=(3,2)で乗数は(λ1,λ2)=(4,0) というところまで求めました。 変化量はδ^2/2かなとは思いますが、乗数の意味がわかりません。

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

    お久しぶりです。 わからない問題があったので教えていただけると助かります。 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式は必要だと思います。 問題のミスでしょうか? どなたか教えてください。