TSPのプログラム制約条件設定方法について

このQ&Aのポイント
  • TSPのプログラムでパラメータを推計するためには、制約条件を設定する必要があります。しかし、具体的なコマンドがわからない場合もあります。
  • TSPのプログラムに制約条件を追加する方法はいくつかありますが、どのような制約条件を設定したいのかによって異なります。
  • 例えば、B0+B1+B2=1という制約条件を設定したい場合、LSQコマンドを使用して制約条件を定義することができます。具体的なコード例を以下に示します。
回答を見る
  • ベストアンサー

TSPのプログラムについて

パラメータを推計するためにTSPのプログラムを組んでいるのですが、 制約条件を設定する際のコマンドがわかりません。 OPTIONS CRT; FREQ N; SMPL 1 534; LOAD(FILE='C:\TSPEX\SUIKEI12.XLS'); FRML EQ P = B0+B1*LN(X1)+B2*LN(X2)+B3*L; PARAM B0 1.0 B1 B2 B3; LSQ(INST=(C X1 X2 L)) EQ; END; のプログラムに B0+B1+B2=1 という制約条件を入れたいのですが、どのようにしたらよいでしょうか。 よろしくお願いいたします。

  • jou-s
  • お礼率72% (72/100)

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

  • ベストアンサー
  • at9_am
  • ベストアンサー率40% (1540/3760)
回答No.1

一番簡単には FRML EQ P = B0+B1*LN(X1)+B2*LN(X2)+B3*L; PARAM B0 1.0 B1 B2 B3; を FRML EQ P = (1-B1+B2)+B1*LN(X1)+B2*LN(X2)+B3*L; PARAM B1 B2 B3; とすればよいです。 確か FRML EQsub コマンドで自動的に代入させる方法が使えたはずです。

jou-s
質問者

お礼

ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • TSPについて

    デスクトップ上に作業用フォルダーを作り、メモ帳でプログラムファイルを作成しそのフォルダの中に保存し、さらにエクセルファイルを保存しました。 プログラムを以下のように書いてLooking Classを起動してプログラムファイルを読み込んでもエラーが発生し出力が出ません。だれかご回答お願いします。 freq a: smpl 1980 2003: load(file='C:\tspex\kakei80-03.xls'); olsq CP C YD; graph YD CP;

  • 制約条件のある連立多元方程式の解法

    連立多元1次方程式で制約条件がある場合にその近似解を求めたいのですが、どのように解けばよいのでしょうか?数値計算ソフト(Mathcad)では勝手に解いてくれるのですがそのアルゴリズムが知りたいのです。 例えば、未知数をx1,x2,x3、その他はある定数で、 a1・x1+b1・x2+c1・x3 = A a2・x1+b2・x2+c2・x3 = B a3・x1+b3・x2+c3・x3 = C これに0<x1,x2,x3<1という制約条件があった場合などです。 よろしくお願いします。

  • 制約条件のある連立多元方程式の解法2

    連立多元1次方程式で制約条件がある場合について 再度質問させてください。 未知数をx1,x2,x3、その他はある定数で、 a1・x1+b1・x2+c1・x3 = A a2・x1+b2・x2+c2・x3 = B a3・x1+b3・x2+c3・x3 = C 制約条件が0<x1,x2,x3<1としたときの解法を前回伺いましたが、 ご回答で、 「まず方程式の解(x1=z1,x2=z2,x3=z3)を得たあと 制約条件を満たすもっとも近い解は、 距離の2乗= (z1-x1)^2 + (z2-x2)^2 + (z3-x3)^2を最小にする x1,x2,x3を求める問題に帰着されます。」 さらにシンプレックス法を使えばと言うアドバイスを頂きました。 そこでシンプレックスについていろいろ見てみましたが、目的関数がこのように2次になっている場合は良く分かりませんでした。 どうすれば良いのでしょうか?

  • C++で二次方程式のプログラム

    大分前に二次方程式のプログラムを作るって問題が出ていました。 しかし、セットで作ったプログラムのフローチャートを書くんですがフローチャートが分かりません。 条件は 虚数解 a=0 実数解 の場合分けをして、解を出すってプログラムなんですが、多分、それ自体は合っていると思います。 しかし、そのフローチャートを書きなさいって問題があったんですが、それが未だに分からないんですが、これをフローチャートに書くとすると、どう書けばいいですか? #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c,d,x0,x1; cout << "aを入力してください\n"; cin >> a; cout << "bを入力してください\n"; cin >> b; cout << "cを入力してください\n"; cin >> c; d=b*b-4*a*c; x0 = (-b + sqrt(d)) / (2 * a); x1 = (-b - sqrt(d)) / (2 * a); if(a==0) { cout << "解は1つで" << -c/b << "です\n"; } else if(d>0) { cout << "解は二つの実数解で,解は" << x0 << "," << x1 << "です\n"; } else { cout << "解は二つの虚数解で,解は" << (-b) / (2 * a) << "+i" << sqrt(-d) / (2 * a) << " , " << (-b) / (2 * a) << "-i" << sqrt(-d) / (2 * a) << "です\n"; } return 0; }

  • たわみ曲線の微分方程式について、質問があります。

    たわみ曲線の微分方程式について、質問があります。 「たわみ曲線の微分方程式」を使って、たわみ角とたわみを求める、という問題です。 最後のC1xとC3xの求め方がわかりません。 境界条件をどのように当てはめたら、できるのでしょうか? よろしくお願いします。 途中までの計算 A-C間のたわみ角とたわみ d^2Vx1/dx1^2 =-1/EI *(b/l *Px1) dVx1/dx1 =-1/EI *(1/2 *P*x1^2*b/l)+C1 Vx1=-1/EI *(1/6 *P*x1^3*b/l)+C1x+C2 X1=0のとき C2=0 Vx1=-1/EI *(1/6 *P*x1^3*b/l)+C1x C-B間のたわみ角とたわみ d^2Vx2/dx2^2 =-1/EI *(b/l *Px2) dVx2/dx2 =-1/EI *(1/2 *P*x2^2*b/l)+C3 Vx2=-1/EI *(1/6 *P*x2^3*b/l)+C3x+C4 X2=0のとき C4=0 Vx2=-1/EI *(1/6 *P*x2^3*b/l)+C3x

  • ln l y l = 2x^2 + C  が y

    ln l y l = 2x^2 + C  が y = ke^(2x^2)  ln l y l = x^2/2 + x + C が y = ke^(0.5x^2 + x)  に変えられる、というのが理解出来ません。 単純に ln l y l = 2x^2 + C  は y = e^(2x^2+C)  ln l y l = [( x^2)/2] + x + C は y = e^( 0.5x^2 + x + C) としか考えられません。 何故 ln l y l = 2x^2 + C  が y = ke^(2x^2)  ln l y l = x^2/2 + x + C が y = ke^(0.5x^2 + x) になるのか 説明して頂けますか?

  • ニュートン法をC言語でプログラム

    方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める という問題をC言語のプログラムを作り計算したいのですが分かりません。 自分で考えてみたプログラムは以下の通りです。 #include <stdio.h> #include <math.h> #define f1(x) cos(x)*cos(x)-0.5 #define f2(x) sin(2*x) /* ニュートン法による方程式の解 */ main() { double x0,x1,a,b,c,d,g,n; a=1; x0=0.7; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解 x= %f \n", a,x1); x0=x1; } } 自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。 参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。 例: e^x-3=0 の解をニュートン法により計算する。 #include <stdio.h> #include <math.h> #define f1(x) exp(x)-3 #define f2(x) exp(x) /* ニュートン法による方程式の解 */ main() { double x0,x1,e,a,b,c,d,g,n; a=1; x0=3; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解  x= %f \n", a,x1); x0=x1; } }

  • シンプレックスの単体表の作り方がわかりません!

    シンプレック法による解法で単体表を作らなければならないのですが、その単体表の作り方の手順がわからなくて困っています。問題は以下のとおりです。 次の問題をシンプレックス法で解きなさい。  目的関数   Z=4x1 +3x2  →最大  制約条件   2x1 +1x2 ≦30  (a)   3x1 +4x2 ≦60  (b)   1x1 +2x2 ≦26  (c)   (x1 ≧0,x2 ≧0)

  • 2次形式の解を求めるプログラム

    例えば x1^2+x2^2+x3^2+…+xn^2=m(mは整数) の解、x1,x2,x3,…,xn(全て整数) を求めるようなプログラムはありますか? また作成可能ですか? もしあったり可能なのであれば、詳細について教えていただければありがたいです。 Cに限らずどの言語でも構わないです。お願いします。 例えば x1^2+x2^2=1 の解は x1=0,x2=1 またはx1=1,x2=0

  • この2つのプログラムは全く同じものでしょうか?

    class Base{ protected int x; Base() { this.x=0;} Base(int x) {this.x=x;} void print(){ System.out.println("Base.x="+x);} } class Derived extends Base{ int x; Derived(int x1,int x2){ super(x1); this.x=x2;} void print(){ super.print(); System.out.println("Derived.x="+x);} } public class SuperTester{ public static void main(String[] args){ Base a =new Base(10); System.out.println("----a----"); a.print(); Derived b=new Derived(20,30); System.out.println("----b----"); b.print(); } } このプログラムと、 このプログラムのDerivedクラスのコンストラクタの部分を Derived(int x1,int x2){ super.x=x1; this.x=x2;} に変えたプログラムです。 かなりややこしいのですが、この2つのプログラムはソースは一部違いますが、 意味するものは全く同じでしょうか? ちなみにこの2つは実行結果は同じになります。 【実行結果】 ----a---- Base.x=10 ----b---- Base.x=20 Derived.x=30 つまり、Derivedクラスでint x;を書かず、 よろしくお願いします。

    • ベストアンサー
    • Java