/* 資源配分問題に対する増分法のプログラム例 */ #include #include #define M 100 /* 配列Aの最大サイズ */ struct value /* 構造体valueの定義 */ { float d; int j; }; /* 関数の宣言 */ void resource(int n, int N); float fn(float x, int j); struct value deletemin(struct value *A, int n); void downmin(int i, struct value *A, int n); void insert(struct value dj, struct value *A, int n); void upmin(int i, struct value *A, int n); void heapify(struct value *A, int n); void swap(int i, int j, struct value *A); main() /* 資源配分問題のテストプログラム */ { int n, N; n=5; N=6; /* 変数の数nと右辺の値Nの設定 */ resource(n, N); return(0); } void resource(int n, int N) /* 増分法を用いて資源配分問題を解く. 変数の個数n, 右辺の値N. */ { struct value dj, min, inc[M]; /* incは増分量を貯えるヒープ */ int j, i, x[M]; /* xは解 */ float sum, fjx, fjx1; sum=0.0; for(j=0; j1) downmin(0, A, n-1); return(min); } void upmin(int i, struct value *A, int n) /* A[i]から上方へ、ヒープ条件回復のためswap操作を適用 */ { int j; if(i<0 || i>=n) { printf("Illegal element i = %d for n = %d\n", i, n); exit(); } if(i==0) return; j=(i+1)/2-1; if(A[j].d>A[i].d) { swap(i, j, A); upmin(j, A, n); } return; } void downmin(int i, struct value *A, int n) /* A[i]から下方へ、ヒープ条件回復のためのswap操作を適用; 最後の要素はA[n-1] */ { int j; if(i<0 || i>=n) { printf("Illegal element i = %d for n = %d\n", i, n); exit(); } j=2*i+1; if(j>=n) return; if(j+1A[j+1].d) j=j+1; if(A[j].d=0; i--) downmin(i, A, n); return; } void swap(int i, int j, struct value *A) /* 構造体A[i]とA[j]の交換 */ { struct value temp; temp=A[i]; A[i]=A[j]; A[j]=temp; return; }