現在GAを用いたナーススケジューリング問題について勉強しています。そこでは二次元配列を用いるのですが、配列の要素数を大きくすると動かなくなってしまいます。ある一定の数までは動くためプログラミング自体はできているとおもうのですが。。
いろいろ自分なりに考えて改良をしていったのですが、そもそも動かなくなってしまったりと、泥沼にはまってしまいます。
自分の考えとしてはメモリを使いすぎてしまっているのかなと思っているのですが、対処法がわかりません。
皆さんの考えをお聞きしたいです。よろしくお願いします。
(コードを載せようとしましたが500行を超えてしまっているため、お見苦しいかなと思い原因についてお聞きしました。)
数値を大きくすると動かなくなる
Re: 数値を大きくすると動かなくなる
ソースコードが提示されてへんから何とも言えんけど、
配列をstaticにしてみるとか?
配列をstaticにしてみるとか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 数値を大きくすると動かなくなる
外部シンボルが未解決っちゅうんは
配列のサイズの問題やなくて
関数名のスペリングが間違うてるとかいう感じで
あるはずのない関数を呼んでしもてる、とかとちゃうかな?
確認してみては?
あるいは、そのときのエラーメッセージを提示するとか?
配列のサイズの問題やなくて
関数名のスペリングが間違うてるとかいう感じで
あるはずのない関数を呼んでしもてる、とかとちゃうかな?
確認してみては?
あるいは、そのときのエラーメッセージを提示するとか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 数値を大きくすると動かなくなる
「動かなくなる」というのは
・コンパイルが通らなくなる
・コンパイルは通るけど、実行すると異常終了する
・コンパイルは通り、実行でき、なかなか結果が出ない
どれですか?
また、「一定の数」というのはどの程度ですか?
数によっては、本当にメモリを使いすぎかもしれません。
目安として、1要素が4バイトの場合
1024×1024 → 4MiB
2048×2048 → 16MiB
8192×8192 → 256MiB
16384×16384 → 1GiB
32768×32768 → 4GiB
65536×65536 → 16GiB
となります。
同じ要素数・要素のサイズの配列を複数用いる場合、記憶容量もそれに応じて大きくなります。
32bitのプロセスだと、最大でも約4GiBくらいまでしかRAMを使えない可能性もあります。
・コンパイルが通らなくなる
・コンパイルは通るけど、実行すると異常終了する
・コンパイルは通り、実行でき、なかなか結果が出ない
どれですか?
また、「一定の数」というのはどの程度ですか?
数によっては、本当にメモリを使いすぎかもしれません。
目安として、1要素が4バイトの場合
1024×1024 → 4MiB
2048×2048 → 16MiB
8192×8192 → 256MiB
16384×16384 → 1GiB
32768×32768 → 4GiB
65536×65536 → 16GiB
となります。
同じ要素数・要素のサイズの配列を複数用いる場合、記憶容量もそれに応じて大きくなります。
32bitのプロセスだと、最大でも約4GiBくらいまでしかRAMを使えない可能性もあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 数値を大きくすると動かなくなる
関数名を間違えてるといったことはなかったです。
エラーメッセージは
”外部シンボル"public:static int(*shift::nurse_work)[30])"(?nurse_work@shift@@2PAY0BO@HA)は未解決です”となっています。下のURLからするとビルドができなかったのでコンパイルに何か原因ができた感じでですかね?
https://learn.microsoft.com/ja-jp/cpp/e ... w=msvc-170
エラーメッセージは
”外部シンボル"public:static int(*shift::nurse_work)[30])"(?nurse_work@shift@@2PAY0BO@HA)は未解決です”となっています。下のURLからするとビルドができなかったのでコンパイルに何か原因ができた感じでですかね?
https://learn.microsoft.com/ja-jp/cpp/e ... w=msvc-170
Re: 数値を大きくすると動かなくなる
コンパイルは通っているけど何も結果が出ずに終了するといった感じです。(staticをつけない場合)
一定の数というのは構造体に二次元配列を定義していて、構造体の数は100個、二次元配列の大きさは4*10で、表のテーブルとしては4000です。ただ、別の配列に一つ一つ置き換えていたり、ループ回数もかなり使ってはいます。
一定の数というのは構造体に二次元配列を定義していて、構造体の数は100個、二次元配列の大きさは4*10で、表のテーブルとしては4000です。ただ、別の配列に一つ一つ置き換えていたり、ループ回数もかなり使ってはいます。
Re: 数値を大きくすると動かなくなる
どこかに発見されていないバグがあるとしか
いいようがないですね
いいようがないですね
Re: 数値を大きくすると動かなくなる
メンバの定義ではなく、インスタンスの定義 (構造体の変数宣言) に static をつけるとどうなりますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)