static int ipm_main(struct csa *csa) { int m = csa->m; int n = csa->n; int i, j, status; double temp; /* choose initial point using Mehrotra's heuristic */ if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Guessing initial point...\n"); initial_point(csa); /* main loop starts here */ if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Optimization begins...\n"); for (;;) { /* perform basic computations at the current point */ basic_info(csa); /* save initial value of rmu */ if (csa->iter == 0) csa->rmu0 = csa->rmu; /* accumulate values of min(phi[k]) and save the best point */ xassert(csa->iter <= ITER_MAX); if (csa->iter == 0 || csa->phi_min[csa->iter-1] > csa->phi) { csa->phi_min[csa->iter] = csa->phi; csa->best_iter = csa->iter; for (j = 1; j <= n; j++) csa->best_x[j] = csa->x[j]; for (i = 1; i <= m; i++) csa->best_y[i] = csa->y[i]; for (j = 1; j <= n; j++) csa->best_z[j] = csa->z[j]; csa->best_obj = csa->obj; } else csa->phi_min[csa->iter] = csa->phi_min[csa->iter-1]; /* display information at the current point */ if (csa->parm->msg_lev >= GLP_MSG_ON) xprintf("%3d: obj = %17.9e; rpi = %8.1e; rdi = %8.1e; gap =" " %8.1e\n", csa->iter, csa->obj, csa->rpi, csa->rdi, csa->gap); /* check if the current point is optimal */ if (csa->rpi < 1e-8 && csa->rdi < 1e-8 && csa->gap < 1e-8) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("OPTIMAL SOLUTION FOUND\n"); status = 0; break; } /* check if the problem has no feasible solution */ temp = 1e5 * csa->phi_min[csa->iter]; if (temp < 1e-8) temp = 1e-8; if (csa->phi >= temp) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("PROBLEM HAS NO FEASIBLE PRIMAL/DUAL SOLUTION\n") ; status = 1; break; } /* check for very slow convergence or divergence */ if (((csa->rpi >= 1e-8 || csa->rdi >= 1e-8) && csa->rmu / csa->rmu0 >= 1e6) || (csa->iter >= 30 && csa->phi_min[csa->iter] >= 0.5 * csa->phi_min[csa->iter - 30])) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("NO CONVERGENCE; SEARCH TERMINATED\n"); status = 2; break; } /* check for maximal number of iterations */ if (csa->iter == ITER_MAX) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("ITERATION LIMIT EXCEEDED; SEARCH TERMINATED\n"); status = 3; break; } /* start the next iteration */ csa->iter++; /* factorize normal equation system */ for (j = 1; j <= n; j++) csa->D[j] = csa->x[j] / csa->z[j]; decomp_NE(csa); /* compute the next point using Mehrotra's predictor-corrector technique */ if (make_step(csa)) { if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("NUMERIC INSTABILITY; SEARCH TERMINATED\n"); status = 4; break; } } /* restore the best point */ if (status != 0) { for (j = 1; j <= n; j++) csa->x[j] = csa->best_x[j]; for (i = 1; i <= m; i++) csa->y[i] = csa->best_y[i]; for (j = 1; j <= n; j++) csa->z[j] = csa->best_z[j]; if (csa->parm->msg_lev >= GLP_MSG_ALL) xprintf("Best point %17.9e was reached on iteration %d\n", csa->best_obj, csa->best_iter); } /* return to the calling program */ return status; }
BOOL CALLBACK BasicInfoProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static RECT tab_rect; static PageCtrl p_Commodiy; static HINSTANCE hInstance; switch (msg) { case WM_INITDIALOG: { hInstance = (HINSTANCE)lParam; ShowCommodityTree(hwnd,IDC_TREE_COMMODITY); InitBasicInfoList(hwnd, IDC_BASIC_INFO); return TRUE; } case WM_NOTIFY: { switch(LOWORD(wParam)) { case IDC_TREE_COMMODITY: { if (((LPNMHDR)lParam)->code == NM_DBLCLK) { // 双击树形控件中的一项 TreeCtrl basic_info(hwnd, IDC_TREE_COMMODITY); HTREEITEM select = basic_info.GetSelectedItem(); if (!select) { // 为空,退出 break; } char current_item_text[512]; basic_info.GetItem(select, 512, current_item_text); HTREEITEM parent_node = basic_info.GetParent(select); if (parent_node) { // 显示次分类下商品信息 char parent_item_text[512]; basic_info.GetItem(parent_node, 512, parent_item_text); try { CCommodity commodity_info; commodity_info.GetCommodityNameSet(parent_item_text, current_item_text); CListView basic_list(hwnd, IDC_BASIC_INFO); basic_list.DeleteAllItems(); int i = 0; while (!commodity_info.IsEOF()) { basic_list.InsertItem(i, commodity_info.no()); basic_list.SetItem(i, 1, commodity_info.name()); basic_list.SetItem(i, 2, commodity_info.purchase_price()); basic_list.SetItem(i, 3, commodity_info.quantity()); basic_list.SetItem(i, 4, commodity_info.unit()); basic_list.SetItem(i, 5, commodity_info.sale_price()); basic_list.SetItem(i, 6, commodity_info.register_date()); i++; } } catch (Err &err) { MessageBox(hwnd, err.what(), TEXT("TABLE INFOR"), MB_ICONINFORMATION); return FALSE; } } else { // 显示主分类下商品信息 try { CCommodity commodity_info; commodity_info.GetCommodityNameSet(current_item_text); CListView basic_list(hwnd, IDC_BASIC_INFO); basic_list.DeleteAllItems(); int i = 0; while (!commodity_info.IsEOF()) { basic_list.InsertItem(i, commodity_info.no()); basic_list.SetItem(i, 1, commodity_info.name()); basic_list.SetItem(i, 2, commodity_info.purchase_price()); basic_list.SetItem(i, 3, commodity_info.quantity()); basic_list.SetItem(i, 4, commodity_info.unit()); basic_list.SetItem(i, 5, commodity_info.sale_price()); basic_list.SetItem(i, 6, commodity_info.register_date()); i++; } } catch (Err &err) { MessageBox(hwnd, err.what(), TEXT("TABLE INFOR"), MB_ICONINFORMATION); return FALSE; } } // end else } // end first if break; } } // end case IDC_TREE_COMMODITY return TRUE; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_BASIC_INFO_ADD://“添加”操作 { CommodityInfo commodity_info; commodity_info.menu_id = IDC_BASIC_INFO_ADD; DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_EDIT_COMMODITY),hwnd,EditCommodityProc, (long)&commodity_info); break; } case IDC_BASIC_INFO_MODIFY://“修改”操作 { CListView com_list; com_list.Initialization(hwnd,IDC_BASIC_INFO); int index=com_list.GetSelectionMark(); if(-1==index) { MessageBox(hwnd,TEXT("请选中列表中的一项!"),TEXT("提示!"), MB_ICONINFORMATION); } else { CommodityInfo commodity_info; commodity_info.menu_id = IDC_BASIC_INFO_MODIFY; GetCommodityInfoFromList(hwnd,commodity_info); DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_EDIT_COMMODITY), hwnd, \ EditCommodityProc, (long)&commodity_info); } break; } case IDC_BASIC_INFO_DELETE://"删除"操作 { try { if (MessageBox(hwnd,TEXT("将要进行删除操作,请确认是否删除?"),TEXT("删除确认"),MB_YESNO) ==IDYES) { CListView com_list; com_list.Initialization(hwnd,IDC_BASIC_INFO); int index=com_list.GetSelectionMark(); if(-1==index) { MessageBox(hwnd,TEXT("请选中列表中的一项!"),TEXT("提示!"), MB_ICONINFORMATION); } else { std::string com_no; com_no = com_list.GetItem(index,0); CCommodity commodity; commodity.DeleteCom(com_no); MessageBox(hwnd,TEXT("删除该商品信息成功"), TEXT("删除成功"), MB_ICONINFORMATION); } } } catch (Err &err) { MessageBox(hwnd,err.what(),TEXT("删除失败"),MB_ICONINFORMATION); } break; } case IDC_BASIC_EDIT_CATEGORY: { DialogBox(hInstance, MAKEINTRESOURCE(IDD_EDIT_COMMODITY_CATEGORY),hwnd,EditCategoryProc); ShowCommodityTree(hwnd,IDC_TREE_COMMODITY); break; } } return TRUE; } case WM_CLOSE: { EndDialog(hwnd, HIWORD(wParam)); return TRUE; } } return false; }