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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

1回答

5957閲覧

2-opt法がわかりません。

takuro23

総合スコア6

C

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2016/07/11 13:54

編集2016/07/12 02:58

今,c言語でNN法やった後に改善法で2-opt法を実行するプログラムを書いているんですけど、アルゴリズムは、理解できたですけどうまく書きあらわすことができないんで皆様の力を貸して欲しいです。その回答をみながら勉強させて欲しいです。

c言語,

1コード 2``#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> 3 4 5struct City { 6 int id; 7 float x; 8 float y; 9}; 10 11struct City city_data[1000000]; 12int city_data_num = 0; 13 14/* The program starts here */ 15int main(int argc, char** argv) 16{ 17 char line[512]; 18 FILE* fp; 19 20 /* check the number of arguments */ 21 if (argc != 2) { 22 printf("usage: ./a.out input_file_name\n"); 23 exit(1); 24 } 25 26 /* check whether the file can be opened */ 27 fp = fopen(argv[1], "r"); 28 if (fp == NULL) { 29 printf("The file (%s) cannot be opened!\n", argv[1]); 30 exit(1); 31 } 32 33 /* read city data and write the position of each city into the array "city_data" */ 34 while(fgets(line, sizeof(line), fp)) { 35 char* line_r; 36 line_r = strtok(line, " \t\n"); 37 city_data[city_data_num].id = (int)strtol(line_r, NULL, 10); 38 line_r = strtok(NULL, " \t\n"); 39 city_data[city_data_num].x = (float)strtod(line_r, NULL); 40 line_r = strtok(NULL, " \t\n"); 41 city_data[city_data_num].y = (float)strtod(line_r, NULL); 42 city_data_num++; 43 } 44 45 /* do traveling and calculate the distance */ 46 do_travel(); //nn法のソースコートは省いています。 47 48}

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

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

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

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

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

Zuishin

2016/07/12 01:15

インデントはとても大事です。include も巨大化させる意味はありませんし、「#」が消えています。
WoodenHamlet

2016/07/12 02:11

質問を書き込むときに「B I A ○ □ ” </> 三 三 ― <>」みたいなボタンが書き込み欄の上にあると思います。その</>ボタンがソースコードを打ち込むときに使うボタンです。一度押してみてください。使い方は直感的に判るはずです。
Zuishin

2016/07/12 03:07

修正ありがとうございます。おしい。もうちょっと頑張ってみてください。
WoodenHamlet

2016/07/12 08:09

その</>ボタンは何のためのボタンなのか考えてみて、そして自分の質問文がよみやすく表示されているのかどうか読み直して。ボタンを押しゃー良いみたいな話じゃないでしょう
guest

回答1

0

未だ質問が見づらいままですが,一応回答をば.

実装方法としては,巡回路を配列で持っている場合とリストで持っている場合で違ってくるのですが,もし配列で巡回路を持っているなら,2本の枝交換は実質配列内の部分要素列をひっくり返す操作と同じなので,それで実装できます.

2opt_with_array.c

1typedef struct { 2 unsigned length; 3 unsigned *data; 4} path_t; 5 6void apply_2opt(path_t* path, unsigned i, unsigned j) 7{ 8 unsigned start = (i < j ? i : j); // 開始点のインデックス 9 unsigned end = (i < j ? j : i); // 終了点のインデックス 10 // 開始点から終了点まで前と後ろを入れ替える 11 while(start < end) { 12 unsigned tmp = path->data[start]; 13 path->data[start] = path->data[end]; 14 path->data[end] = tmp; 15 ++start; 16 --end; 17 } 18}

コードとか間違ってるかもしれないので,その辺は自分で確認しながらやってみてください.

ちなみにリストの方(なんかもっと簡単な方法があったはずだけど,忘れたのでベタな方法で)

2opt_with_list.c

1typedef struct _path_t { 2 unsigned city; 3 struct _path_t* prev_city; 4 struct _path_t* next_city; 5} path_t; 6 7void swap_prev_next(path_t* path) 8{ 9 path_t* tmp = path->next_city; 10 path->next_city = path->prev_city; 11 path->prev_city = tmp; 12} 13 14void apply_2opt(path_t* path, unsigned i, unsigned j) 15{ 16 // 開始点を求める 17 path_t* start = path; 18 while(start->city != i) start = start->next_city; 19 // 終了点を求める 20 path_t* end = path; 21 while(end->city != j) end = end->next_city; 22 // 間をひっくり返す 23 path_t* p = start; 24 while(p != end) { 25 path_t* old_next = p->next; 26 swap_prev_next(p); 27 p = old_next; 28 } 29 // 両端をひっくり返す 30 path_t* tmp = start->next_city; 31 start->next_city = end->prev_city; 32 end->prev_city = tmp; 33}

投稿2016/07/14 10:06

tamy

総合スコア442

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問