掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24170

交通量の分割配分プログラムについて
投稿者---gaya(2005/11/16 02:32:29)


今、交通量配分プログラムの作成中です。配分手法は分割配分法で、交通量を何回かに分割して、各回ごとにリンク速度を更新しながらダイクストラ法により最短経路探索を行い配分します。
リンクデータを読み込んでリンク走行時間を計算し、ダイクストラ法により最短経路を検索する所まで作成したのですが、この後の分割ODの配分と配分結果を受けてのリンク速度の更新、そしてこれを分割回数繰り返すという流れをどう書けばよいか解りません。
1.ダイクストラの部分はネット上のプログラム例を参考にして書いているのですが、スタート、終点、終点に至る直前の点、最短距離を出力します。後の交通量配 分のため、最短経路上のすべてのノードの流れを記録する方法は何かあるでしょ うか?
2.交通量配分後、次の回においてリンク速度を更新するために配分結果をリンク速度、走行時間計算の関数(calTweight)に渡すにはどうすればいいでしょうか?

初心者なもので基本的なこともよくわかっていません。よければアドバイスお願いします。

#include <stdio.h>
#include <stdlib.h>

#define max  9          /*ノードの数*/
#define FALSE    0
#define TRUE     1
#define M   999
float Tweight[max][max];   /*リンク間走行時間(リンク間重み)*/
int   Q[max][max];     /*リンク間交通量*/

void calTweight()
{
    float k[max][max], kyori;    /*リンク間距離*/
    float V[max][max];           /*交通量Qに対する走行速度*/
    int q1[max][max], ktryo1;    /*交通容量1*/
    int q2[max][max], ktryo2;  /*交通容量2*/
    int v1[max][max], soku1;     /*q1に対する走行速度*/
    int v2[max][max], soku2;     /*q2に対する走行速度*/
    int i,j;
    int vi,vj;
    FILE *ft;
    ft=fopen("qvdata.txt", "r");
    for(i=0; i < max; i++) for(j=0; j < max; j++) Tweight[i][j] = M;

    for(i=0; i < max; i++) {
        k[i][i] = q1[i][i] = q2[i][i] = v1[i][i] = v2[i][i] = 0;
    }
    for(i=1; i <= 17 ; i++)
    {
        fscanf(ft,"%d%d%f%d%d%d%d",&vi,&vj,&kyori,&ktryo1,&ktryo2,&soku1,&soku2); /*リンクデータをファイルから読み込む*/
        k[vi][vj] = k[vj][vi] = kyori; 
        q1[vi][vj] = q1[vj][vi] = ktryo1; 
        q2[vi][vj] = q2[vj][vi] = ktryo2;
            v1[vi][vj] = v1[vj][vi] = soku1; 
            v2[vi][vj] = v2[vj][vi] = soku2;
    }
    fclose(ft);
/*dijkstra()から配分結果Q[i][j]を渡したい,最初は全リンク0*/
    for(i=0; i < max; i++) {
            for(j=0; j < max; j++) {
                Q[i][j] = 0;
            }
    }
    /*Qの値からリンク走行時間を算出する(リンク間の交通容量qと速度vの関係式を用いる)*/
     for(i=0; i < max; i++) {
            for(j=0; j < max; j++) {
                if(Q[i][j] < q1[i][j]) {
                V[i][j] = v1[i][j];
                }
                else if(q2[i][j] < Q[i][j]) {
                    V[i][j] = v2[i][j];
                }
                else if((q1[i][j] < Q[i][j]) && (Q[i][j] < q2[i][j])) {
                    V[i][j] = v1[i][j] - ((v1[i][j]-v2[i][j]) * (Q[i][j]-q1[i][j])) / (q2[i][j]-q1[i][j]) ;
                }
                Tweight[i][j] = k[i][j] / V[i][j];
            }
        }
}
        void dijkstra()            /*ダイクストラ法により最短経路を検索する*/
        {
            float length[max];    /*各ノードまでの最短時間*/
            int i,j,start,next,min;
            int pred[max];            /*直前の点*/
            int access[max]; 
            
         calTweight();       /*リンク間重みとしてTweight[i][j]を算出*/
         
           for(start=0; start < max; start++) {
            for(i=0; i < max; i++)
            {
                access[i] = FALSE;
                length[i] = M;
            }
            length[start] = 0;
            next = start;
            do
            {
                i = next;
                access[i] = TRUE;
                min = M;
                for(j=0; j < max; j++)
                {
                    if(access[j]) continue;
                    if((Tweight[i][j] < M) && (length[i] + Tweight[i][j] < length[j]))
                    {
                        length[j] = length[i] + Tweight[i][j];
                        pred[j] = i;
                    }
                    if(length[j] < min)
                    {
                        min = length[j];
                        next = j;
                    }
                }
            }
            while(min < M);
            printf("スタート 終点 直前の点 最短時間\n");
            for(i=0; i < max; i++){
            if(i != start && access[i])
                    printf("%2d%10d%10d%10.3f\n",start, i, pred[i], length[i]);

            }
            }
        }
        int main()
        {
           int OD[max][max],odup,oddown;         /*OD交通量*/
           int od10[max][max];          /*OD交通量の10分の1*/
           int i,j,vi,vj;
            FILE *fu;
            fu=fopen("ODdata2.txt", "r");
       for(i=0; i < max; i++) {
        OD[i][i] = 0;
        od10[i][i] = 0;
         }
       for(i=1; i <= 36; i++)
       {
           fscanf(fu,"%d%d%d%d",&vi,&vj,&odup,&oddown);        /*OD交通量をファイルから読み込む*/
         OD[vi][vj] = odup;                                /*ODは2方向で別々に与える*/
         OD[vj][vi] = oddown; 
        } fclose(fu);
          for(i=0; i < max; i++) {
              for(j=0; j < max; j++) {
         od10[i][j] = OD[i][j] / 10;
              }
          } 

          dijkstra();        /*最短経路探索*/

     /*最短経路上の全リンクにOD交通量(10分の1)を配分、リンク間の交通量Q[i][j]を更新しながら分割回数分(10回)繰り返す*/   
        }



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:交通量の分割配分プログラムについて 24171 gaya 2005/11/16 02:38:39


No.24171

Re:交通量の分割配分プログラムについて
投稿者---gaya(2005/11/16 02:38:39)


書き忘れました。
OSはWin2000でコンパイラはVC++2003.netです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧