質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1194閲覧

シンプレックス法の実現

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/06/03 23:45

前提・実現したいこと

C言語で線形計画問題のシンプレックス法を実現したい

発生している問題・エラーメッセージ

例題を解いてみたが、プログラムが終了しない。
永遠にシンプレックスタブローの計算をしてしまっている

目的関数: 第1変数の係数>1 第2変数の係数>1 第3変数の係数>1 条件式: 第1条件式の係数: 第1変数の係数>1 第2変数の係数>-1 第3変数の係数>2 第1条件式の定数>8 第2条件式の係数: 第1変数の係数>2 第2変数の係数>-3 第3変数の係数>-1 第2条件式の定数>1 シンプレックス表:( ) は変数の番号 -1.000 -1.000 -1.000 0.000 0.000 0.000 1.000 -1.000 2.000 1.000 0.000 8.000 (4) 2.000 -3.000 -1.000 0.000 1.000 1.000 (5) シンプレックス表:( ) は変数の番号 0.000 -2.500 -1.500 0.000 0.500 0.500 0.000 0.500 2.500 1.000 -0.500 7.500 (4) 1.000 -1.500 -0.500 0.000 0.500 0.500 (1) シンプレックス表:( ) は変数の番号 -1.667 0.000 -0.667 0.000 -0.333 -0.333 0.333 0.000 2.333 1.000 -0.333 7.667 (4) -0.667 1.000 0.333 -0.000 -0.333 -0.333 (2) シンプレックス表:( ) は変数の番号 0.000 -2.500 -1.500 0.000 0.500 0.500 0.000 0.500 2.500 1.000 -0.500 7.500 (4) 1.000 -1.500 -0.500 0.000 0.500 0.500 (1) シンプレックス表:( ) は変数の番号 -1.667 0.000 -0.667 0.000 -0.333 -0.333 0.333 0.000 2.333 1.000 -0.333 7.667 (4) -0.667 1.000 0.333 -0.000 -0.333 -0.333 (2) シンプレックス表:( ) は変数の番号 0.000 -2.500 -1.500 0.000 0.500 0.500 0.000 0.500 2.500 1.000 -0.500 7.500 (4) 1.000 -1.500 -0.500 0.000 0.500 0.500 (1) シンプレックス表:( ) は変数の番号 -1.667 0.000 -0.667 0.000 -0.333 -0.333 0.333 0.000 2.333 1.000 -0.333 7.667 (4) -0.667 1.000 0.333 -0.000 -0.333 -0.333 (2) シンプレックス表:( ) は変数の番号 0.000 -2.500 -1.500 0.000 0.500 0.500 0.000 0.500 2.500 1.000 -0.500 7.500 (4) ......

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define K 3 // 変数の個数 5#define L 2 // 条件式の数 6#define M L+1 // タブローの全行数 7#define N K+L+1 // タブローの全列数 8 9// タブローの入力 10void inputTab(double tab[M][N],int ids[L]){ 11 int i,j,k; 12 double elm; 13 14 // クリヤー 15 for(i=0;i<M;i++) { 16 for(j=0;j<N;j++) { 17 tab[i][j] = 0.; 18 } 19 } 20 // 目的関数の係数入力 21 printf("目的関数:\n"); 22 for(j=0;j<K;j++) { 23 printf(" 第%d変数の係数>",j+1); 24 scanf("%lf",&elm); 25 tab[0][j] = -elm; 26 } 27 // 条件式の係数と定数の入力 28 printf("条件式:\n"); 29 for(i=1;i<M;i++) { 30 printf(" 第%d条件式の係数:\n",i); 31 for(j=0;j<K;j++) { 32 printf(" 第%d変数の係数>",j+1); 33 scanf("%lf",&tab[i][j]); 34 } 35 printf(" 第%d条件式の定数>",i); 36 scanf("%lf",&tab[i][N-1]); 37 } 38 // スラック単位行列 39 for(i=1;i<M;i++) { 40 for(j=K;j<N-1;j++) { 41 tab[i][j] = 0.; 42 } 43 tab[i][K+i-1] = 1.; 44 } 45 // スラック変数idの登録 46 for(k=0;k<L;k++) { 47 ids[k] = K+k+1;//@ 48 } 49 return; 50} 51// タブローの表示 52void printTab(double tab[M][N],int ids[L]){ 53 int i,j; 54 55 printf("シンプレックス表:( ) は変数の番号\n"); 56 for(i=0;i<M;i++) { 57 for(j=0;j<N;j++) { 58 printf(" %6.3f",tab[i][j]); 59 } 60 if( i==0 ) printf("\n"); 61 else printf(" (%d)\n",ids[i-1]); 62 } 63 return; 64} 65// 変数列の第1行で最小列を探す→kmin(-1; not found) 66int srchnxt(double target[K]){ 67 int jvar,kmin; 68 double maxv; 69 70 kmin = -1; 71 for(maxv=jvar=0;jvar<K;jvar++) { 72 if(fabs(target[jvar]) > maxv ) { 73 maxv = fabs(target[jvar]); 74 kmin = jvar; 75 } 76 } 77 return kmin; 78} 79// 選んだ変数列の中で行を選ぶ 80int select(int jvar,double tab[M][N],int ids[L]){ 81 int icon; 82 double tstv; 83 double minv; 84 int jmin; 85 86 for(icon=1;icon<M;icon++) { 87 tstv = tab[icon][N-1]/tab[icon][jvar]; 88 if( icon==1 ) { 89 minv = tstv; 90 jmin = icon; 91 } else { 92 if(tstv<minv) { 93 minv = tstv; 94 jmin = icon; 95 } 96 } 97 } 98 ids[jmin-1] = jvar+1;//@ 99 return jmin; 100} 101// 変数(jvar)の第(icon)条件をピボットとして消去 102int reduce(double tab[M][N],int icon,int jvar) { 103 int i,j; 104 double pivot,ipv; 105 106 pivot = tab[icon][jvar]; 107 if( pivot == 0 ) return 1; 108 for(j=0;j<N;j++) { 109 tab[icon][j] /= pivot; 110 } 111 for(i=0;i<N;i++) { 112 if( i==icon ) continue; 113 ipv = tab[i][jvar]; 114 for(j=0;j<N;j++) { 115 tab[i][j] -= ipv*tab[icon][j]; 116 } 117 } 118 return 0; 119} 120// シンプレックス法 121int simplex(double tab[M][N],int ids[L]){ 122 int icon,jvar,kerr; 123 int k; 124 while( (jvar=srchnxt(tab[0])) >= 0 ) { 125 icon = select(jvar,tab,ids); 126 kerr=reduce(tab,icon,jvar); 127 printTab( tab,ids ); 128 if( kerr ) { 129 printf("ピボット縮退のため中止。\n"); 130 return 1; 131 } 132 } 133 printf("シンプレックス解\n"); 134 for(k=1;k<=K;k++) { 135 printf("変数 (%d): %6.3f\n",ids[k-1],tab[k][N-1]); 136 } 137 printf("目的関数: %6.3f\n",tab[0][N-1]); 138 return 0; 139} 140int main(){ 141 double tab[M][N]; 142 int ids[L]; 143 144 inputTab( tab,ids ); 145 printTab( tab,ids ); 146 simplex ( tab,ids ); 147 return 0; 148}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答、ではないですが、
VisualStudioやEclipseなど、C言語で、ソース上で任意の行でブレークさせ、変数の値をモニタしながらワンステップづつ実行させるという機能を持った統合環境がありますので、そういうのでデバッグなされたらどうでしょうか。

#おまけに無料です

投稿2018/06/04 04:50

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問